『銀魂2 掟は破るためにこそある』がいよいよ公開!>>

VBにてCSVデータを読み込むロジックを組んでいるのですが
データの中にカンマが入ったものがたまにあります。
通常通り読むとデータのカンマを区切りのカンマと間違え正しく変数に読み込まれません。
たとえばCSVデータが下記の場合
123,de-ta,12,000,jjjj
実際のデータは
123
de-ta
12,000
jjjj
ですが
12,000を2個のデータと認識して
123
de-ta
12
0000
jjjj
のようになってしまいます。
どなたか12,000をちゃんと読める方法をご存知の方お力をお貸しください。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (11件中1~10件)

こんにちは


そのアプリは、固定長出力はできないでしょうか。
二重引用符もだめだとすると、規則性を利用してロジックで分けるしかありません。
例えば・・
Line Input で1行ずつ取り込み。
念のためカンマの数をカウントしてみる。
カンマの位置で、データを切り出す。Instr()かVB6のSplit()で。
IsNumeric(str)を利用して、データが数値か文字列かを判断する。
例ですと、数値の後ろの項目は文字列になっているので、文字列が後ろに来たら、そこまでの数値を連結する。
てな具合です。
では!
    • good
    • 0
この回答へのお礼

ありがとうございます。
私もLine Input で1行ずつ取り込み。を考え、とりあえずプログラミングしてみました。
なんとか今、正常に稼動しています。
やはりこの手しかないようですね。

お礼日時:2002/09/19 12:00

難しいですね。



でも、まずカラム数は決まっているのですよね?
123,de-ta,12,000,jjjjの場合はカラムが4になるべき?

一行を一度に読み込み、Split関数などで配列にデータを
分割し、カラム数が必要な値より大きい場合は、配列の後
ろから数値でかつ3桁のものを探して、その前が数値であれ
ば繋げるとかすれば、少しいけるかも知れません。
データが
1,222,333,222 でカラム数が2とかの場合は無理ですが。

以上、参考になれば幸いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:03

123,de-ta,12,000,jjjj



あなたは12,000をどうやって12と000は一緒の数値だと見分けました?
そこからロジックをたててみて、カンマ区切りを読み込む関数を作ってみてください
しかしもしあなたが見分けられない物があるとするとロジックのたてようはありません。

質問だけではわかりませんがおそらく数値、文字、数値、文字などのなんらかパターン
があるのでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:03

既解答の中に、読んで後のロジックで解決する的な話がありますが、今私も別件の解答で失敗しましたが、もしInput #1,a,b,c式で読むと、次々にずれて変数a,b,cなどにセットされ、最後にEof(1)でレコードの終わりを上手く捉えられず、読むデータが無いというエラーに行き付くと思います。

ご解答にあるようにメモ帳に読みこんで手作業で,を除くより他無いと思います。解答者は実際テストデータでやってみて頂いて、ご批判を仰ぎたいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:04

No.5の者です。

カンマは小数点のことかと思いましたが、金額のカンマが正しいのでしょうか。金額のカンマとしても、難しいですね。例えば、

12,345とあったとします。
\12と\345とも取れますし、\12345とも取れますね。

金額のカンマを除いた状態で出力すると12,345→12345となり、\12345に固定されてしまいますね。

やはり、カンマが「区切り記号」と「金額のカンマ」との違いが無い限り、無理な気がします。12、234,56、78,90とかになっていないと厳しいでしょう。\12,\234,56,\78,90など金額の頭に「区切り記号」の意味の文字列があったなら良かったのですが。

7_7_7さんは12,345のような場合、\12と\345、\12345、どのように見分けているのでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:04

>データの中にカンマが入ったものがたまにあります。


ロジックを組んで取り込もうとする先がカンマがあったりなかったりの可変では
ロジックでの対処は難しいのではないですか。
手間になりますが一度別のアプリで読み込んで金額をカンマなしで再出力するとか
で取り合えず対処するくらいだと思います。(例えばExcelで読み込んでカンマ編集
を除くとか)

市販のソフトでCSVで出力出来るのであれば金額のカンマを除いた状態で出力する
設定がありそうなものですが。
CSVで出力する際の設定を変更するオプションは無いのでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:04

No.3の回答だと、例、12,34,56,78(12,34と56,78)として、「数字と数字の間にあるカンマは数字の一部と見なす」としたら、12.34.56.78("."は小数点)とありえない数値になってしまいます。

