カテゴリー
エクセルマクロ

エクセルマクロで使える関数を作ってみた②

【目次】
  1.「Range」で指定するセルの内容を、行情報と列情報
   から作成する関数

1.「Range」で指定するセルの内容を、行情報と列情報から作成する関数

通常、「Range」を使う場合、”A1″ のようにアルファベットと数字を組み合わせたセル指定をする必要があります。

(例.指定セル「A1」の文字色を青色に設定する)
        Sheets(“Sheet1”).Range(“A1”).Font.Color = RGB(0, 0, 255)

しかし、マクロで行番号と列番号を使ってセル操作をする場合、このセルの指定方法は不便なので、行番号と列番号から “A1” のようなセル位置を取得する関数を作ってみました。

‘===========================
‘ 関数名:MakeCellID
‘ 引数 :
‘ ①row: 行番号 (Long型)
‘ ②col:列番号(Long型)
‘ 戻り値:正常時:セルID(例.”A1″)(String型)
‘ :異常時:”ERR”
‘===========================
Function MakeCellID(row As Long, col As Long) As String

    ‘ローカル変数の宣言
    Dim row_id As String ‘行情報
    Dim col_id As String ‘列情報
    Dim tmp_num1 As Long ‘途中計算の一時変数1
    Dim tmp_num2 As Long ‘途中計算の一時変数2
    Dim tmp_num3 As Long ‘途中計算の一時変数3
    Dim err As Boolean ‘入力値判定結果
    Dim ret As String ‘戻り値

    ‘ローカル変数の初期化
    row_id = “”
    col_id = “”
    tmp_num1 = -1
    tmp_num2 = -1
    tmp_num3 = -1
    err = True
    ret = “ERR”

    ‘行情報を文字列に変換
    row_id = CStr(row)

    ‘列情報を文字列に変換
    If col >= 1 And col <= 16384 Then ‘A~XFD列
        err = False
        If col >= 1 And col <= 26 Then ‘A~Z列
            col_id = Chr(Asc(“A”) + col – 1)
        ElseIf col >= 27 And col <= 702 Then ‘AA~ZZ列
            tmp_num1 = Int((col – 26 – 1) / 26)
            tmp_num2 = (col – 1) Mod 26
            col_id = Chr(Asc(“A”) + tmp_num1) & Chr(Asc(“A”) + tmp_num2)
        Else ‘AAA~XFD列
            tmp_num1 = Int((col – 702 – 1) / (26 ^ 2))
            tmp_num2 = Int((col – 702 – 1 – tmp_num1 * (26 ^ 2)) / 26)
            tmp_num3 = (col – 1) Mod 26
            col_id = Chr(Asc(“A”) + tmp_num1) & Chr(Asc(“A”) + tmp_num2) & Chr(Asc(“A”) + tmp_num3)
        End If
    Else ‘入力値が範囲外の場合、エラーとする
        MsgBox “1~16384の範囲で入力して下さい” & vbCrLf & “入力値:行:” & row & ” , 列:” & col
    End If

    ‘入力値が正常範囲内の場合、正常な戻り値を設定する
    If err = False Then
        ret = col_id & row_id
    End If

    MakeCellID = ret
End Function

■■追記■■
よく調べてみると、上記のような変換をしなくても、RangeにCells、Rows、Columnsを組み合わせることで行情報と列情報からセルを指定することができることが分かりました。何か活用方法を思いついたら、また書きたいと思います。

参考になれば幸いです。