- 日時: 2011/04/05 11:17
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[ファイル入出力][文字列処理][] * * キーワード:CSVファイル,ファイルの読み込み,,,, * ***********************************************************************************
-------------------------------------------------------------------------------------- No.1982 Re:ダブルクォーテーションを含む文字列 投稿者:ゆう(U) [2001/03/29(木)12:16分] --------------------------------------------------------------------------------------
完全に解決されているみたいですが・・・
Split関数(VB6.0)が無くともOKなコードです・・・ ※VB4.0/VB5.0でも動作するはずです VB4.0では動作確認してませんが・・・
myCharを""とすると、Split的に動作します。
'========================================================== '文字列をセパレータで区切り配列にする関数 (Split代用関数:拡張版) '========================================================== ' result = fSplit2(myString, [mySeparator], [myChar], [myCompare]) ' 引数 myString :元の文字列 ' mySeparator:区切り文字(省略可:,) ' myChr :文字列引用符(省略可:") ' myCompare :比較モード(省略可:バイナリ モード) ' 戻値 result :切出した文字列(バリアント配列) ' :エラー時(Empty) '---------------------------------------------------------- 'サンプル) 'Dim varArray As Variant 'Dim varTemp As Variant 'Dim strTemp As String ' 'strTemp = "123,456,""123,456"",""ABC""" 'varArray = fSplit2(strTemp, ",") ' 実際には「,」は半角です ' 'Debug.Print UBound(varArray) - LBound(varArray) + 1 'For Each varTemp In varArray ' Debug.Print varTemp 'Next varTemp '' 通常の For〜Next でもOK '' Dim i As Long '' For i = LBound(varArray) To UBound(varArray) '' Debug.Print varArray(i) '' Next i '結果) ' 4 ←区切られた項目数 '123 ←第1項目 '456 ←第2項目 '"1234,567"←第3項目 '"ABC" ←第4項目 '注意) '文字列引用符と区切り文字の関係に注意して下さい。 '"123,456,""ABC,EFG""H,IJK" ' ^こんなのに注意ってこと(普通はないけど) '---------------------------------------------------------- Public Function fSplit2(ByRef myString As String, _ Optional ByRef mySeparator _ As String = ",", _ Optional ByVal myChar _ As String = """", _ Optional ByVal myCompare _ As VbCompareMethod = vbBinaryCompare) As Variant Dim strArray() As String Dim lngLength As Long Dim lngArrayCount As Long Dim i As Long, j As Long, k As Long
On Error GoTo FUNCTION_ERR
j = 1& lngLength = Len(mySeparator) i = InStr(j, myString, mySeparator, myCompare) k = InStr(j, myString, myChar, myCompare) Do While i > 0& If k = 0 Then k = Len(myString) End If If k < i - 1& Then k = InStr(k + 1&, myString, myChar, myCompare) i = InStr(k + 1&, myString, mySeparator, myCompare) Else ReDim Preserve strArray(lngArrayCount) strArray(lngArrayCount) = Mid$(myString, j, i - j) lngArrayCount = lngArrayCount + 1& j = i + lngLength i = InStr(j, myString, mySeparator, myCompare) k = InStr(j, myString, myChar, myCompare) End If Loop ReDim Preserve strArray(lngArrayCount) strArray(lngArrayCount) = Mid$(myString, j, Len(myString) - j + 1&)
fSplit2 = strArray Exit Function
FUNCTION_ERR: 'エラー発生 'Emptyのまま(TypeName(戻り値)="Empty"で判定可能) End Function
標準モジュールに貼り付けておけば・・・イミディエイトウインドウで 動作確認が出来ます。
? fSplit2("123,456,""ABC,EFG""H,IJK", ",", "")(2) 普通のSplit的動作
? fSplit2("123,456,""ABC,EFG""H"",IJK", ",")(2) Split関数拡張版
|