C++でExcelシートの列タイトル(列名)を求める方法
問題の概要
正の整数が与えられたとき、その数に対応するExcelシート上の列タイトル(列名)を求めることを考えます。対応関係は次のとおりです。
[1 : A]、[2 : B]、[26 : Z]、[27 : AA]、[28 : AB] …
たとえば、入力が28であれば、出力は「AB」となります。
解法のアプローチ
この問題は一見すると単純な26進法への変換のように思えますが、Excelの列名には「0」に相当する文字が存在しない点が重要なポイントです。つまり、これは通常の26進法ではなく、1〜26を1桁として扱う特殊な記数法(バイジェクティブ26進法)になっています。
そこで、各桁を求める前に必ずnから1を引くことで、1〜26の範囲を0〜25にずらして処理します。具体的な手順は以下のとおりです。
- nが0になるまで、次の処理を繰り返します。
- n := n − 1
- res := res + (n mod 26) + 'A' のASCIIコード
- n := n ÷ 26
- res を反転させる
- res を返す
実装例
理解を深めるために、以下のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string convertToTitle(int n) {
string res;
while(n){
res += (--n)%26 + 'A';
n /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};
main(){
Solution ob;
cout << (ob.convertToTitle(30));
}
動作の流れ
入力が30の場合の処理の流れを確認してみます。
- 1回目:n = 30 → 29に減算 → 29 mod 26 = 3 → 「D」を追加、n = 29 ÷ 26 = 1
- 2回目:n = 1 → 0に減算 → 0 mod 26 = 0 → 「A」を追加、n = 0 ÷ 26 = 0
この時点でresは「DA」ですが、下位の桁から順に追加されているため、最後に反転して「AD」を返します。
入力
30
出力
AD
-
Excelで列の値を基準にシートを複数のシートへ分割する5つの方法
列の値を基準にExcelシートを複数のシートに分割したいとお探しの方に、この記事が役立ちます。 大量のデータを特定の列ごとに分割し、メインシートを分けた後にそれぞれのシートで作業を行いたい場面は少なくありません。この作業を効率的に行うための方法を、詳しく見ていきましょう。 ワークブックのダウンロード この記事で使用するサンプルファイルは、以下からダウンロードできます。 列の値を基準にExcelシートを複数のシートに分割する5つの方法 ここでは、ある大学の学生の成績結果を含む次のようなデータテーブルを使用します。「Student Name(学生名)」列を基準に、3名の学生ごとのシートへ分割し
-
Excelで列全体に日付ピッカーを設定する方法【VBAマクロ活用】
日付ピッカー(Date Picker)は、Microsoft Excelの便利なツールの一つです。各セルに日付を一つずつ手入力するという単調な作業から解放され、ポップアップ表示されるカレンダーから日付を選択して入力できるようになります。このチュートリアルでは、Excel日付ピッカーの挿入方法と、列全体へ適用する方法について詳しく解説します。 Excelの日付ピッカーとは? Excel日付ピッカーは、Microsoft Excelに搭載されている機能の一つで、カレンダーをポップアップ表示し、そこから簡単に日付を選択できるようにするものです。この機能は32ビット版のExcel 365、Excel