• ベストアンサー

配列をさらに小分けしたい。

以下のような配列があるとします。    No  data ------------------ (0) No1 AAA (1) No1 BBB (2) No1 CCC (3) No2 DDD (4) No2 EEE (5) No3 FFF (6) No3 GGG Noごとに処理をさせたいので、処理しやすいようにNoごとに配列を作りたいのですが、どうしていいかわかりません。 よい方法はありませんでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

サンプルプログラムです Option Explicit Private Type wa No As String Data As String End Type Private Sub Command1_Click() 'サンプルの為の配列作成 Dim A(6) As wa A(0).No = "No1": A(0).Data = "AAA" A(1).No = "No1": A(1).Data = "BBB" A(2).No = "No1": A(2).Data = "CCC" A(3).No = "No2": A(3).Data = "DDD" A(4).No = "No2": A(4).Data = "EEE" A(5).No = "No3": A(5).Data = "FFF" A(6).No = "No3": A(6).Data = "GGG" 'この下から、再配列 Dim B() As String '再配列用の配列 Dim i As Integer '1次元目 Dim j As Integer '2次元目 Dim k As Integer 'a配列のループ用 Dim w_key As String 'キー(No?) Dim w_no As Integer '最終のNo w_no = Val(Mid(A(UBound(A)).No, 3)) '最終のNoから数字のみ取り出す ReDim B(1 To w_no, 0) '配列bの再宣言 w_key = "" i = 0 For k = 0 To UBound(A) '配列aを最後までループ If (w_key <> A(k).No) Then 'キーが変わったら i = i + 1 '1次元の数を増やす j = 0 '2次元を0に戻す w_key = A(k).No '次のキーをセットする Else 'キーが変わらなければ j = j + 1 '2次元の数を増やす End If If (j > UBound(B, 2)) Then '配列Bの2次元の数よりjが大きくなったら ReDim Preserve B(1 To w_no, j) '配列bの再宣言(格納されているデータをそのまま残す) End If B(i, j) = A(k).Data 'a→bに格納 Next k 'これより先はデバッグ用(イミディエイトウィンドウに表示されます) For i = LBound(B) To UBound(B) For j = LBound(B, 2) To UBound(B, 2) Debug.Print CStr(i) & "," & CStr(j) & ":" & B(i, j) Next j Next i End Sub 2次元配列の1次元目は1度宣言すると変更できません redim a(1,2)と宣言後、redim a(1,3)は可能ですが、redim a(2,2)は不可能 言い換えると、No?の方は、数(?)がわかっていないといけないという事です。 No10までと分かっている場合は、 w_no = 10にするか、必要の無い場所は削除してください。 >行が何行あるのかがわかっていなく、 配列aはファイルなどから持ってくるのですか? ファイルから持ってくる場合、No?の数が分からなければ、1度a配列に格納して、 bに再配列という形になると思います。

snowsaab
質問者

お礼

サンプルソース、大変参考になりました。 おかげさまで問題を解決することができました。 ありがとうございましたm(__)m

その他の回答 (4)

回答No.5

2度書き失礼します。 VBのプログラムですけど、VBAでしたらすみません。 基本は同じですので、参考にしてみてください。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

2次元配列を使ってはどうですか。 b(i,j)のjを「no」が変るとj=j+1にする。 a(k)を構成しなおすプログラムを組めば良い。 この型の回答は出ていますか?

snowsaab
質問者

お礼

最初は2次元配列・・・と思ったのですが、ユーザ定義の方がわかりやすかったので、 そちらを使うことにしました。 ご指導ありがとうございましたm(__)m

  • dizzy
  • ベストアンサー率38% (10/26)
回答No.2

補足ありがとうございます。 あくまでも配列を使用したいのならば・・・ >行が何行あるのかがわかっていなく 要素数を確実に指定できないのであれば、Redimを使用して再定義しては如何でしょう? '------------------------------------ Dim strArg() As String ・・・ '要素数が確定した地点で Redim strArg(10,5) As String ・・・ '------------------------------------ ↑こんな感じで。 場合によってはPreserve キーワードを入れる事も必要かもしれません。 説明不足や見当違いだったらご指摘願います(^-^;

snowsaab
質問者

お礼

おかげさまで、解決することができました。 たびたび、ご丁寧にありがとうございましたm(__)m

  • dizzy
  • ベストアンサー率38% (10/26)
回答No.1

どうやって上記のデータが配列になっているのかがいまいちよくわかりません。 追記してくださると嬉しいです(^-^; 配列でなければいけませんか? >Noごとに処理をさせたい select case文でNoを比較するという手もありますが。 それじゃなかったらユーザ定義型(Type型かな?)を使ってみては如何でしょう? Type MyData strNo as String  ←文字型で"No1"とかって格納 strData as String ←文字型で"AAA"とかって格納 End Type ↑みたいな感じで。

snowsaab
質問者

補足

説明不足ですみませんm(__)m 二次元配列となっています。 行が何行あるのかがわかっていなく、 列は2列で固定としています。

関連するQ&A