質問の意図からして、12,000の","は小数点のことだと思いますが、上の例のように、カンマで区切られた数字が連続であった場合、12と34と56と78、12と34.56と78、・・・など、あいまいすぎて法則を見つけるのが非常に困難だと思います。12,000の前後に何か一定の法則がないと、市販のアプリ側が小数点のことを考慮していただく他に無いのでは、と思います。
    • good
    • 0

市販のソフトなのであれば、販売元のサイトにパッチファイル等がないですかねえ。

    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:06

 市販のアプリがそういうの出力してるってことは、それアプリのバグですね(^_^;


 裏技つかって何とかするしかないです。
 数字と数字の間にあるカンマは数字の一部と見なすとか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:05

CSVでは、データにカンマが含まれる場合(というか、文字列なら。

)は、二重引用符で、クォートするのが、お約束のような。

ex) 3,"12,000","Test"

データ作成側で対処すべきかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。
line input文にてなんとか切抜けました。

お礼日時:2002/09/19 12:05

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

Qカンマ区切りの数字をCSVファイルにインポートする時どうすれば?

カンマ区切りで区切られた金額を
CSVファイルにエクスポートなどする時は、
どうやって、カンマの区切りを判別するのですか?

Aベストアンサー

(1)アプリがかいてないのですが、エクセルとすると、エクセルの桁どりのカンマは書式設定の働きでもって、見た目にカンマが入っているが、数式バーではカンマがありませんので判るとおり、データにはカンマはありません。
ですからエクセルからエクスポートしても、数値項目にはCSVファイルには、桁取りカンマがありません。
(2)逆に
"1,001",023,34
'01,"122,234",34
1,234,"334,455"
をメモ帳で作って、エクセルに読み込ますと
"1,001",023,34
'01,"122,234",34
1,234,"334,455"
となるが、例えば334,455のセルには値はカンマが省かれています。
(3)だいたい、数値を表示するソフトは、値はカンマなしで保持し、画面や印刷するときに、カンマを入れるものです。
(4)(2)において3桁ごとのカンマを入れるだけにすると、項目区切りのカンマと区別がつかなくなりますが、
それでそのために前後をダブルクオーテーションでくくる
約束です。
(5)むしろCSVファイルの基本は、1項目の前後をダブルクオーテーションで括るのが原則なのですが、数値の場合省略できると言う約束になっている形式が多いです。しかし3桁ごとのカンマを入れるとすると、原則に戻らざるを得ません。

(1)アプリがかいてないのですが、エクセルとすると、エクセルの桁どりのカンマは書式設定の働きでもって、見た目にカンマが入っているが、数式バーではカンマがありませんので判るとおり、データにはカンマはありません。
ですからエクセルからエクスポートしても、数値項目にはCSVファイルには、桁取りカンマがありません。
(2)逆に
"1,001",023,34
'01,"122,234",34
1,234,"334,455"
をメモ帳で作って、エクセルに読み込ますと
"1,001",023,34
'01,"122,234",34
1,234,"334,455"
となるが、例え...続きを読む

Qカンマ区切りのCSVファイルから""を削除したい

初めて質問いたします

以下のような形式のCSVファイルがあります
例)
品名,数量,単価,金額
"りんご",1,150,150
"バナナ",10,200,2000
"メロン","1,000","2,000","2,000,000"

上記のように、品名にはダブルクォーテションがつき、
数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています

上記のようなデータを
りんご,1,150,150
バナナ,10,200,2000
メロン,1000,2000,2000000
のように別ファイルへ出力するにはどのようにすればよいでしょうか?

プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです
よろしくお願いいたします

Aベストアンサー

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = BaseFolder.Path & "\" & "_NewFiles"

If oFs.folderExists(newFolder) = False Then
oFs.createFolder (newFolder)
End If

For Each f In BaseFolder.Files
If oFs.GetExtensionName(f) = "csv" Then
Call changeIt(f.Path, newFolder)
End If
Next

MsgBox newFolder & " フォルダ内を検証"


Sub changeIt(orgFname, trgFolder)
Dim oFs
Dim orgF
Dim newF
Dim newFname
Dim buF
Dim oReg

Dim Mcol
Dim M
Dim M1, M2
Const forReading = 1
Const forWriting = 2

Set oFs = CreateObject("Scripting.fileSystemObject")
Set oReg = CreateObject("VBScript.RegExp")
Set orgF = oFs.getFile(orgFname).openAsTextStream(forReading)

newFname = trgFolder & "\" & oFs.getBaseName(orgFname) & "_New.csv"
oFs.CreateTextFile (newFname)
Set newF = oFs.getFile(newFname).openAsTextStream(forWriting)

With oReg
.Pattern = """.*?"""
.IgnoreCase = False
.Global = True
End With

