Access VBA質問箱 IV

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

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


1171 / 2272 ツリー ←次へ | 前へ→

【8453】動的二次配列について タロロ 06/8/14(月) 10:34 質問[未読]
【8454】Re:動的二次配列について 小僧 06/8/14(月) 13:35 発言[未読]
【8456】Re:動的二次配列について 3 06/8/14(月) 14:05 回答[未読]
【8457】Re:動的二次配列について タロロ 06/8/14(月) 14:20 お礼[未読]
【8458】Re:動的二次配列について 小僧 06/8/14(月) 16:24 発言[未読]

【8453】動的二次配列について
質問  タロロ  - 06/8/14(月) 10:34 -

引用なし
パスワード
   動的な二次配列を宣言したいのですが、
ループの二回目でエラーになってしまいます。
どのようにすればよいのでしょうか?
宜しくお願い致します。
Do Until rs.EOF

 iCount = iCount + 1

 ReDim Preserve myDATA(iCount, 1 To 30)
 myDATA(iCount, 1) = 社員ID
 myDATA(iCount, 2) = 名前
        :
 rs.MoveNext
Loop

【8454】Re:動的二次配列について
発言  小僧  - 06/8/14(月) 13:35 -

引用なし
パスワード
   ▼タロロ さん:
こんにちは。

>動的な二次配列を宣言したいのですが、
>ループの二回目でエラーになってしまいます。

ご提示された情報だけですと、何とも言えませんね。

エラー番号、エラー内容やどの行でエラーが発生するのかを
はっきりすると回答がつきやすくなるかもしれません。

また、myDATAのデータ型等も情報が欲しい所ですね。

> Do Until rs.EOF
>
> iCount = iCount + 1
>
> ReDim Preserve myDATA(iCount, 1 To 30)
> myDATA(iCount, 1) = 社員ID
> myDATA(iCount, 2) = 名前
>        :
> rs.MoveNext
>Loop

Loopの最中に rs を全く使ってませんよね…。

【8456】Re:動的二次配列について
回答  3  - 06/8/14(月) 14:05 -

引用なし
パスワード
   こんにちは。
ちょっと調べたところ
「Preserve を指定した場合、変更できるのは、
動的配列の最後の次元のサイズに限られます。
また、次元数は変更できません。」
とあったので、
ループの前にPreserveなしでredimして
myDATA(iCount, 1 To 30)を
myDATA(1 To 30, iCount)
という形でいいなら動くと思います。

試しに↓の様にしたら動きました。
Sub tamesi()
  Dim i As Integer
  Dim test() As String
  ReDim test(1 To 30, 0)
  For i = 0 To 100
    ReDim Preserve test(1 To 30, i)
    test(1, i) = "a" & i
  Next i
End Sub


▼タロロ さん:
>動的な二次配列を宣言したいのですが、
>ループの二回目でエラーになってしまいます。
>どのようにすればよいのでしょうか?
>宜しくお願い致します。
>Do Until rs.EOF
>
> iCount = iCount + 1
>
> ReDim Preserve myDATA(iCount, 1 To 30)
> myDATA(iCount, 1) = 社員ID
> myDATA(iCount, 2) = 名前
>        :
> rs.MoveNext
>Loop

【8457】Re:動的二次配列について
お礼  タロロ  - 06/8/14(月) 14:20 -

引用なし
パスワード
   ▼3 さん:
ありがとうございました。
確認出来ました。
「Preserve で変更できるのは、
動的配列の最後の次元だけなんですね〜。」
勉強になりました。
やりたい事が出来るよう改めて考えてみます。

▼小僧さん:
説明不足で申し訳ありません。
エラー箇所は、
ループ二回目での
ReDim Preserve myDATA(iCount, 1 To 30)の部分です。
内容は、9:インデックスが有効範囲にありません。でした。
myDATA() As Stringと宣言しました。
>Loopの最中に rs を全く使ってませんよね…。
rsは使用していますが、
ループ処理内で動的な二次配列を宣言したいので
質問内容とは関係ないので省きました。

【8458】Re:動的二次配列について
発言  小僧  - 06/8/14(月) 16:24 -

引用なし
パスワード
   ▼タロロ さん:
こんにちは。

>「Preserve で変更できるのは、
>動的配列の最後の次元だけなんですね〜。」

Excel がインストールされている PC でしたら
Excelのワークシート関数であるTranspose関数で入替えが可能です。
(ワークシート関数のため、最小添字が 1になる模様です。)

テーブル、T_Tempを用意して

ID    名前    住所
1    小野    浦和
2    川口    磐田
3    巻    千葉
4    宮本    大阪
5    松井    フランス

Sub 入替えテスト()
Dim RS As DAO.Recordset
Dim myData() As Variant
Dim i As Long
Dim j As Long
  Set RS = CurrentDb.OpenRecordset("T_Temp")
  Do Until RS.EOF
    ReDim Preserve myData(0 To 2, 0 To i)
      
    For j = 0 To 2
      myData(j, i) = RS(j)
    Next j
    i = i + 1
    RS.MoveNext
  Loop
  RS.Close
  Set RS = Nothing
  
'下記行のコメントを操作して下さい。
  'myData = CreateObject("Excel.Application").Transpose(myData)

'検証
  For i = LBound(myData, 1) To UBound(myData, 1)
    For j = LBound(myData, 2) To UBound(myData, 2)
      Debug.Print "(" & i & "," & j & "):" & myData(i, j)
    Next j
  Next i
End Sub

Excel関数を呼び出している行のコメントを外すと、
行・列が入れ替わっていることがイミディエトウィンドウにて
確認できるかと思われます。

1次元目、2次元目共に要素数を変える訳には行きませんが…。

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