[解決]配列変数の代入が、実はリンクになっている

スプレッドシート (Calc) について
返信する
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

[解決]配列変数の代入が、実はリンクになっている

投稿記事 by K.Tsunoda »

[ Windows XP SP2 , OOo 3.0.0 ]

配列変数の代入が、
配列構造&データのコピーではなく、
『代入元[配列変数]への参照』の設定
になっている事が判明しました。 :alarm:

【大問題】 配列変数の代入はリンクだった!
http://blog.livedoor.jp/addinbox/archives/51261348.html

コード: 全て選択

Sub Main2
 Dim vntArray(1 to 3) As Variant
 Dim vntTemp As Variant
 
 vntArray(1) = "ABCD"
 vntArray(2) = "******"
 vntArray(3) = 12345
 vntTemp = vntArray
 
 vntArray(1) = "XYZ"

 MsgBox vntTemp(1)
 End Sub
ABCD ではなく、XYZ が表示されてしまいます。


EXcel/VBA では、こういう事はありません。ちゃんと「配列構造&データのコピー」になっています。


今まで作って公開してきたマクロの数々。全部、見直す必要が出て来ました(号泣)
見直したところ、『 RefEdit 』が修正が必要でした。他のマクロは問題ありません。


検索キーワードが上手くないのか、ISSUE が今のところ見当たりません。
この問題、メガトン級の大問題だと思うのですが、既知なのでしょうか?

「開いてはいけない禁断の扉」を開けてしまった気がして、とっても鬱です _| ̄|○

C 言語とか、そっち方面で育った人にとっては、『配列って普通、そういうもんでしょ。何か変?』と
言われるかもしれないですね。
でも、VB(VBA)では『代入』動作ですから、
・ VB(VBA)で育った人にとっては、
・ VBAから OOo.Basic への移行を考えてる人にとっては、
【とっても変】です。
最後に編集したユーザー K.Tsunoda [ 9月 10, 2009, 3:34 pm ], 累計 4 回
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: 配列変数の代入が、実はリンクになっている

投稿記事 by K.Tsunoda »

サイズ変更無しの [ ReDim Preserve ] を施すと、新たなメモリ領域に移す事が出来るようで、
vntArray と vntTemp を切り離す事ができました。

コード: 全て選択

Sub Main8
 Dim vntArray(1 to 3) As Variant
 Dim vntTemp As Variant
 
 vntArray(1) = "ABCD"
 vntArray(2) = "****"
 vntArray(3) = 12345
 
 vntTemp = vntArray
 ReDim Preserve vntTemp(1 to 3) 
 
 vntArray(1) = "XYZ"

 MsgBox vntTemp(1)
End Sub

ただし、【子配列】構造では、子配列部分がリンクのままでした。

コード: 全て選択

Sub Main10
 Dim vntArray(1 to 3) As Variant
 Dim vntTemp As Variant
 
 vntArray(1) = "ABCD"
 vntArray(2) = "****"
 vntArray(3) = Array(100,200,300)
 
 vntTemp = vntArray
 ReDim Preserve vntTemp(1 to 3)
 
 vntArray(3)(2) = 98765

 MsgBox vntTemp(3)(2)
End Sub
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: 配列変数の代入が、実はリンクになっている

投稿記事 by tani »

なるほど。確かに複雑なデータ構造やそのデータの操作を行うマクロで思わぬバグの原因になりそうな挙動ですね。お気持ちはお察しします。
ただ配列の値をコピーして保持しておきたいなら同じ型の配列を用意して↓みたいにするのが普通だと考えると↑のやり方でポインタ的な挙動になるのは仕様として納得できます。

コード: 全て選択

hogehoge[0] = fugafuga[0]
hogehoge[1] = fugafuga[1]
hogehoge[2] = fugafuga[2]
この程度の仕様の違いはあって当たり前でみんなにスルーされているとも思えますが、そもそもVBAやOOo Basicで複雑なデータ構造をプログラム上でコピーするという操作が稀で誰も気付いてないという可能性も結構高い気もします。。。

# 以上感想まで。
返信する

“Calc”に戻る