Do Until orgF.atendofstream
buF = orgF.readline
Set Mcol = oReg.Execute(buF)

For Each M In Mcol
M1 = Replace(M.Value, ",", "")
buF = Replace(buF, M.Value, M1)
M2 = Replace(M1, Chr(34), "")
buF = Replace(buF, M1, M2)
Next

newF.WriteLine buF
Loop

orgF.Close: newF.Close
Set Mcol = Nothing
Set oReg = Nothing

End Sub

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = Bas...続きを読む

Q【VBA】ExcelマクロでCSVファイルに保存したデータが""で囲まれてしまう

添付図のような、Excel2003で作成した表内のデータを
CSVで保存するマクロを作成したのですが、
図のように、CSVファイルに「""」で値が囲まれた状態で、
保存されてしまいます。

下記にマクロを記載しますので、
どうすれば文字列が「""」で囲まれずに、
カンマ区切りだけのデータで出力されるのか、
ご存知の方おられましたら、ご教示お願い致します。

Sub csv保存()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim 行数 As Long, 列数 As Integer
Dim i As Integer, j As Long, k As Long

ファイル名 = "test.csv"
フォルダ名 = "csv"
パス名 = ActiveWorkbook.Path & "\" & _
フォルダ名

'csvフォルダが存在しなければ作成する
If Dir(パス名, vbDirectory) = "" Then
MkDir パス名
End If
ChDir パス名

Open ファイル名 For Output As #1

For i = 1 To Worksheets.Count
Worksheets(i).Activate
Worksheets(i).Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
行数 = Selection.Rows.Count
列数 = Selection.Columns.Count

For j = 1 To 行数
For k = 1 To 列数 - 1
データ = Selection.Cells(j, k) _
.Value
Write #1, データ;
Next k
Write #1, Selection.Cells(j, 列数) _
.Value
Next j
Next i
Close #1
End Sub

添付図のような、Excel2003で作成した表内のデータを
CSVで保存するマクロを作成したのですが、
図のように、CSVファイルに「""」で値が囲まれた状態で、
保存されてしまいます。

下記にマクロを記載しますので、
どうすれば文字列が「""」で囲まれずに、
カンマ区切りだけのデータで出力されるのか、
ご存知の方おられましたら、ご教示お願い致します。

Sub csv保存()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim ...続きを読む

Aベストアンサー

Write # は文字列を""で囲んで出力する仕様になっています。
そのまま出力したければ、Print #を利用すればよろしいかと。
ただし、Printの場合は区切り文字(カンマ)を自動で出力してくれませんので、併せて出力する必要があります。

For j = 1 To 行数
  For k = 1 To 列数 - 1
    データ = Selection.Cells(j, k) .Value
    Print #1, データ; ",";
  Next k
  Print #1, Selection.Cells(j, 列数).Value
Next j

なお、いらぬおせっかいですが、ドライブが複数ある環境下だと、
 ChDir パス名
だけでは必ずしもcvsフォルダ内に、ファイルが作成されるとは限りません。
 Open パス名 & "\" & ファイル名 For Output As #1
のように、フルパスで指定しておいた方が確実かと…

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qダブルクォーテーション囲いカンマ区切り形式で保存したい

お願いします。
エクセル2000使用してます。
【質問1】
"名前A","ナマエA","09011111111","aaa@docomo.ne.jp"
"名前B","ナマエB","09011111112","bbb@docomo.ne.jp"
"名前C","ナマエC","09011111113","ccc@docomo.ne.jp"
このように、ワークシートをダブルクォーテーション囲いカンマ区切り形式で保存するにはどうすればよいでしょうか。

【質問2】
上記のデータを読み込むときに電話番号部分の先頭の0が取れてしまうの防ぐために、ファイルの拡張子をtxtにリネームしておいて、エクセルから開くときにウィザードで列のデータ形式を文字列と指定しています。もっと簡単な方法が教えてください。(頻繁にファイルを開くので。。。)

Aベストアンサー

1.マクロを使わないと出来ません。
  こんな感じです。
 Open "CsvFileName.csv" for Output as #1
 For Row = 1 to 10
  For Col = 1 to 10
   Select Case Col
    Case 1
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case 2
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case Else
     Print #1 Cell(Row, Col).Text;
   End Select
   If Col = 10 Then
    Print #1, ""
   Else
    Print #1, ",";
   End If
  Next Col
 Next Row
 Close #1

2.マクロを使えば自動化できます。
「データ」メニューの「外部データの取り込み」で「テキストファイル」を指定してCSVファイルを選択します。
テキスト取り込みウィザードで列のデータ形式を文字列と指定します。
上記の操作を「マクロの記録」でマクロにしてから
実用になるようにマクロを修正します。

