| 
    
     |  | こんなのでは 
 Option Explicit
 
 Public Sub Sample_1()
 
 Dim i As Long
 Dim lngRows As Long
 Dim rngList As Range
 Dim a() As Variant
 Dim vntData() As Variant
 Dim vntResult As Variant
 Dim vntStart As Variant
 Dim vntEnd As Variant
 Dim strProm As String
 
 'Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
 Set rngList = ActiveSheet.Range("A1")
 
 With rngList
 '行数の取得
 lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
 If lngRows <= 0 Then
 strProm = "データが有りません"
 GoTo Wayout
 End If
 'A、B列データを配列に取得
 vntData = .Offset(1).Resize(lngRows, 2).Value
 '数量×重量の配列を確保
 ReDim a(.Row + 1 To .Row + lngRows)
 '数量×重量を計算
 For i = 1 To lngRows
 a(i + .Row) = vntData(i, 1) * vntData(i, 2)
 Next i
 End With
 
 '集計開始行取得
 vntStart = Application.InputBox(Prompt:="集計開始行を入力して下さい", _
 Default:=LBound(a), Type:=1)
 If VarType(vntStart) = vbBoolean Then
 strProm = "マクロがキャンセルされました"
 GoTo Wayout
 Else
 '集計開始行が範囲外なら
 If vntStart < LBound(a) Or UBound(a) < vntStart Then
 strProm = "集計開始行が範囲から外れて居ます"
 GoTo Wayout
 End If
 End If
 
 '集計終了行取得
 vntEnd = Application.InputBox(Prompt:="集計終了行行を入力して下さい", _
 Default:=UBound(a), Type:=1)
 If VarType(vntEnd) = vbBoolean Then
 strProm = "マクロがキャンセルされました"
 GoTo Wayout
 Else
 '集計終了行が範囲外なら
 If vntEnd < LBound(a) Or UBound(a) < vntEnd Then
 strProm = "集計終了行が範囲から外れて居ます"
 GoTo Wayout
 End If
 End If
 
 '開始行が終了行より大きかったら
 If vntStart > vntEnd Then
 strProm = "'開始行が終了行より大ので集計出来ません"
 GoTo Wayout
 End If
 
 'Key列に就いて繰り返し
 For i = vntStart To vntEnd
 vntResult = vntResult + a(i)
 Next i
 
 strProm = "集計結果は、" & vntResult
 
 Wayout:
 
 Set rngList = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 |  |