kinacco
6/9/2016 - 2:24 PM

【excel vba】指定範囲のデータをVariant変数の配列で返す

【excel vba】指定範囲のデータをVariant変数の配列で返す

'**************************************************
'名称 :F_GetArrayRange 指定範囲のデータを配列で返す
'引数 :robjSheet      (I ) Worksheet
'   :vlRowMax       (I ) Long:行番号To
'   :vlColMax       (I ) Long:列番号To
'   :vlRowMin       (I ) Long:行番号From
'   :vlColMin       (I ) Long:列番号From
'   :rvReturn       ( O) Variant:(返却用)配列
'   :rsMsg          ( O) String:エラーメッセージ
'戻り値:True=成功, False=どこかでエラーになった
'作成 :Kinaccco
'**************************************************
Public Function F_GetArrayRange(ByRef robjSheet As Worksheet _
                              , ByVal vlRowMax As Long _
                              , ByVal vlColMax As Long _
                     , Optional ByVal vlRowMin As Long = 1 _
                     , Optional ByVal vlColMin As Long = 1 _
                     , Optional ByRef rvReturn As Variant = "" _
                     , Optional ByRef rsMsg As String = "") As Boolean
On Error GoTo Sub_Err
Dim lbRet           As Boolean
Dim llRowsCount     As Long
Dim llColumnsCount  As Long
Dim lvArray         As Variant

    '--- 初期値セット ---
    lbRet = False
    rsMsg = ""
    
    '--- パラメータチェック ---
    If robjSheet Is Nothing Then
        rsMsg = "[ERR-01]Worksheet参照の受け渡しに失敗しました"
        GoTo Sub_Exit
    End If
    If vlRowMax <= 0 Then
        rsMsg = "[ERR-02]範囲最終行の受け渡しに失敗しました"
        GoTo Sub_Exit
    End If
    If vlColMax <= 0 Then
        rsMsg = "[ERR-03]範囲最終列の受け渡しに失敗しました"
        GoTo Sub_Exit
    End If
    If vlRowMin <= 0 Then
        rsMsg = "[ERR-04]範囲先頭行の受け渡しに失敗しました"
        GoTo Sub_Exit
    End If
    If vlColMin <= 0 Then
        rsMsg = "[ERR-05]範囲先頭列の受け渡しに失敗しました"
        GoTo Sub_Exit
    End If
    
    '--- シートの最大行・列を取得する ---
    With robjSheet
        llRowsCount = .Rows.Count
        llColumnsCount = .Columns.Count
    End With
    
    '--- 行・列番号チェック ---
    If vlRowMin > llRowsCount Then
        rsMsg = "範囲先頭行の値が正しくありません(" & CStr(llRowsCount) & "を超える)"
        GoTo Sub_Exit
    End If
    If vlRowMax > llRowsCount Then
        rsMsg = "範囲最終行の値が正しくありません(" & CStr(llRowsCount) & "を超える)"
        GoTo Sub_Exit
    End If
    If vlColMin > llColumnsCount Then
        rsMsg = "範囲先頭列の値が正しくありません(" & CStr(llColumnsCount) & "を超える)"
        GoTo Sub_Exit
    End If
    If vlColMax > llColumnsCount Then
        rsMsg = "範囲最終行の値が正しくありません(" & CStr(llColumnsCount) & "を超える)"
        GoTo Sub_Exit
    End If
    
    '--- 指定範囲の値を取得する ---
    With robjSheet
        lvArray = .Range(.Cells(vlRowMin, vlColMin), .Cells(vlRowMax, vlColMax))
    End With
    If IsArray(lvArray) = False Then GoTo Sub_Exit
    
    '--- 返却用変数に格納する ---
    rvReturn = lvArray
    
    '--- 正常終了 ---
    lbRet = True

Sub_Exit:
On Error Resume Next

    F_GetArrayRange = lbRet
        
    Exit Function

Sub_Err:
    rsMsg = "予期せぬエラーが発生しました" & vbCrLf & _
        "プロシージャ名:F_GetArrayRange" & vbCrLf & _
        "エラー番号:" & Err.Number & vbCrLf & _
        "エラー内容:" & Err.Description
    GoTo Sub_Exit

End Function