VBATips

「アルファベットから列番号/数値からアルファベット」相互変換【ExcelVBA】

パーツ化とは

ExcelVBAマクロ初級者からの脱却が、処理のパーツ化(プロシージャの分割)と考えています。
マクロを作る上で基本機能をパーツ化する事で、開発時間の削減に繋がります。
処理はパーツ単位で分ける事を心掛けましょう。

分かりやすく説明すると、エクセルの「関数」と同様です。
SUM関数であれば セル内に「=SUM(1+2+3)」と記載すれば、セルには「6」と表示されますよね。
値を渡せば正しい値で返ってくる動きです。

このコードをコピペでOK

'■列変換(数字→アルファベット、アルファベット→数字)
Public Function Call_ColConv(var As Variant) As Variant
    Dim temp As String
    
    If IsNumeric(var) = True Then
      '■数値の場合はAddress取得し、アルファベットのみを返す
      temp = Cells(1, CLng(var)).Address(RowAbsolute:=False, ColumnAbsolute:=False)
      Call_ColConv = Left(temp, Len(temp) - 1)
    Else
      '■アルファベットだったら行番号を返す
      Call_ColConv = Range(var & "1").Column
    End If
End Function

使い方

上記をコピペでお好きなモジュール内に記載してください。

     Dim temp as String

     temp = Call_ColConv("Z")→Z列の26列目の「26」が格納される。

     temp = Call_ColConv(26) →26列のZ列目の「Z」が格納される。

     temp = Call_ColConv("26")→間違って数値を文字列にしても正しく「Z」が格納される。

注意点

この関数はマクロ開発者には必須で覚えてもらいたいです。

使ってほしい理由

プログラムが開発者の独りよがりになるのも寂しいものです。
通常エクセルで列と言えばA列、B列、C列といったアルファベットで表記するケースが多いです。(例外としてR1C1形式はありますが、少数派でしょう)

せっかくエクセルを使用してプログラムを組むのであれば、ユーザー側にある程度操作できるようにするべきです。そもそもプログラムはある程度汎用性があるべきですが。)

例えば以下ケースの場合、「4.」がいいですよね。
工数でそんなことに時間をかけられない?事前にパーツ化しておけば流用可能じゃない?ってのが私の持論です。

例)ネットショップの売上をエクセルに取り込みしたい。現状の売上金額の列は「D列」だった。

  1. マクロのコード上でD列の処理する。
  2. D列を定数化してマクロで使用できるようにしておく。
  3. マクロファイルの設定値をワークシート上に作成し、列番号を入力してもらう。
  4. マクロファイルの設定値をワークシート上に作成し、該当する列のアルファベットを入力してもらう。

プログラムは作ったら終わりではありません。作成完了してからユーザーとの共同作業のスタートです。ネットショップは特にフォーマットが変わる事が多く、ある程度汎用性を持たせておくことで今後の改修作業の手間を減らします。(改修作業を都度行い、費用を請求したいという考えはもう古い気がします。)

どんな時に使える?

  • ネットショップからの売上データをダウンロードして、発注書を作成する。
    →フォーマットが変わる事も多いので、マクロワークブック内で設定をユーザーに設定してもらうようにしましょう。ユーザーが使いやすいようにアルファベット表記でやり取りしましょう。

コメント

タイトルとURLをコピーしました