Excel VBA質問箱 IV

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

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


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

【68944】配列変数定義の利用方法 マエ/ケン 11/5/1(日) 16:25 質問[未読]
【68945】Re:配列変数定義の利用方法 sasa 11/5/1(日) 18:32 回答[未読]
【68946】Re:配列変数定義の利用方法 マエ/ケン 11/5/1(日) 19:39 質問[未読]
【68949】Re:配列変数定義の利用方法 sasa 11/5/2(月) 1:33 回答[未読]
【68948】Re:配列変数定義の利用方法 UO3 11/5/1(日) 20:59 発言[未読]
【68957】Re:配列変数定義の利用方法 neptune 11/5/2(月) 16:06 発言[未読]
【68958】Re:配列変数定義の利用方法 マエ/ケン 11/5/2(月) 16:46 質問[未読]
【68963】Re:配列変数定義の利用方法 neptune 11/5/2(月) 23:14 発言[未読]

【68944】配列変数定義の利用方法
質問  マエ/ケン  - 11/5/1(日) 16:25 -

引用なし
パスワード
   こんにちは。

ExcelのVBAを勉強しています。分からないことがあって、
よろしくお願いします。

値の表示範囲:B3:D7
       Dim X(5, 3)
合計表示範囲:B8:D8
       wa(1)、wa(2)、wa(3)
のような条件に合わせて、計算用のVBAを組みました。

実際問題として、値の表示範囲/合計表示範囲、それぞれ
変数で表す時、以下のVBAコードをどのように修正すれば
いいでしょうか?
ご伝授ください。

行:開始行=I1、終了行=I2
列:開始列=J1、終了列=J2
合計:(I2+1,J1),(I2+1,・・),(I2+1,J2)

難点1:Dimの変数定義は分からない。
難点2:以下の計算仕組みとして、1.〜4.以外の方法は
    ありますか?

--------------------------------------------------------------
Sub Sample()

'Dimを使って配列を宣言して、Cell(3,2)を計算の基準位置とする
Dim X(5, 3) As Double, wa(3) As Double
Cells(3, 2).Select

'1.=For文を使って、配列の各成分定義
For i = 1 To 5
  For j = 1 To 3
  X(i, j) = Selection.Cells(i, j)
  Next j
Next i

'2.=合計値をゼロにセットする
For j = 1 To 3
  wa(j) = 0
Next j

'3.=各列の和wa(1),wa(2),wa(3)に初期値代入
For i = 1 To 5
  For j = 1 To 3
    wa(j) = wa(j) + X(i, j)
  Next j
Next i


'4.=最後、各列の和表示
For j = 1 To 3
  Selection.Cells(7, j) = wa(j)
Next j


End Sub
--------------------------------------------------------------

【68945】Re:配列変数定義の利用方法
回答  sasa  - 11/5/1(日) 18:32 -

引用なし
パスワード
   >難点1:Dimの変数定義は分からない。

変数のデータ型は Variant にすべきでしょう。
具体例は以下コード。

>難点2:以下の計算仕組みとして、1.〜4.以外の方法は
>    ありますか?

通常次のようなコードになると思います。
Sub Sample1()
 Dim rg1 As Range, rg2 As Range, xx&, yy&
 Dim d1 As Variant, d2 As Variant
 Set rg1 = Range("b3:d7") 'データのレンジ指定
 Set rg2 = Range("b8:d8") '答えのレンジ指定
 '1.配列の各成分定義
 d1 = rg1
 '2.=合計値をゼロにセットする
 rg2.ClearContents
 d2 = rg2  '配列へセル値を代入
 '3.=各列の和を計算代入
 For yy = 1 To UBound(d1)   '行のループ
  For xx = 1 To UBound(d1, 2) '列のループ
   d2(1, xx) = d2(1, xx) + d1(yy, xx)
  Next
 Next
 '4.=最後、各列の和表示
 rg2 = d2 '配列からセルへ書戻し
End Sub

こちらを参考にしました。
ht tp://www2.aqua-r.tepm.jp/~kmado/kvba.htm
E95M007 シートのセルに変数2次元配列で高速にアクセスする

【68946】Re:配列変数定義の利用方法
質問  マエ/ケン  - 11/5/1(日) 19:39 -

引用なし
パスワード
   sasaさん

ありがとうございます。

僕の説明は足りなかったと思います。任意のデータ範囲で適用したくて、

開始行、終了行、開始列、終了列の引数を使うには、どのように処理すれば

いいでしょうか?

Set rg1 = Range("b3:d7") 'データのレンジ指定
         ↑b3:d7→開始行=3、終了行=7, 開始列=2、終了列=4
          を表す。動的配列で考えた場合は、たとえば
          任意の範囲==>行:開始行=I1、終了行=I2
                  列:開始列=J1、終了列=J2
                    I1、I2、J1、J2を利用したい。
