[リストへもどる]
一括表示

投稿時間:2003/04/08(Tue) 09:50
投稿者名:たたみ
Eメール:hitomi_n_1204@hotmail.com
URL :
タイトル:
次元数の異なる配列の代入について
次元数の異なる配列の代入で、1次元だけを代入する、というようなことは
可能でしょうか?
たとえば、

Dim vntTest1() as variant
Dim vntTest2() as variant

Redim vntTest1(3,1),vntTest2(3)

と、宣言されていて、vntTest1の1次元目の値(vntTest1(0,0))を、
vntTest2(0)に格納する方法です。
単純にLoopでまわして代入する方法はありますが、
もっと、簡単に代入する方法はありますでしょうか?
教えてください。よろしくお願い致します。

投稿時間:2003/04/08(Tue) 10:29
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 次元数の異なる配列の代入について
> 次元数の異なる配列の代入で、1次元だけを代入する、というようなことは
> 可能でしょうか?
残念ながらできません。

# 特定の条件を満たしている場合には、RtlMoveMemory APIで複写できる事もありますが…。


> Dim vntTest1() as variant
> Dim vntTest2() as variant
> Redim vntTest1(3,1),vntTest2(3)
> と、宣言されていて、vntTest1の1次元目の値(vntTest1(0,0))を、
> vntTest2(0)に格納する方法です。

このような場合は、「配列の配列」の利用を検討してみてください。

つまり、元々のデータを
  Dim vntTest1() As Variant
  ReDim vntTest1(3, 1)
  vntTest1(0, 0) = "0行0列"
  vntTest1(0, 1) = "0行1列"
  vntTest1(1, 0) = "1行0列"
  vntTest1(1, 1) = "1行1列"
  vntTest1(2, 0) = "2行0列"
  vntTest1(2, 1) = "2行1列"
  vntTest1(3, 0) = "3行0列"
  vntTest1(3, 1) = "3行1列"
  Debug.Print vntTest1(2, 1)
などとするかわりに、
  Dim vntTest1() As Variant
  ReDim vntTest1(3)
  vntTest1(0) = Array("0行0列", "0行1列")
  vntTest1(1) = Array("1行0列", "1行1列")
  vntTest1(2) = Array("2行0列", "2行1列")
  vntTest1(3) = Array("3行0列", "3行1列")
  Debug.Print vntTest1(2)(1)
のように保持しておくわけです。
(このような配列を「ジャグ配列:Jagged Arrays」といいます)

これならば、
  Dim vntTest2() As Variant, vntTest3() As Variant
  vntTest2 = vntTest1(1)
  vntTest3 = vntTest1(2)
のようにして切り出すことができます。

投稿時間:2003/04/08(Tue) 10:52
投稿者名:たたみ
Eメール:hitomi_n_1204@hotmail.com
URL :
タイトル:
Re^2: 次元数の異なる配列の代入について
やはり、できないんですねー。
1次元配列のものに、2次元配列データを

vntTest2=vntTest1 とやると、

2次元に拡張されてしまうんですよね。
ありがとうございました!代替案、
参考にさせていただきます。



> > 次元数の異なる配列の代入で、1次元だけを代入する、というようなことは
> > 可能でしょうか?
> 残念ながらできません。
>
> # 特定の条件を満たしている場合には、RtlMoveMemory APIで複写できる事もありますが…。
>
>
> > Dim vntTest1() as variant
> > Dim vntTest2() as variant
> > Redim vntTest1(3,1),vntTest2(3)
> > と、宣言されていて、vntTest1の1次元目の値(vntTest1(0,0))を、
> > vntTest2(0)に格納する方法です。
>
> このような場合は、「配列の配列」の利用を検討してみてください。
>
> つまり、元々のデータを
>   Dim vntTest1() As Variant
>   ReDim vntTest1(3, 1)
>   vntTest1(0, 0) = "0行0列"
>   vntTest1(0, 1) = "0行1列"
>   vntTest1(1, 0) = "1行0列"
>   vntTest1(1, 1) = "1行1列"
>   vntTest1(2, 0) = "2行0列"
>   vntTest1(2, 1) = "2行1列"
>   vntTest1(3, 0) = "3行0列"
>   vntTest1(3, 1) = "3行1列"
>   Debug.Print vntTest1(2, 1)
> などとするかわりに、
>   Dim vntTest1() As Variant
>   ReDim vntTest1(3)
>   vntTest1(0) = Array("0行0列", "0行1列")
>   vntTest1(1) = Array("1行0列", "1行1列")
>   vntTest1(2) = Array("2行0列", "2行1列")
>   vntTest1(3) = Array("3行0列", "3行1列")
>   Debug.Print vntTest1(2)(1)
> のように保持しておくわけです。
> (このような配列を「ジャグ配列:Jagged Arrays」といいます)
>
> これならば、
>   Dim vntTest2() As Variant, vntTest3() As Variant
>   vntTest2 = vntTest1(1)
>   vntTest3 = vntTest1(2)
> のようにして切り出すことができます。

投稿時間:2003/04/14(Mon) 23:23
投稿者名:おじさん
URL :
タイトル:
Re^3: 次元数の異なる配列の代入について
> やはり、できないんですねー。
> 1次元配列のものに、2次元配列データを
>
> vntTest2=vntTest1 とやると、
>
> 2次元に拡張されてしまうんですよね。
> ありがとうございました!代替案、
> 参考にさせていただきます。
>

vntTest2(0)=vntTest1

例)
    Dim a(3) As Variant
    Dim b(3, 3) As Variant
    
    b(0, 0) = 0
    b(0, 1) = 1
    b(0, 2) = 2
    b(0, 3) = 3
    b(1, 0) = 10
    b(1, 1) = 11
    b(1, 2) = 12
    b(1, 3) = 13
    b(2, 0) = 20
    b(2, 1) = 21
    b(2, 2) = 22
    b(2, 3) = 23
    b(3, 0) = 30
    b(3, 1) = 31
    b(3, 2) = 32
    b(3, 3) = 33
    a(0) = b
    
    
    MsgBox a(0)(2, 2)

これでは出来ませんか?