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

投稿時間:2003/09/12(Fri) 16:02
投稿者名:kuro
Eメール:
URL :
タイトル:
変数について
モジュール内の

Type aaa
  E As Long
  F(0 To 2 - 1) As Long
End Type


初歩的は質問かも知れませんが
(0 To 2 - 1)を(0 To BB - 1)と変数を
入れて使うにはどうすれば良いでしょう。
宜しくお願いします。

投稿時間:2003/09/12(Fri) 16:05
投稿者名:1412
Eメール:
URL :
タイトル:
Re: 変数について
> Type aaa
>   E As Long
>   F(0 To 2 - 1) As Long
> End Type
> (0 To 2 - 1)を(0 To BB - 1)と変数を

Type aaa
  E As Long
  F() As Long
End Type

Dim a As aaa
Redim a.F(0 To BB - 1)

投稿時間:2003/09/12(Fri) 16:40
投稿者名:kuro
Eメール:
URL :
タイトル:
Re^2: 変数について
> Type aaa
>   E As Long
>   F() As Long
> End Type
>
> Dim a As aaa
> Redim a.F(0 To BB - 1)

1412さん早々の返答ありがとう御座います。
試して見ましたが・・・・。
「配列は固定されてるか、一時的にロックされてます」
とエラーが帰ってきます。
どうしたものか。????

投稿時間:2003/09/12(Fri) 17:12
投稿者名:エメ
Eメール:
URL :
タイトル:
Re^3: 変数について
> 「配列は固定されてるか、一時的にロックされてます」
> とエラーが帰ってきます。

横槍入ります。この辺を疑ってみては?
http://www.zenko3.com/tips/vb_error10.html

投稿時間:2003/09/12(Fri) 19:12
投稿者名:kuro
Eメール:
URL :
タイトル:
Re^4: 変数について
> > 「配列は固定されてるか、一時的にロックされてます」
> > とエラーが帰ってきます。
>
> 横槍入ります。この辺を疑ってみては?
> http://www.zenko3.com/tips/vb_error10.html

グサッ・・!
腹に刺さったかも。(笑)
エメさん有難う御座います。
早々に試してみた結果。(涙)
End Withに出来ないよ〜。(Withが有りませんエラー、有るのに?)
Withステートメントをはずしても同じ結果でした。(配列は固定されてるか、一時的にロックされてます)
因みに、ReDimをはずせばエラーは出ない。
なぜに・・・・・・??

投稿時間:2003/09/12(Fri) 20:24
投稿者名:エメ
Eメール:
URL :
タイトル:
Re^5: 変数について
> グサッ・・!
> 腹に刺さったかも。(笑)
あははw
> Withステートメントをはずしても同じ結果でした。(配列は固定されてるか、一時的にロックされてます)
ひとつずつ見ていったほうがよさそうかもですね。。
・再配列が原因
・構造体に原因


前者なら
    Dim str() As String
    ReDim str(32)
    str(1) = "aaa"
    str(2) = "bbb"
が通らないと思いますし、通れば構造体を疑うといった手段で
とりあえずはコードを疑ってみましょう。

。。私のは1412さんのコードで問題なく通りますが^^;..
> 因みに、ReDimをはずせばエラーは出ない。
> なぜに・・・・・・??
メッセージどおり配列が固定(ロック)されているんでしょうね。。

投稿時間:2003/09/12(Fri) 21:29
投稿者名:kuro
Eメール:
URL :
タイトル:
Re^6: 変数について
蟻が10御座います。
モジュール内は静的配列しか受けないのかも知れません。
モジュールからフォームに移動させようとおもいます。
出来るかな〜???

投稿時間:2003/09/13(Sat) 07:47
投稿者名:J
Eメール:
URL :
タイトル:
Re: 変数について
変数を固定配列の要素指定にすることは出来ません。
固定長の配列宣言の要素指定にはリテラル(定数)を指定しなければなりません。

エラーダイアログのヘルプボタンで表示されるヘルプを参照してください。
ヘルプにはこのように書いてあります。

>配列の宣言で、要素数を変数で指定しようとしています。
>プロシージャ内で動的配列を宣言するには、ReDim で配列を宣言してから、変数で要素数を指定します。

正し次のようなケースではコンパイルは成功します。
Const BB As Long = 5
Type aaa
  E As Long
  F(0 To BB - 1) As Long
End Type
これは冒頭にも書きましたが、定数を指定しているからです。

動的に配列を確保する場合は関数内で行う必要があります。
なぜなら、ReDimステートメントを使用できるのはプロシージャ レベルだけだからです。
詳しくはヘルプ参照して下さい。

動的に配列要素を指定する場合は以下のようにします。
Type aaa
  E As Long
  F() As Long
End Type
Dim a As aaa

Sub XXX()
  Dim BB
  BB = 1
  Redim a.F(0 To BB - 1)
End Sub

また、このコードで注意しなければならないのは、変数 BB が 0 以下の場合エラーとなるので注意してください。

投稿時間:2003/09/13(Sat) 12:42
投稿者名:kuro
Eメール:
URL :
タイトル:
Re^2: 変数について
> 変数を固定配列の要素指定にすることは出来ません。
> 固定長の配列宣言の要素指定にはリテラル(定数)を指定しなければなりません。
>
> エラーダイアログのヘルプボタンで表示されるヘルプを参照してください。
> ヘルプにはこのように書いてあります。
>
> >配列の宣言で、要素数を変数で指定しようとしています。
> >プロシージャ内で動的配列を宣言するには、ReDim で配列を宣言してから、変数で要素数を指定します。
>
> 正し次のようなケースではコンパイルは成功します。
> Const BB As Long = 5
> Type aaa
>   E As Long
>   F(0 To BB - 1) As Long
> End Type
> これは冒頭にも書きましたが、定数を指定しているからです。
>
> 動的に配列を確保する場合は関数内で行う必要があります。
> なぜなら、ReDimステートメントを使用できるのはプロシージャ レベルだけだからです。
> 詳しくはヘルプ参照して下さい。
>
> 動的に配列要素を指定する場合は以下のようにします。
> Type aaa
>   E As Long
>   F() As Long
> End Type
> Dim a As aaa
>
> Sub XXX()
>   Dim BB
>   BB = 1
>   Redim a.F(0 To BB - 1)
> End Sub
>
> また、このコードで注意しなければならないのは、変数 BB が 0 以下の場合エラーとなるので注意してください。

********************************************
有難う御座いました。
説明不足だったかも知れません。
BBには他の関数から得た値を入れたかったのです。
結局、For・・・Nextを使ってコードを変更しました。
 Type aaa
  E As Long
  F As Long
 End Type
 Dim a As aaa

 Sub XXX()
  BB = ff    'ff関数からの値
  For i = 0 To BB - 1
      CopyMemory  a ,gg ,a
      Debug.Print F
    Next i
 End Sub

投稿時間:2003/09/13(Sat) 12:46
投稿者名:kuro
Eメール:
URL :
タイトル:
Re^3: 解決(忘れてた)
皆さん有難う御座いました。
忙しい中、ご指導下さり感謝いたします。

投稿時間:2003/09/13(Sat) 13:04
投稿者名:J
Eメール:
URL :
タイトル:
Re^4: 解決(忘れてた)
一般的にはVBでは、VBでできるものはVBでしたほうが良いとされています。
特にCopyMemory等、直接メモリを操作する方法はあまり推奨されておりません。

BB = 1

BB = ff

に変更するだけで同じ機能を果たすので再考されてはいかがでしょうか?