Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2566 / 13646 ツリー ←次へ | 前へ→

【67163】任意の配列変数に格納された値を合計して表示したい。 リス 10/11/12(金) 19:13 質問[未読]
【67164】Re:任意の配列変数に格納された値を合計し... kanabun 10/11/12(金) 19:51 発言[未読]
【67165】Re:任意の配列変数に格納された値を合計し... kanabun 10/11/12(金) 20:00 発言[未読]
【67166】Re:任意の配列変数に格納された値を合計し... Hirofumi 10/11/12(金) 20:33 回答[未読]
【67167】お礼 Kanabun様 Hirofumi様 リス 10/11/12(金) 21:59 お礼[未読]
【67173】Re:お礼 Kanabun様 Hirofumi様 kanabun 10/11/14(日) 0:29 発言[未読]
【67209】Re:お礼 Kanabun様 Hirofumi様 リス 10/11/15(月) 22:24 お礼[未読]

【67163】任意の配列変数に格納された値を合計して...
質問  リス  - 10/11/12(金) 19:13 -

引用なし
パスワード
   環境:Windows XP Home Edition EXCEL 2003

いつもお世話になっております。

A列(商品個数)とB列(商品重量:少数を含む場合も有り)に
任意の数値データが入っている表があります。

 |A| |B| 
1項目1 項目2     
2|1||2| 
3|3||2| 
4|4||2|
5|1||2|

配列変数 a を宣言しています。

配列変数のインデックス番号(要素数)は
項目行を除いて、2(行目)から
別途取得した lastrow 行目までの行数を
それぞれ指定しています。

各配列には、
インデックス番号と同等の行番号の
A列の値 x B列の値 を格納しています。

例:a(2) なら = A2セル x B2セル が格納されています。

やりたい事(コードの書き方が分からない部分)は
任意の開始行を 変数 = x行  
任意の終了行を 変数 = y行
(x,yはループの中で都度変わっていく数値)

とされた時に

それに対応する形の
配列変数 a(x)行 から a(y) 行までに含まれる
セルの値の数を合計したいのです。

例で説明しますと

 |A||B| 配列変数
1項目1 項目2     
2|1||2| a(2) = A2 x B2 = 2
3|3||2| a(3) = A3 x B3 = 6
4|4||2| a(4) = A4 x B4 = 8
5|1||2| a(5) = A5 x B5 = 2

この状態から例えば 変数 x : 3 変数 y : 5 と

なった場合に

配列 a(3)からa(5)に格納されている値
6と8と2 を合計して、 “16です”と
メッセージボックスで表示したいのです。

恐れ入りますが、どなたかお助け頂ければ幸いです。

【67164】Re:任意の配列変数に格納された値を合計...
発言  kanabun  - 10/11/12(金) 19:51 -

引用なし
パスワード
   ▼リス さん:

>配列 a(3)からa(5)に格納されている値
>6と8と2 を合計して、 “16です”と
>メッセージボックスで表示したいのです。

ここだけなら、

 Dim i As Long
 Dim Sum As Long
 Const x = 3
 Const y = 5

 For i = x To y
  Sum = Sum + a(i)
 Next
 MsgBox Sum & "です"

となるんでしょうけど、
前段のセルの位置関係が背景にあるから
むつかしく考えすぎてるのかな?

【67165】Re:任意の配列変数に格納された値を合計...
発言  kanabun  - 10/11/12(金) 20:00 -

引用なし
パスワード
   ▼リス さん:

蛇足ですけど、
>
> |A| |B| 
>1項目1 項目2     
>2|1||2| 
>3|3||2| 
>4|4||2|
>5|1||2|
>
3行目から5行目までの A,B列の積和は
数式でいうと

 =SUMPRODUCT(A3:A5,B3:B5)

でしたよね?

【67166】Re:任意の配列変数に格納された値を合計...
回答  Hirofumi  - 10/11/12(金) 20:33 -

引用なし
パスワード
   こんなのでは

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

【67167】お礼 Kanabun様 Hirofumi様
お礼  リス  - 10/11/12(金) 21:59 -

引用なし
パスワード
   Kanabun様 Hirofumi様

お世話になります。

お忙しい所ご指導頂き誠にありがとうございました。
明日出勤ですので、お二人にご教示頂いた方法を
早速試してみます。

本当にありがとうございました。
リス


【67173】Re:お礼 Kanabun様 Hirofumi様
発言  kanabun  - 10/11/14(日) 0:29 -

引用なし
パスワード
   ▼リス さん:

どうも 配列a() の利用方法がよくわかりません。
ちょっとくどいのですが、

> この状態から例えば 変数 x : 3 変数 y : 5 と
> なった場合に

   A3 x B3
+) A4 x B4
+) A5 x B5
--------------
     16

> 6と8と2 を合計して、 “16です”と
> メッセージボックスで表示したいのです。

なら、

Sub TestSumProduct()
  Const x = 3, y = 5
  Dim r As Range
  
  Set r = Range("A" & x & ":A" & y)
  MsgBox WorksheetFunction.SumProduct(r, r.Offset(, 1))
End Sub

でいいと思うんですけど?

【67209】Re:お礼 Kanabun様 Hirofumi様
お礼  リス  - 10/11/15(月) 22:24 -

引用なし
パスワード
   kanabun 様

>ちょっとくどいのですが、
とんでもございません。
大変勉強になります。素人考えで無駄に配列変数を
使っていたようです。ご教示頂いたコードを参考に
配列変数無しで再トライしてみます。

重ねて御礼申し上げます。ありがとうございました。

リス

2566 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free