配列からSelect Caseで配列に格納するには?

解決


ユグドル  2007-01-27 00:53:31  No: 135028

初めまして。
現在、初めてのプログラム作成を行っていますが
問題が発生しましたので投稿いたします。

問題の場所の説明ですが

.logファイル(カンマ区切り)を読み取り
各要素毎に配列Aに格納していく(31個の要素)
その後、Select Caseで配列Aを3つのグループに振り分けて表示する。

配列は全て標準モジュールで定義しているユーザー定義型になります。

ここまでは良いのですが
配列AをSelect Caseで区別した後に
配列B,配列C,配列Dに格納する時に問題が発生しています。

図にすると

配列B(0).X=""
配列B(1).X=1000
配列B(2).X=""
配列B(3).X=""
配列B(4).X=2910

と歯抜けになって格納されます。
当り前ですが表示するときも歯抜けで表示されます。

現在のやり方として以下の方法で選別、格納を行っています。

For i = 0 To 1000
'.logファイルのデータを読み込み配列に格納
Input #1, z(i).kari1,z(i).kari2,z(i).kari3,z(i).kari4,z(i).kari5, _
z(i).kari6, z(i).kari7, z(i).kari8, z(i).kari9, z(i).kari10, _
z(i).kari11, z(i).kari12, z(i).kari13, z(i).kari14, z(i).kari15, _
z(i).kari16, z(i).kari17, z(i).kari18, z(i).kari19, z(i).kari20, _
z(i).kari21, z(i).kari22, z(i).kari23, z(i).kari24, z(i).kari25, _
z(i).kari26, z(i).kari27, z(i).kari28, z(i).kari29, z(i).kari30, _
z(i).kari31

    On Error Resume Next
'選別
 Select Case z(i).kari3
    Case "2A"
        a(i).LNo = z(i).kari1
        a(i).Tis = z(i).kari2
        a(i).Fre = z(i).kari3
        a(i).Heu = z(i).kari5
        a(i).Hed = z(i).kari6
    
    Case "1B"
        b(i).LNo = z(i).kari1
        b(i).Tis = z(i).kari2
        b(i).Fre = z(i).kari3
        b(i).Heu = z(i).kari5
        b(i).Hed = z(i).kari6

    Case "4C"
        c(i).LNo = z(i).kari1
        c(i).Tis = z(i).kari2
        c(i).Fre = z(i).kari3
        c(i).Heu = z(i).kari5
        c(i).Hed = z(i).kari6
 End Select
Next i

良い解決方法をご教授願います。


あんび  2007-01-27 01:42:46  No: 135029

ソースをほぼそのままで活用して手を入れるなら
"2A"用のカウンタ、"1B"用のカウンタ、"4C"用のカウンタを用意し
iを使わず、それぞれのカウンタを使えばやりたいことが出来ると思いますよ。
X=0
Y=0
Z=0
と初期化しておき
 Case "2A"  にきたら
    X=X+1
    a(X).LNo = z(i).kari1
    a(X).Tis = z(i).kari2
      ↑
      ここで使う
Case "1B"  にきたら
    Y=Y+1
    a(Y).LNo = z(i).kari1
    a(Y).Tis = z(i).kari2

としたらいいんじゃないですか。

以下を解析してくれても同じようなことができます。(ソースにコピペでどうぞ)
Option Explicit

Private Type tWork
    LNo     As String
    Tis     As String
    Fre     As String
End Type

Private Sub Command1_Click()
Dim xInWrk()        As String
Dim iFno            As Integer
Dim sIndata         As String
Dim ADATA()         As tWork
Dim BDATA()         As tWork

    ReDim ADATA(0) As tWork
    ReDim BDATA(0) As tWork

    iFno = FreeFile
    Open "C:\TEXT.TXT" For Input As #iFno
    Do While Not EOF(iFno)
        Line Input #iFno, sIndata
        xInWrk() = Split(sIndata, ",")
        If UBound(xInWrk()) >= 0 Then   'データあり
            Select Case xInWrk(0)
                Case "A"
                    ReDim Preserve ADATA(UBound(ADATA()) + 1) As tWork
                    ADATA(UBound(ADATA())).LNo = xInWrk(1)
                    ADATA(UBound(ADATA())).Tis = xInWrk(2)
                    ADATA(UBound(ADATA())).Fre = xInWrk(4)
                Case "B"
                    ReDim Preserve BDATA(UBound(BDATA()) + 1) As tWork
                    BDATA(UBound(BDATA())).LNo = xInWrk(1)
                    BDATA(UBound(BDATA())).Tis = xInWrk(2)
                    BDATA(UBound(BDATA())).Fre = xInWrk(4)
            End Select
        End If
    Loop
    Close #iFno
End Sub


ユグドル  2007-01-29 18:29:01  No: 135030

あんび様

ありがとうございます!無事解決致しました。
きちんと表示された時には感動しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加