[Bug報告] ReDim で要素数を増やすコードがエラーになる

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

[Bug報告] ReDim で要素数を増やすコードがエラーになる

投稿記事 by K.Tsunoda »

バグ報告です。 QA(品質保証)は『日本語プロジェクト』向けの報告所みたいなんで、こちらに書きます。
[Windows XP SP2 & OOo 3.0.0]

http://blog.livedoor.jp/addinbox/archives/51225904.html

配列の要素数を ReDim Preserve で1つずつ増やす場合、
ReDim Preserve vntArray(0 to (UBound(vntArray) + 1))
このようなコードを使います。『現在の添字の上限値+1』で配列定義するコードです。

コード: 全て選択

Sub Main1
Dim vntArray() As Variant

  ReDim vntArray ( 0 to 5 )

  ReDim Preserve vntArray ( 0 to ( UBound( vntArray ) + 1) )

  vntArray(UBound(vntArray)) = "Test"
  MsgBox UBound(vntArray) & Chr(13) & vntArray(UBound(vntArray))
End Sub
ReDim Preserve のステップで実行時エラーとなります。
「Err:91 オブジェクト変数は設定できていません」

以下のように修正するとエラーは無くなり、正しく動作します。

コード: 全て選択

Sub Main2
Dim vntArray() As Variant
Dim i As Integer

  ReDim vntArray ( 0 to 5 )

  i = UBound(vntArray)
  ReDim Preserve vntArray ( 0 to ( i + 1 ) )

  vntArray(UBound(vntArray)) = "Test"
  MsgBox UBound(vntArray) & Chr(13) & vntArray(UBound(vntArray))
End Sub
なお、修正前のコード( Main1 )は、VBAではエラーとはならずに正しく動作します。



OOo.Basic が【式を評価する順番】を誤った事が、このエラーの原因と思われます。

カッコ内の UBound(vntArray) を先に評価して、
それから ReDim Preserve vntArray を評価するのが正しい順番です。

しかし、OOo.Basic では、
(1) 先に ReDim Preserve vntArray が評価される。
(2) その結果、【現在、vntArray は配列サイズ変更中でサイズが不定という扱いになる。
(3) その後で、カッコ内の UBound(vntArray) を評価する。
という順番で処理しているのだと思います。

vntArray のサイズ情報(オブジェクト?)が不定になっている状況下で、
UBound によって vntArray のサイズを取り出そうとした為に、
サイズ情報の 「オブジェクト変数が設定できていません」
というエラーになっているのでしょう。

なお、Preserve が無くても同じ結果です。

バグ報告ですので、[解決]マークは付けません。

PS:現在、私が気付いたバグ(と思われるもの)は以下の通りです。
http://blog.livedoor.jp/addinbox/archiv ... 39937.html
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: [Bug報告] ReDim で要素数を増やすコードがエラーになる

投稿記事 by tani »

うーんこれは感覚的にOOo Basicの仕様でいいような気がしますねー。。。
(ホントはVBAもOOo Basicも古くさい気がしますがw。最近のスクリプト系言語みたいに配列の要素数くらい自動で伸長してくれよってのが正直なところです。)

一応issueも検索しておきました。
http://ja.openoffice.org/issues/show_bug.cgi?id=43838
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: [Bug報告] ReDim で要素数を増やすコードがエラーになる

投稿記事 by K.Tsunoda »

こんにちは。 いつもありがとうございます♪

数式のカッコと 関数の引数括りのカッコの違いなんでしょうかね。

でも、引数に値を渡すのは「呼び元」の役目で、値を渡す為には、引数の評価が済んでいないといけないと
考えると、カッコ内の評価が先のような気もします。

でも、「オブジェクトをCreateしてから、そのオブジェクトのメソッドを実行する」というのと似たような流れの
仕組みで作ってあるのならば、それならメソッドを実行する時に引数内の式を評価すれば良いのだから、
「引数の評価が後」というのも納得できます。

この件は「OOo.Basic ではこういうものだ」と受け止めれば済む事だし、問題なく処理する「使い方」もあるので
これはこれで良いのでしょうね。

「OOo.Basic ではこういうものだ」といえば、今日は 「MsgBox (Information) は OK ボタンのみ」というのに
出会いましたが、『”ご案内”なんだから、”判りました”の応答しかないでしょう。なら”OKボタン”だけですね』
というスタンスなんでしょうか(笑)
Issue を見ると 1.0.0 の時から指摘されていて、直さないというのは、そういう事なのでしょうかね・・・
返信する

“Calc”に戻る