カテゴリー
未分類

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

【目次】
 1.「Range」で指定する行の範囲(文字列)を作る関数
 2.「Range」で指定する列の範囲(文字列)を作る関数

1.「Range」で指定する行の範囲(文字
  列)を作る関数

通常、「Range」で行を指定する場合、”1:9″ のように指定行を数字とコロン(:)を組み合わせた文字列で与える必要があります。

(例.1~9行目に空行を挿入する)
        Sheets(“Sheet1”).Range(“1:9”).Insert

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

'===========================
' 関数名:MakeRowRange
' 引数 :
' ①row1: 行番号1 (Long型)
' ②row2:行番号2(Long型)
' 戻り値:正常時:開始行と終了行の文字列(例."2:5")(String型)
'    :異常時:"ERR"
'===========================
Function MakeRowRange(row1 As Long, row2 As Long) As String
    'ローカル変数の宣言
    Dim ret As String       '戻り値

    'ローカル変数の初期化
    ret = "ERR"

    '入力値の範囲判定
    If row1 >= 1 And row1 <= 1048576 And row2 >= 1 And row2 <= 1048576 Then
        '行情報から文字列を作成
        ret = CStr(row1) & ":" & CStr(row2)
    Else
        MsgBox "1~1048576の範囲で入力して下さい" & vbCrLf & "入力値:開始行:" & row1 & " , 終了行:" & row2
    End If

    MakeRowRange = ret
End Function

2.「Range」で指定する列の範囲(文字
  列)を作る関数

通常、「Range」で列を指定する場合、”A:Z” のように指定列をアルファベットとコロン(:)を組み合わせた文字列で与える必要があります。

(例.1~9行目に空行を挿入する)
        Sheets(“Sheet1”).Range(“1:9”).Insert

しかし、マクロで列番号(数字)を使ってセル操作をする場合、このセルの指定方法は不便なので、列番号(数字)から “A:Z” のような文字列を取得する関数を作ってみました。
(要領は「エクセルマクロで~②」と同じです)

'===========================
' 関数名:MakeColumnRange
' 引数 :
' ①col1: 列番号1 (Long型)
' ②col2:列番号2(Long型)
' 戻り値:正常時:開始列と終了列の文字列(例."C:F")(String型)
'    :異常時:"ERR"
'===========================
Function MakeColumnRange(col1 As Long, col2 As Long) As String
    'ローカル変数の宣言
    Dim col_array(2) As Long        '列情報
    Dim col_str_array(2) As String  '列情報
    Dim tmp_num1 As Long            '途中計算の一時変数1
    Dim tmp_num2 As Long            '途中計算の一時変数2
    Dim tmp_num3 As Long            '途中計算の一時変数3
    Dim err_array(2) As Boolean     '入力値判定結果
    Dim loop_cnt As Long            'ループカウンタ
    Dim ret As String               '戻り値

    'ローカル変数の初期化
    col_array(1) = col1
    col_array(2) = col2
    col_str_array(1) = ""
    col_str_array(2) = ""
    tmp_num1 = -1
    tmp_num2 = -1
    tmp_num3 = -1
    err_array(1) = True
    err_array(2) = True
    ret = "ERR"

    '列情報を文字列に変換
    For loop_cnt = 1 To 2
        If col_array(loop_cnt) >= 1 And col_array(loop_cnt) <= 16384 Then           'A~XFD列'
            err_array(loop_cnt) = False
            If col_array(loop_cnt) >= 1 And col_array(loop_cnt) <= 26 Then          'A~Z列'
                col_str_array(loop_cnt) = Chr(Asc("A") + col_array(loop_cnt) - 1)
            ElseIf col_array(loop_cnt) >= 27 And col_array(loop_cnt) <= 702 Then    'AA~ZZ列'
                tmp_num1 = Int((col_array(loop_cnt) - 26 - 1) / 26)
                tmp_num2 = (col_array(loop_cnt) - 1) Mod 26
            col_str_array(loop_cnt) = Chr(Asc("A") + tmp_num1) & Chr(Asc("A") + tmp_num2)
            Else                                    'AAA~XFD列'
                tmp_num1 = Int((col_array(loop_cnt) - 702 - 1) / (26 ^ 2))
                tmp_num2 = Int((col_array(loop_cnt) - 702 - 1 - tmp_num1 * (26 ^ 2)) / 26)
                tmp_num3 = (col_array(loop_cnt) - 1) Mod 26
            col_str_array(loop_cnt) = Chr(Asc("A") + tmp_num1) & Chr(Asc("A") + tmp_num2) & Chr(Asc("A") + tmp_num3)
            End If
        End If
    Next

    '入力値が正常範囲内の場合、正常な戻り値を設定する
    If err_array(1) = False And err_array(2) = False Then
        ret = col_str_array(1) & ":" & col_str_array(2)
    Else    '入力値が範囲外の場合、エラーとする
        MsgBox "1~16384の範囲で入力して下さい" & vbCrLf & "入力値:開始列:" & col1 & " , 終了列:" & col2
    End If

    MakeColumnRange = ret
End Function

参考になれば幸いです。

アバター

作成者: 246riser

神奈川県在住、会社員、2児の父
技術ブログ(エクセルマクロの覚書き)、趣味ブログ(英語学習、バドミントン)、アラフォー男子の育児ブログなど、思いつきをただブログに羅列していきたいと思います。(ただの日記です)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です