値の代入


あさ  2007-06-08 05:46:35  No: 98933

読み込んできたCSVファイルをSPRIT関数を使って
配列に変更しようとしています。その後配列の中身を変数に代入しようとしていますが、自分が書いたプログラムだと、代入できなかったのです。
どこを修正すればいいか、解説お願いします。

 dim Csv() As String
 dim File As String
 dim lngFileno  As Long 
 dim strCsvTmp1 As String
 dim strCsvTmp1 As String
 dim b as String  
  
   File = "D:\sample.csv"
   lngFileNo = FreeFile
Open File For Input As lngFileNo
       Line Input #lngFileNo, strCsvTmp1
    Do Until EOF(lngFileNo)
      Line Input #lngFileNo, strCsvTmp1
        strCsvTmp2 = Split(strCsvTmp1, ",", Csv())
          b= Csv(0) ←  ここに値が入らないです


K・今川  2007-06-08 07:14:59  No: 98934

strCsvTmp2 = Split(strCsvTmp1, ",", Csv())
              ↓
Csv() = Split(strCsvTmp1, "," )

Split(文字列 , 区切り文字 , 返す配列の要素数 , 文字列比較のモードを表す数値)

返す配列の要素数にはCsv()の要素の数を指定してください。
-1 を指定または省略すると、すべての文字列を含んだ配列を返します。

例えば、5を指定するとCsv(0)〜Csv(4)に各要素ごとに区切られた文字列が入ります。

strCsvTmp1="A,B,C,D,E,F,G,H"

Csv() = Split(strCsvTmp1, "," ,5)

結果
Csv(0)="A"
Csv(1)="B"
Csv(2)="C"
Csv(3)="D"
Csv(4)="E,F,G,H"   <=====残りの要素すべてが入ります。


あさ  2007-06-08 07:46:40  No: 98935

回答ありがとうございます。でも環境がVB5で、Split関数がないので
ネットで取ってきたものを使いました。
返す配列の要素数を指定しなかったら、コンパイル時にエラーになりました。 
下記のが取ってきた、Spritのソースです。
VB6のSplitと同じように使えるかみていただけますか?
よろしくおねがいます。

Public Function StrSplit _
    (ByRef strExpression As String, _
     ByRef strDelimiter As String, _
     ByRef strArray() As String, _
     Optional ByVal lngCompare As Long = vbBinaryCompare, _
     Optional ByVal lngDefaultMaxArray As Long = STRSPLIT_DAFAULT_MAXARRAY) As Long

 Dim lngPos1 As Long     'InStr関数用検索開始位置
 Dim lngPos2 As Long     'InStr関数用文字検出位置
 Dim lngStrLen As Long   '検索される文字列のサイズ
 Dim lngDivLen As Long   '区切り文字のサイズ
 Dim lngCnt As Long      '項目数(=配列要素数)をあらわすカウンタ
 Dim lngMaxArray As Long '配列要素の最大数

    lngStrLen = Len(strExpression)  '元の文字列 strExpression の文字数を取得
    lngDivLen = Len(strDelimiter)   '区切り文字 strDelimiter の文字数を取得
    
    If lngStrLen = 0 Then           '引数 strExpression に空の文字列を渡した場合
        StrSplit = 0                '0 を返す
        Exit Function
    ElseIf lngDivLen = 0 Then       '引数 strDelimiter に空の文字列を渡した場合
        ReDim strArray(0)
        strArray(0) = strExpression '引数 strExpression を単一要素の配列として返す
        StrSplit = 1
        Exit Function
    End If
    
    lngMaxArray = lngDefaultMaxArray
    ReDim strArray(lngMaxArray)     '配列最大要素数を初期値にセット
    lngPos1 = 1                     '初期検索開始点を設定

    Do                                                                             '区切り文字が検出されなくなるまでループ
        If lngCnt > lngMaxArray Then                                               '項目数が配列要素最大数を超えてしまった場合
            lngMaxArray = lngMaxArray + lngDefaultMaxArray                         '配列要素最大数を lngDefaultMaxArray 増やす
            ReDim Preserve strArray(lngMaxArray)
        End If
        lngPos2 = InStr(lngPos1, strExpression, strDelimiter, lngCompare)          '区切り文字を検索しその位置を返す
        If lngPos2 Then                                                            '区切り文字が存在した場合
            strArray(lngCnt) = Mid$(strExpression, lngPos1, lngPos2 - lngPos1)     '検索開始点から(区切り文字位置 - 1)までの文字列をを配列に代入
            lngPos1 = lngPos2 + lngDivLen                                          '次回の検索開始点を設定
            lngCnt = lngCnt + 1                                                    '次回のため項目数を一つ増やす
        Else                                                                       '区切り文字が存在しない場合
            If lngCnt Then                                                         '最後の要素である場合
                strArray(lngCnt) = Right$(strExpression, lngStrLen - lngPos1 + 1)  '文字列の最後から検索開始点までの文字列を配列に代入
            Else                                                                   '区切り文字が全く存在しない場合
                strArray(lngCnt) = strExpression                                   '引数 strExpression を単一要素の配列として返す
                Exit Do
            End If
        End If
    Loop Until lngPos2 = 0

    ReDim Preserve strArray(lngCnt) '配列の余分な要素を削る
    StrSplit = lngCnt + 1           '配列の個数を返す

End Function


じぇふ  2007-06-08 09:24:15  No: 98936

何か情報が中途半端です。

読み込むデータと期待値、それに現在の値をはっきりしないと
状況が見えません。

少なくとも、上記ソースをコピペ後に最低限動作できる修正をすれば
Csv(0)には値が入っていますよ。


K・今川  2007-06-08 20:03:14  No: 98937

こちらでも試してみましたが特に問題なく動きました。

修正したところは、StrSplit関数の中では
STRSPLIT_DAFAULT_MAXARRAYの値が入ってない
のでとりあえず100をいれました。

呼び出し側はあささんのものを修正しました。

Dim Csv()      As String
Dim File       As String
Dim lngFileno  As Long
Dim strCsvTmp1 As String
Dim strCsvTmp2 As String      '<=====strCsvTmp1をstrCsvTmp2に修正(要素数が入るのでIntegerの方がいいかも)
Dim b          As String
    
strCsvTmp1 = "A,B,C,D,E,F,G,H"                 '<=====File読み込みから代入に変更

strCsvTmp2 = StrSplit(strCsvTmp1, ",", Csv())  '<=====Split( を StrSplit( に修正
b = Csv(0) '←  ここに値が入らないです

Text1.Text = "要素数=" & strCsvTmp2 & vbCrLf & "Csv(0)=" & b  '<======出力を追加

結果の出力は

    要素数=8
    Csv(0)=A

になりました。


K・今川  2007-06-08 20:14:08  No: 98938

一部間違えたので修正します。

×(要素数が入るのでIntegerの方がいいかも)

○(要素数が入るのでLongの方がいいかも)

StrSplit関数の戻り値の型はLong型でした。


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

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






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