Set rg2 = Range("b8:d8") '答えのレンジ指定
         ↑上と同様、I2、J1、J2を利用したい。

【68948】Re:配列変数定義の利用方法
発言  UO3  - 11/5/1(日) 20:59 -

引用なし
パスワード
   ▼マエ/ケン さん:

テーマに関してはsasaさんにおまかせして、別のことを。

配列宣言を、たとえば Dim X(5, 3) としておられます。
この配列は、領域B3:D7に対応するものだと思います。
行としては3〜7の5行、列はB〜Dの3列ということを想定してこの宣言になっているわけですが
この配列宣言は「Lbound」が省略された形というのは認識されていらっしゃいますか?
で、LBoundは、Option Base 規定がない限り(普通は書かないとおもいます)0。
つまり、この配列宣言は
Dim X(0 To 5,0 To 3) と、「6行4列」の配列になります。
このように宣言しても、配列の0行目、0列目を使わなければ問題ないといえば問題ないのですが
配列宣言は、以下のように必ずLBoundも明示的に宣言することをお勧めします。

Dim X(1 to 5,1 To 3)

【68949】Re:配列変数定義の利用方法
回答  sasa  - 11/5/2(月) 1:33 -

引用なし
パスワード
   >僕の説明は足りなかったと思います。任意のデータ範囲で適用したくて、
>開始行、終了行、開始列、終了列の引数を使うには、どのように処理すれば
>いいでしょうか?

別に説明は足りていますが、↑は配列の利用とは別問題で、
データ範囲の指定はどのようにでもRangeオブジェクトで与えればいい事です。
例えば、
 Dim i1&, i2&, j1&, j2&
 i1 = 3: i2 = 7: j1 = 2: j2 = 4 '与える範囲データ
 Set rg1 = Range(Cells(i1, j1), Cells(i2, j2))
 Set rg2 = Range(Cells(i2 + 1, j1), Cells(i2 + 1, j2))
とか...

でも、このような指定はCellsの多用でいかにも初心者向けで分かりにくくありませんか?
ある程度上級者なら、B3を起点に5行・3列みたいに指定すると思います。
 Dim rg As Range, rr&, cc&
 Set rg = Range("b3"): rr = 5: cc = 3 '与える範囲データ
 Set rg1 = rg.Resize(rr, cc)
 Set rg2 = rg.Offset(rr).Resize(, cc)

【68957】Re:配列変数定義の利用方法
発言  neptune  - 11/5/2(月) 16:06 -

引用なし
パスワード
   ▼マエ/ケン さん:
>実際問題として、値の表示範囲/合計表示範囲、それぞれ変数で表す
その目的はなんでしょう?

・引数有のプロシージャ、関数化したい?
・少々面倒でも後でメンテナンスし易いように可読性を良くしたい。?
・それともただ単にやってみたい
・その他沢山理由があると思う。

理由によって手法のアドバイスが変わってきますよ。
回答者の皆さんの為にも理由を書いた方が良いですね。

ただ変数にするだけでもよし、collectionを使っても良いし、
classを使っても良いし、構造体で済むならそれも良し。

セルが決まっているようなら、ただ、配列変数を宣言しておいて、
後で代入しても良いし。

【68958】Re:配列変数定義の利用方法
質問  マエ/ケン  - 11/5/2(月) 16:46 -

引用なし
パスワード
   ありがとうございます。

やろうとしていることはうまく説明ができなくて、すいません。
やりたいのは、
>・引数有のプロシージャ、関数化したい?
>・少々面倒でも後でメンテナンスし易いように可読性を良くしたい。?

これはやりたいことです。

【68963】Re:配列変数定義の利用方法
発言  neptune  - 11/5/2(月) 23:14 -

引用なし
パスワード
   ▼マエ/ケン さん:
う〜ん

>やりたいのは、
>>・引数有のプロシージャ、関数化したい?
>>・少々面倒でも後でメンテナンスし易いように可読性を良くしたい。?
>
>これはやりたいことです。

簡単なサンプル書こうかなと思いましたけど、
最初にアップしているコードを元にすると、既に回答が付けられてるような
方法が簡単と思います。

・・・十分簡単なので可読性をいうほどでないと思うし、別プロシージャに
するほどでもない(勿論しても良い)。。。

ただ、汎用性を言うと他の変動要因が判らないので何とも言えないので、
元のコードに対して書いてもなぁとも思うし。

多分現実の問題とは遠く関係ないかもしれないので。。。。他の問題も
出てきそうな。?

という事でサンプルソースはパスします。m(_ _)m

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