Excel VBA質問箱 IV

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

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


10081 / 13644 ツリー ←次へ | 前へ→

【23802】2次元配列を引数にするには? 森イチロー 05/4/4(月) 20:40 お礼[未読]
【23812】Re:2次元配列を引数にするには? ちゃっぴ 05/4/4(月) 23:33 回答[未読]
【23818】Re:2次元配列を引数にするには? ウッシ 05/4/5(火) 0:23 回答[未読]
【23820】Re:2次元配列を引数にするには? 森イチロー 05/4/5(火) 0:43 回答[未読]
【23819】Re:2次元配列を引数にするには? 森イチロー 05/4/5(火) 0:37 回答[未読]
【23821】Re:2次元配列を引数にするには? ちゃっぴ 05/4/5(火) 0:55 発言[未読]
【23822】Re:2次元配列を引数にするには? ウッシ 05/4/5(火) 8:34 回答[未読]
【23823】Re:2次元配列を引数にするには? Kein 05/4/5(火) 9:31 発言[未読]

【23802】2次元配列を引数にするには?
お礼  森イチロー  - 05/4/4(月) 20:40 -

引用なし
パスワード
    Cだと出来るのでVBAでも出来ないかと思っているのですが、
以下のようにtestの中で1次元配列を引数にするSubを作り、
mainで2次元配列を引数として渡したい(a(i,)を1次元配列
に見立てたい)と考えています。

 ざっと探したところなぜか見当たらないので、もしかしたら
できないのかな、と思っているのですが、仮に出来ないとしても
何かいい方法はありますでしょうか。


Sub test(ByRef a() As Double)
  Dim i As Integer
  
  For i = 0 To UBound(a)
    a(i) = i * 2
  Next
End Sub

Sub main()
  Dim a(10, 20) As Double
  Dim i As Integer
  
  For i = 0 To UBound(a, 1)
    Call test(a(i,***))
  Next
End Sub

【23812】Re:2次元配列を引数にするには?
回答  ちゃっぴ  - 05/4/4(月) 23:33 -

引用なし
パスワード
   >mainで2次元配列を引数として渡したい(a(i,)を1次元配列
>に見立てたい)と考えています。

2次元配列で渡したのでは、いけないのですか?
処理をざっと見たところ、1次元配列に落とすだけ
無駄な処理のように思えますが・・・

【23818】Re:2次元配列を引数にするには?
回答  ウッシ  - 05/4/5(火) 0:23 -

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

何をしたいのか理解出来ません。
多分、的外れです。

Sub test(ByRef a() As Double, i As Integer)
  Dim j As Integer
  
  For j = 0 To UBound(a, 2)
    a(i, j) = j * 2
  Next
  
End Sub

Sub main()
  Dim a(10, 20) As Double
  Dim i As Integer
  
  For i = 0 To UBound(a, 1)
    Call test(a, i)
  Next
End Sub

Sub test1(ByRef a() As Double, i As Integer)
  Dim j As Integer
  
  For j = 0 To UBound(a, 1)
    a(j, i) = j * 2
  Next
  
End Sub

Sub main1()
  Dim a(10, 20) As Double
  Dim i As Integer
  
  For i = 0 To UBound(a, 2)
    Call test1(a, i)
  Next
End Sub

【23819】Re:2次元配列を引数にするには?
回答  森イチロー  - 05/4/5(火) 0:37 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>>mainで2次元配列を引数として渡したい(a(i,)を1次元配列
>>に見立てたい)と考えています。
>
>2次元配列で渡したのでは、いけないのですか?
>処理をざっと見たところ、1次元配列に落とすだけ
>無駄な処理のように思えますが・・・

サンプルが適当に書いたものだったので分かりにくくてすみません。

本来のプログラムでは、1次元配列を渡す関数が既にあり、同じ
関数を使って2次元配列を引数にしたかったんです。

