Page 615 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼配列(Split)に関して jin 03/1/27(月) 20:08 ┗Re:配列(Split)に関して Hirofumi 03/1/27(月) 20:25 ┗Re:配列(Split)に関して jin 03/1/27(月) 20:32 ┗Re:配列(Split)に関して Hirofumi 03/1/27(月) 21:02 ─────────────────────────────────────── ■題名 : 配列(Split)に関して ■名前 : jin ■日付 : 03/1/27(月) 20:08 -------------------------------------------------------------------------
お願いします〜〜m(_ _)m データの取り込み処理を作成しておりまして、csvファイルをline input を用いて配列に入れてからsplit関数を使ってカンマ区切り(、)ごとにデータを区切っております。 再配列とでもいうかのような処理を行っていたところ、EXCEL2000では稼動して、 EXCEL97では稼動できませんでした。 このSplit関数にきり変わる、EXCEL97でも使用可能な関数がありませんか? どうかお願いします。 非常に困ってます。 宜しくお願いします。 |
>このSplit関数にきり変わる、EXCEL97でも使用可能な関数がありませんか? Excel97には、有りません ただし、VBAで似た様な物を作る事は可能です 以下に私のコードを書いておきます、ただし処理速度は遅いので宜しく バグが有ったらゴメン 例1、CSVの切り出し専用、ダブルクォーツ等も行う Public Function SplitLine(ByVal strLine As String, _ Optional strDelimiter As String = ",", _ Optional strQuote As String = """", _ Optional strRet As String = vbCrLf, _ Optional blnMultiLine As Boolean = False) As Variant ' strLine :分割元と成る文字列 ' strDelimiter :区切り文字 ' SplitLine :戻り値、切り出された文字配列 Dim lngDPos As Long Dim vntData() As Variant Dim lngStart As Long Dim i As Long Dim strField As String Dim lngLength As Long i = 1 lngStart = 1 lngLength = Len(strLine) blnMultiLine = False Do ReDim Preserve vntData(1 To 1, 1 To i) If Mid(strLine, lngStart, 1) <> strQuote Then lngDPos = InStr(lngStart, strLine, strDelimiter, _ vbBinaryCompare) If lngDPos > 0 Then strField = Mid(strLine, lngStart, lngDPos - lngStart) lngStart = lngDPos + 1 Else strField = Mid(strLine, lngStart) lngStart = lngLength + 1 End If Else lngStart = lngStart + 1 Do lngDPos = InStr(lngStart, strLine, strQuote, _ vbBinaryCompare) If lngDPos > 0 Then strField = strField & Mid(strLine, lngStart, _ lngDPos - lngStart) lngStart = lngDPos + 1 Select Case Mid(strLine, lngStart, 1) Case "" Exit Do Case strDelimiter lngStart = lngStart + 1 Exit Do Case strQuote lngStart = lngStart + 1 strField = strField & strQuote End Select Else blnMultiLine = True strField = Mid(strLine, lngStart) & strRet lngStart = lngLength + 1 Exit Do End If Loop End If vntData(1, i) = strField strField = "" i = i + 1 Loop Until lngLength < lngStart SplitLine = vntData() End Function 例2、Split関数の真似 Public Function Split97(ByVal vntLine As Variant, _ Optional ByVal strDelimiter As String = ",", _ Optional ByVal lngLimit As Long = -1, _ Optional ByVal intCompare As Integer _ = vbBinaryCompare) As Variant ' vntLine 必ず指定 文字列と区切り文字を含んだ文字列式を指定 ' 引数 vntLine が長さ 0 の文字列 ("") である場合、Split97 関数は""をかえす ' strDelimiter 省略可能 文字列の区切りを識別する文字を指定 ' 引数 strDelimiter を省略すると、区切り文字に"," を使用 ' 引数 strDelimiter が長さ 0 の文字列 ("") である場合は、 ' 引数 vntLine 全体の文字列を含む単一の要素の配列を返す ' lngLimit 省略可能 返す配列の要素数を指定 -1 を指定すると、すべての文字列を含んだ配列を返す ' intCompare 省略可能 文字列式を評価するときに使用する文字列比較のモードを表す数値を指定 Dim i As Long Dim vntData() As Variant Dim lngPos As Long Dim lngRead As Long Dim intDelLen As Integer Dim lngLineLen As Long If intCompare <> vbBinaryCompare Then intCompare = vbTextCompare End If If strDelimiter = "" Then ReDim vntData(0) vntData(0) = vntLine Split97 = vntData Exit Function End If If vntLine = "" Then Split97 = "" Exit Function End If intDelLen = Len(strDelimiter) lngLineLen = Len(vntLine) lngRead = 1 i = 0 Do Until lngRead > lngLineLen ReDim Preserve vntData(i) lngPos = InStr(lngRead, vntLine, strDelimiter, intCompare) If lngPos = 0 Or i = lngLimit Then vntData(i) = Mid(vntLine, lngRead) lngRead = lngLineLen + 1 Else vntData(i) = Mid(vntLine, lngRead, lngPos - lngRead) lngRead = lngPos + intDelLen End If i = i + 1 Loop Split97 = vntData End Function |
▼Hirofumi さん: >>このSplit関数にきり変わる、EXCEL97でも使用可能な関数がありませんか? > >Excel97には、有りません >ただし、VBAで似た様な物を作る事は可能です >以下に私のコードを書いておきます、ただし処理速度は遅いので宜しく >バグが有ったらゴメン > そうですか〜97にはありませんか〜 残念ですが、しょうがありません。 すみません。 コードを参考にがんばってみます! ありがとうございます。 とってもはやいレスで驚いてます。 |
書き忘れましたが、本来のCSVデータを処理するならSplit関数では無理が有ると思います 何故なら、CSVで文字列の中にカンマ、ダブルクォーツが有る場合(ダブルクォーツで囲まれた文字列)等もSplitではフィールドに分けてしまいますし、ダブルクォーツで囲まれた文字列のダブルクォーツ自身も削除してくれません よって、私自身は、例1のFunctionをExcel2000でも使っています また、例2は少し、凝りすぎでエラーに成りそうなものを片っ端から除いています そこら辺の必要が無い所を省略すれば少しは早くなると思います |