読み込んできた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) ← ここに値が入らないです
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" <=====残りの要素すべてが入ります。
回答ありがとうございます。でも環境が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
何か情報が中途半端です。
読み込むデータと期待値、それに現在の値をはっきりしないと
状況が見えません。
少なくとも、上記ソースをコピペ後に最低限動作できる修正をすれば
Csv(0)には値が入っていますよ。
こちらでも試してみましたが特に問題なく動きました。
修正したところは、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
になりました。
一部間違えたので修正します。
×(要素数が入るのでIntegerの方がいいかも)
○(要素数が入るのでLongの方がいいかも)
StrSplit関数の戻り値の型はLong型でした。
ツイート | ![]() |