電子書籍の厳選無料作品が豊富!

以下のような配列があるとします。
   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ごとに配列を作りたいのですが、どうしていいかわかりません。
よい方法はありませんでしょうか??

A 回答 (5件)

サンプルプログラムです



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に再配列という形になると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/07 16:07

2度書き失礼します。



VBのプログラムですけど、VBAでしたらすみません。
基本は同じですので、参考にしてみてください。
    • good
    • 0

2次元配列を使ってはどうですか。


b(i,j)のjを「no」が変るとj=j+1にする。
a(k)を構成しなおすプログラムを組めば良い。
この型の回答は出ていますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/07 16:05

補足ありがとうございます。


あくまでも配列を使用したいのならば・・・

>行が何行あるのかがわかっていなく
要素数を確実に指定できないのであれば、Redimを使用して再定義しては如何でしょう?
'------------------------------------

Dim strArg() As String

・・・

'要素数が確定した地点で
Redim strArg(10,5) As String

・・・

'------------------------------------
↑こんな感じで。
場合によってはPreserve キーワードを入れる事も必要かもしれません。
説明不足や見当違いだったらご指摘願います(^-^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/07 15:59

どうやって上記のデータが配列になっているのかがいまいちよくわかりません。


追記してくださると嬉しいです(^-^;
配列でなければいけませんか?

>Noごとに処理をさせたい
select case文でNoを比較するという手もありますが。

それじゃなかったらユーザ定義型(Type型かな?)を使ってみては如何でしょう?

Type MyData
strNo as String  ←文字型で"No1"とかって格納
strData as String ←文字型で"AAA"とかって格納
End Type

↑みたいな感じで。

この回答への補足

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

補足日時:2002/11/06 17:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!