1.マクロを使わないと出来ません。
  こんな感じです。
 Open "CsvFileName.csv" for Output as #1
 For Row = 1 to 10
  For Col = 1 to 10
   Select Case Col
    Case 1
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case 2
     Print #1 Chr$(&H22) & Cell(Row, Col).Text & Chr$(&H22);
    Case Else
     Print #1 Cell(Row, Col).Text;
   End Select
   If Col = 10 Then
    Print #1, ""
   Else
   ...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QCSVファイルの「”」について

VB6でCSVファイルを読み込みたいのですが、
以下のような項目だと、1項目として読み込むことができません。

例) AAA,"BBB,CCC,"" """,DDD

"BBB,CCC,"" """ を1項目として読み込みたいのですが
ダブルコーテーションの括りの中に、更にダブルコーテーションがあると
うまくいかないみたいです。
何か方法がありますでしょうか?


Open DownLoadFile For Input As #1 Len = 32000
Input #1, rec
Do Until EOF(1)
処理1

Loop
close #1

Aベストアンサー

>出力フォーマットを変更する事はできないので、
やはり処理を組み込むしかないようですね。

参考になればよいのですが、サンプルを作成しました。
ExcelのVBAで動いたので多分大丈夫だとは思うのですが、、、

ダメっぽかったらそちらで修正して^^;

Option Explicit

Public Const DEF_CHR34   As String = """"  'ダブルコーテーション
Public Const DEF_SPLIT_CHAR As String = ","   '区切り文字

Sub Main()
  Dim l_strバッファ    As String
  Dim l_str一行      As String
  Dim l_strAryバッファ() As String
  Dim i          As Integer
  Dim l_strAry一行()   As String
  
  'ファイルを一気に読み込む
  l_strバッファ = ファイル読込み("C:\test.csv")
  
  '改行コードで配列化を行う
  l_strAryバッファ = Split(l_strバッファ, vbCrLf)
  
  '改行数のループ処理を行う
  For i = LBound(l_strAryバッファ) To UBound(l_strAryバッファ)
    l_str一行 = l_strAryバッファ(i)
    Debug.Print l_str一行
    
    '文字が存在していなければ、ループを抜ける
    If RTrim$(l_str一行) = "" Then
      MsgBox i + 1 & "行目が空データなので、ループをぬける"
      Stop
      Exit For
    End If
    
    Stop
    '一行を区切り文字で配列化する
    If Not 変換_ライン_配列(l_str一行, l_strAry一行, DEF_SPLIT_CHAR) Then
      MsgBox "えらー終了"
      Stop
      Exit For
    End If
    Stop
  Next i
  
End Sub


Public Function ファイル読込み(ByVal p_strファイル名 As String) As String
  Dim intFile   As Integer
  Dim lngLen   As Long
  Dim bytBuff()  As Byte
  
  intFile = FreeFile
  lngLen = FileLen(p_strファイル名)
  
  If lngLen = 0 Then
    Exit Function
  End If
  
  ReDim bytBuff(0 To lngLen - 1)
  Open p_strファイル名 For Binary Access Read As intFile
  Get intFile, , bytBuff
  Close intFile
  
  ファイル読込み = StrConv(bytBuff, vbUnicode)
End Function


'文字列を、指定の区切りキャラで、配列化を行う
Public Function 変換_ライン_配列( _
  ByVal p_str一行 As String, _
  ByRef p_strAry一行() As String, _
  Optional ByVal p_str区切 As String = "," _
) As Boolean
  Dim l_bln実行結果    As Boolean
  Dim l_strAry区切()   As String
  Dim l_str文字列     As String
  Dim i          As Integer
  Dim l_intカウント取得数 As Integer
  Dim l_strAry返却()   As String
  
  l_bln実行結果 = True
  
  '区切り文字で配列化する
  l_strAry区切 = Split(p_str一行, p_str区切)
  
  '配列要素数でループを行う
  For i = LBound(l_strAry区切) To UBound(l_strAry区切)
    '取得する
    If Not 補正取得(l_strAry区切, i, l_str文字列, p_str区切) Then
      'エラー処理
      l_bln実行結果 = False
      Exit For
    End If
    
    '取得した文字列を、配列として記憶する
    ReDim Preserve l_strAry返却(l_intカウント取得数)
    l_strAry返却(l_intカウント取得数) = l_str文字列
    
    l_intカウント取得数 = l_intカウント取得数 + 1
  Next i
  
  '記憶した配列を返却する
  p_strAry一行 = l_strAry返却

  '取得結果のステータスを返却する
  変換_ライン_配列 = l_bln実行結果
End Function

Private Function 補正取得( _
    ByRef p_strAry区切() As String, _
    ByRef p_int開始位置 As Integer, _
    ByRef p_str取得文字 As String, _
    ByVal p_str区切 As String _
) As Boolean
  Dim l_bln実行結果    As Boolean
  Dim i          As Integer
  Dim l_str文字      As String
  Dim l_strAryChr34()   As String
  Dim l_intカウントChr34 As Integer
  Dim l_str文字連結    As String
  
  
  l_str文字 = p_strAry区切(p_int開始位置)
  
  If Left$(l_str文字, 1) = DEF_CHR34 Then
    'ダブルコーテーションで文字列が始まる場合
    For i = p_int開始位置 To UBound(p_strAry区切)
      l_str文字 = p_strAry区切(i)
      
      '初回のループでなければ、区切りキャラを追加する
      If i <> p_int開始位置 Then
        l_str文字連結 = l_str文字連結 & p_str区切
      End If
      '文字列の連結を行う
      l_str文字連結 = l_str文字連結 & l_str文字
      
      '内部に存在するダブルコーテーションの数を取得する
      l_strAryChr34 = Split(l_str文字, DEF_CHR34)
      l_intカウントChr34 = l_intカウントChr34 + UBound(l_strAryChr34)
      
      '一番右の文字がダブルコーテーションである 且つ ダブルコーテーションのカウントが偶数である
      If (Right$(l_str文字, 1) = DEF_CHR34) And ((l_intカウントChr34 Mod 2) = 0) Then
        '先頭と最後のダブルコーテーションを抹消
        p_str取得文字 = Mid$(l_str文字連結, 2, Len(l_str文字連結) - 2)
        
        '呼び出し元のループカウンタのポジションを進める
        p_int開始位置 = i
        
        '正常処理であることを通知
        l_bln実行結果 = True
        Exit For
      End If
    Next i
    
  Else
    'ダブルコーテーションで文字列が始まらない場合
    '取得した値をそのままセット
    p_str取得文字 = l_str文字
    
    '正常処理であることを通知
    l_bln実行結果 = True
  End If
  
  '取得結果のステータスを返却する
  補正取得 = l_bln実行結果
End Function

>出力フォーマットを変更する事はできないので、
やはり処理を組み込むしかないようですね。

参考になればよいのですが、サンプルを作成しました。
ExcelのVBAで動いたので多分大丈夫だとは思うのですが、、、

ダメっぽかったらそちらで修正して^^;

Option Explicit

Public Const DEF_CHR34   As String = """"  'ダブルコーテーション
Public Const DEF_SPLIT_CHAR As String = ","   '区切り文字