例えば、ベクトル(1次元配列)を引数にしてその要素の和を返す
関数があるとき、”ベクトルの配列”(2次元配列)に対しても
それぞれに要素の和を返したい場合、最初から2次元を前提にした
関数で実際の中身は1次元とほとんど同じものを作るのだと保守性
が悪くなってしまうので、できれば同じ関数を使いたかったという
わけです。

サンプルは単に、2次元配列のa(i、j)のa(i,0)〜a(i,20)をai(20)
と見立てるようなやり方を知りたかった(C言語ではこれができ
ます)ので例に示した次第です。

【23820】Re:2次元配列を引数にするには?
回答  森イチロー  - 05/4/5(火) 0:43 -

引用なし
パスワード
   ▼ウッシ さん:
>こんばんは
>
>何をしたいのか理解出来ません。
>多分、的外れです。
>
>Sub test(ByRef a() As Double, i As Integer)
>  Dim j As Integer
>  
>  For j = 0 To UBound(a, 2)
>    a(i, j) = j * 2
>  Next
>  
>End Sub
>
>Sub main()
>  Dim a(10, 20) As Double
>  Dim i As Integer
>  
>  For i = 0 To UBound(a, 1)
>    Call test(a, i)
>  Next
>End Sub
>
>Sub test1(ByRef a() As Double, i As Integer)
>  Dim j As Integer
>  
>  For j = 0 To UBound(a, 1)
>    a(j, i) = j * 2
>  Next
>  
>End Sub
>
>Sub main1()
>  Dim a(10, 20) As Double
>  Dim i As Integer
>  
>  For i = 0 To UBound(a, 2)
>    Call test1(a, i)
>  Next
>End Sub

こんばんは。ありがとうございます。

的外れではなかったですが、このやり方は思いついてました。
ただ、これだと関数が引数としてiを持っていることを前提
にしなければなりませんし、Sub testの中のaは2次元配列
でないといけません。

分かりにくくて申し訳ないのですが、別の理由でtestに1次元
配列を入れるだけで同じ処理の関数が既にあり、2次元配列を
引数にして同じように関数が利用できないかと考えたわけです。

教えていただいたような方法ですと、同じ処理の関数を二つ作
ることになりますので、それを避けたいと思っているのですが・・・。

【23821】Re:2次元配列を引数にするには?
発言  ちゃっぴ  - 05/4/5(火) 0:55 -

引用なし
パスワード
   >サンプルは単に、2次元配列のa(i、j)のa(i,0)〜a(i,20)をai(20)
>と見立てるようなやり方を知りたかった(C言語ではこれができ
>ます)ので例に示した次第です。

なるほどね。やりたいことは非常によくわかります。
というか、便利な方法があったら私も知りたいくらいです。

Local Windowを覗いた感じでは、1次元の下に2次元のものがぶら下がって
いるので、PointerのPointerみたいな内部構造なんでしょうけど・・・

たぶん、2次元→1次元変換関数みたいなものは標準では用意されてないはずです。

ということは、すなわち地道にLoopして変換ですかね・・・
もしくは、API使ってMemoryから情報ごそっとでもとってきます?
(やったことないけど・・・できるのかな?MoveMemory辺りとか使って・・・
できたとしても、VBでやることではないような気がします。)

楽にできれば、JoinとかFilterとかもっと使い勝手
あがりそうなんですけどね。

【23822】Re:2次元配列を引数にするには?
回答  ウッシ  - 05/4/5(火) 8:34 -

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

またまた大外れかも、

Sub test2()
  Dim a(10, 20) As Double
  Dim i     As Long
  Dim j     As Long
  Dim v     As Variant
  
  For i = LBound(a, 1) To UBound(a, 1)
    For j = LBound(a, 2) To UBound(a, 2)
      a(i, j) = i * j
    Next
  Next
  
  v = Application.Index(a, 2, 0)
  
End Sub

【23823】Re:2次元配列を引数にするには?
発言  Kein  - 05/4/5(火) 9:31 -

引用なし
パスワード
   2次元→1次元 という処理については↓が参考になりませんか。
http://blog.livedoor.jp/colo_jpn/archives/cat_227096.html

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