Sub Main()
  Dim l_strバッファ    As String
  Dim l_str一行      As ...続きを読む

Q文字列の分割について

VB初心者です。
以下のように文字列を分割したいのですが

<やりたいこと>
MOJI="A","B","C,D,E"

ARRAY(0)="A"
ARRAY(1)="B"
ARRAY(2)="C,D,E"


ARRAY=SPLIT(MOJI,",") ではだめですよね。
何か、簡単なやり方はありますか?

よろしくお願いします。

Aベストアンサー

大概の場合はうまくいくと思います。
Function csv(source) As Variant
Dim reg As New RegExp
Dim mc As MatchCollection
Dim buf
Dim i
Dim bobj As Object
Dim arry()

If Len(source) > 0 And Left(source, 1) <> "," Then
buf = buf & ","
Else
csv = ""
Exit Function
End If
reg.Pattern = "(""[^""]*""),|([^""]*),"
reg.Global = True
Set mc = reg.Execute(source)
If mc.Count <> 0 Then
reg.Pattern = ",$"
ReDim arry(mc.Count)
For i = 0 To mc.Count - 1
arry(i) = reg.Replace(mc(i), "")
Next
End If
csv = arry
End Function

大概の場合はうまくいくと思います。
Function csv(source) As Variant
Dim reg As New RegExp
Dim mc As MatchCollection
Dim buf
Dim i
Dim bobj As Object
Dim arry()

If Len(source) > 0 And Left(source, 1) <> "," Then
buf = buf & ","
Else
csv = ""
Exit Function
End If
reg.Pattern = "(""[^""]*""),|([^""]*),"
reg.Global = True
Set mc = reg.Execute(source)
If mc.Count <> 0 Then
reg.Pattern = ",$"
ReDim arry(mc.Count)
For i = 0 To mc.Count - 1
arry(i) = reg.Replace(...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング