テキストデータExcel取込時の文字化け、その他

このQ&Aのポイント
  • VBA初心者の方が、テキストデータをExcelに取り込む際の文字化けや空白行の問題について質問しています。
  • 質問者は、「.txt」ファイルを自動的に選び、カンマ区切りのデータをExcelに取り込みたいと考えています。
  • また、テキストデータを正しく取り込むためには、文字化けや空白行をスキップする方法が必要です。
回答を見る
  • ベストアンサー

テキストデータExcel取込時の文字化け、その他

VBA初心者です。 やりたいことは以下の通りです。 カンマ区切りの文字が記載された.txtデータをExcelファイルに取り込みたいと思っています。 (1)自動でフォルダを開いて手動で任意のテキストデータを選ぶ (2)データを文字 化けなくカンマ区切りでセルごとにExcelに表示 (3)元データの.txtはファイルによって空白行が1行のときもあれば2行のときもありまちまちなので自動で空白行をスキップして呼び込みたい (4)呼び込んだ.txtの内容を元に読み込先のExcelに関数(I列に来るべき.txtのデータを参照してJ列「収支」K列「勝率」が出る)が仕込んであるが、ファイルによってデータの行数が違うため最終行を取得したい 特定の.txtファイルではなくこちらで選べるようにしたいので以下に示したソースの通りGetOpenFilenameで自動でファイルを開いて手動で選べるようにしています。 その際、一部別の漢字に変換されたり、カンマがひとつだけ・に代わっていたり文字化けがあります。 呼び込みたい.txtは空白行が1行あったり、2行あったりするのでそこをスキップして純粋に文字のある行から取り込みたい。読み込み先のExcelには事前に項目を作っているため、空白行をスキップできれば自動的に項目の下にデータが表示されるようになっています。※予め空白のないテキストを呼び込んでテストすると(文字化けは別として)上手くいきました。 (4)は難しくてもせめて(1)~(3)までは自力でできないかと調べていますがうまくいきません。UTF-8をANTI形式に保存しても直ったり直らなかったり、またVBAのADODB.Streamオブジェクト(Microsoft ActiveX Data Objects x.x Library)を試そうとするもファイルパスやターゲットで特定のファイルを指定する部分があり、それを指定しないで使うにはどうすればいいのかがわかりません。 ご査収いただけましたら嬉しいです。 下記はネットのソースを一部直して作成。これを利用してできないでしょうか。 Option Explicit '=================================================================================================== Private Const g_cnsTitle As String = "テキストファイル読み込み" Private Const g_cnsFilter As String = "全てのファイル (*.*),*.*" Sub Txt読み込み() Dim varFileName As Variant Dim intFree As Integer Dim strRec As String Dim strSplit() As String Dim i As Long, j As Long varFileName = Application.GetOpenFilename(FileFilter:="txtファイル(*.txt),*.txt", _ Title:="txtファイルの選択") If varFileName = False Then Exit Sub End If intFree = FreeFile '空番号を取得 Open varFileName For Input As #intFree 'txtファイルをオープン i = 0 Do Until EOF(intFree) Line Input #intFree, strRec '1行読み込み i = i + 1 strSplit = Split(strRec, ",") 'カンマ区切りで配列へ For j = 0 To UBound(strSplit) Cells(i, j + 1) = strSplit(j) Next '配列をそのまま入れる方法も、ただし全て文字列として入力される 'Range(Cells(i, 1), Cells(i, UBound(strSplit) + 1)) = strSplit Loop Close #intFree End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.3

読み込みたいファイルは、 カンマ区切りのテキストファイルで 拡張子が、.txtなんですね? また、そのテキストファイルの文字コードは何でしょうか? 改行コードはCRLFでいいですか? それは、おそらく、添付画像の右下で確認できるはずです。 それとも、文字コード、改行コードがファイルによって異なりますか? もし、文字コードがansi、改行コードがCRLFなら、 以下のように修正すれば、期待の動作になるはずです。 Private Const g_cnsTitle As String = "テキストファイル読み込み" Private Const g_cnsFilter As String = "全てのファイル (*.*),*.*" Sub Txt読み込み()  Dim varFileName As Variant  Dim intFree As Integer  Dim strRec As String  Dim strSplit() As String  Dim i As Long, j As Long  varFileName = Application.GetOpenFilename(FileFilter:="txtファイル(*.txt),*.txt", _  Title:="txtファイルの選択")  If varFileName = False Then   Exit Sub  End If  intFree = FreeFile '空番号を取得  Open varFileName For Input As #intFree 'txtファイルをオープン  i = 0  Do Until EOF(intFree)   Line Input #intFree, strRec '1行読み込み   If strRec <> "" Then    i = i + 1    strSplit = Split(strRec, ",") 'カンマ区切りで配列へ    For j = 0 To UBound(strSplit)     Cells(i, j + 1) = strSplit(j)    Next   End If  Loop  Close #intFree End Sub

tinybuddha33
質問者

お礼

丁寧なご回答ありがとうございます。形式はANTIではなかったのですが、ANTIに修正してご記載のソースで試してみるとうまくいきました!改行コードは添付いただいた箇所には表示されておらず不明でした。もともと8UTFのデータだったのですがそちらは別の方法が見つかり解決いたしました。これで2種類の文字コードとも問題なくExcelに取り込む方法がわかりました。ありがとうございます。

その他の回答 (2)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.2

No.1に少し補足します. 私は Excelにできることは Excelにやらせる主義なので. 理由は,そのほうがコーディングが簡単になるし,処理速度も速いからです.なので,私なら次のようにします. (1) の処理は,GetOpenFilenameなど好きな方法で良いでしょう. (2) の処理は,Excelの「外部データの取り込み」の「テキストファイル」をマクロ記録して使用します.  文字コードを選択できるので,ここで文字化けしないコードを選択してください.  記録されたマクロのファイルパスの部分を (1)で取り込んだファイル名に変数で置き換えれば OKです. (3)(4) の処理は,cvsファイルを取り込んだワークシートにフィルタを掛けて,データがある行のみ抽出し,それを Excel関数が入力されているワークシートにコピペします. csvファイルの選択以外は,マクロの記録だけで済むはずです.

tinybuddha33
質問者

お礼

ご回答ありがとうございます。一度目のご回答にあるようにExcelから手動でファイルを開いて区切り文字設定をすると勿論うまくいくのですが、頻繁に同じ処理をするため自動化の必要がありました。VBAでマクロを記録して処理する方法を教えてくださりありがとうございます!こちらも試してみます。

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.1

まず、Excelにはcsvファイルを開く機能があるので、それで開いてみてください。 それでも文字化けしますか? 私なら、上記の方法で開いてから成形処理します。

関連するQ&A

  • 【Excel VBA】カンマ毎にデータを区切る

    はじめて質問をさせて頂きます。 Excel VBAは初心者です。 仕事で必要なため、本を読みながら考えておりましたが、 手も足も出ない状態です。 【質問内容】 Excel VBAにて、ExcelファイルのA列のみに格納されているデータを カンマ「,」の位置毎に区切ります。 ※格納されているデータ例:A,B,C,D,E Excelの区切り位置にて、カンマで区切る処理と同じです。 A1から処理を開始し、A列のデータがなくなるまで 上記の処理を行います。 下記のプログラムを実行すると、1行目は正常にカンマ毎に 区切られますが、2行目以降はカンマ毎に区切られず、 そのままの状態です。 どこに問題があり、どのように修正すれば良いのでしょうか、 ご教示頂けると助かります。宜しくお願いします。 【プログラム】 Sub カンマ毎に区切る() Dim mydata As String Dim myArray() As String Dim i, j As Integer j = 0 Do While Cells(j + 1, "A").Value <> "" mydata = Cells(j + 1, 1) myArray() = Split(mydata, ",") For i = 0 To UBound(myArray) Cells(1, i + 1).Value = myArray(i) Next j = j + 1 Loop End Sub

  • Excel VBA: Inputステートメントで読み込むと、データ中のカンマで切れてしまう。

    いつも皆様ありがとうございます。 ExcelのVBAで、以下の仕様のテキスト・ファイルを1行ずつ読み込もうとしています。 【仕様】 ・1行は1つ以上のスペースで区切られた複数の値から成る。 ・値中に、半角カンマが含まれる場合がある。 値中にカンマが存在しない場合は、問題なく改行まで読み込まれるのですが、カンマがあるとそのカンマ以降のデータが読み込まれません。 Dim intFF As Integer 'FreeFile値 Dim strFileName As String 'ファイル名 Dim strRec As String '1行の読み込み内容 strFileName = "TEST.txt" intFF = FreeFile Open strFileName for Input As #intFF Do Until EOF(intFF) Input #intFF, strREC ' ※1 ・・・(省略) 上記※1のコード実行後にstrRECの中を見ると、カンマ以降の文字列が読み込まれていません。 例えば「A BB CCC DDDD」というデータの場合は問題なくそのままの値がstrRECの中に入っていますが、「A BB CC,C DDDD」というデータだと「A BB CC」というようになってしまいます。 Inputステートメントについて調べましたが、区切り文字に関する記述がなかったので困っています。 もし原因をご存知の方がいらっしゃいましたらお教えいただけないでしょうか。 よろしくお願いいたします。

  • textデータをexcelに取り込む

    VBA初心者です。 テキストファイルのデータをEXCELに自動取り込みしてcsv形式で保存したいのですが、テキストデータが65536行を超えているのでWorkbooks.OpenTextでは65537行以後が取り込めません。インターネットで調べた方法FileSystemObjectでテキストデータを1行ごとに取り込もうと思ったのですが、「ユーザー定義型が定義されていません」のエラーメッセージが表示されて旨くいきません。FileSystemObjectの使い方が良く解らないので誰か教えてください。 なお、テキストデータは1行に8フィールド有りますので、取り込んだデータはフィールドごとに8列に分けたいのですが、その方法も解りません。 テキストデータサンプル(1行分) 2004/1/5 101 i 10787 10862 10785 10825 726690000 以下に試みた方法を記述します。 Option Explicit Sub READ_TextFile3() Const cnsFILENAME = "D:\Test\test1.txt" Dim FSO As New FileSystemObject ' FileSystemObject Dim TS As TextStream ' TextStream Dim strREC As String ' 読み込んだレコード内容 Dim GYO As Long ' 収容するセルの行 Set TS = FSO.OpenTextFile(cnsFILENAME, ForReading) GYO = 1 Do Until TS.AtEndOfStream strREC = TS.ReadLine GYO = GYO + 1 Cells(GYO, 1).Value = strREC Loop TS.Close Set TS = Nothing Set FSO = Nothing End Sub

  • エクセルVBAにてテキスト出力がうまくいきません

    エクセルシートの1列に以下のような文字列を打ち込みました。 - a aa aaa aaaa aaaaa - b bb bbb bbbb bbbbb - c cc ccc cccc ccccc - 「-」の2行後をテキストを出力した際のファイル名とし、ファイル名を含んだ次の「-」までの文字列をそのテキストの中に出力したいです。なお、全体の行数は分かっています。 例えば上の文字列に対して実行すると、 a.txt b.txt c.txt というファイルができ、それぞれの中には a aa aaa aaaa aaaaa などがそれぞれ出力されるようにしたいです。 Sub tepa() Dim strFilename As String Dim FileNumber As Integer Dim strREC As String j = 1 For i = 1 To 70 If Cells(i, 1) = "-" Then strFilename = Cells(i + 2, 1) & ".txt" Do While Cells(i + j, 1) <> "-" If i > 70 Then Exit Sub End If FileNumber = FreeFile strREC = Cells(i + j, 1) Open strFilename For Append As FileNumber Print #FileNumber, strREC Close j = j + 1 Loop End If i = i + j Next End Sub さきほど初めてVBAなるものを知り、見よう見まねで書いてみましたが・・・ループに陥ったりテキストファイルが1つめしか出力されなかったりとうまくいきません。 改善点など教えていただけたら嬉しいです。 よろしくお願いします。

  • Excel2003でテキストのデータをセルに代入

    初めまして。 私はWindowsXPのExcel2003のVBAでテキストファイル のデータ(カンマ区切り)を指定したセル行に代入 したいと思っているのですが上手くいきません。 下記のコードを実行したところ、 Dim n As Long, buf As Variant, tmp As String Dim lrow As Long lrow = 14 n = FreeFile Open "C:\TEKISEI.txt" For Input As #n fname = "C:\TEKISEI.txt" Do Until EOF(n) Input #n, tmp lrow = lrow + 1 buf = Split(tmp, ",") Worksheets("Sheet1").Range("B14:B30") = buf Loop Close #n 指定したセル行(B14:B30)にテキストファイル (中身はカンマ区切りの数字の羅列)のデータの 最後の数字がセル行に入ってしまいます。 このコードでセル列(B14:P14)ならセルごとに 順に数字が代入されましたが、これをセル行に代入 したいと思っています。 どこが悪いのか皆様にご教授願います。

  • VBAでのテキストデータ追記

    VBAを使ってデータをテキストファイルに追記したいのですが、 A列だけじゃなく A列からF列までのデータを追記させたいと 考えているのですが、 どうやるのか理解できません。 教えていただけますでしょうか? -------------------------------------------------------------- Option Explicit ' テキストファイル書き出すサンプル Sub WRITE_TextFile() Const cnsTitle = "テキストファイル出力処理" Const cnsFilter = "テキストファイル (*.txt;*.dat),*.txt;*.dat" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「名前を付けて保存」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "出力するファイル名を指定して下さい。" ' (1) vntFileName = xlAPP.GetSaveAsFilename(InitialFilename:="SAMPLE.txt", _ FileFilter:=cnsFilter, _ Title:=cnsTitle) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す) With ActiveSheet If .FilterMode Then .ShowAllData ' オートフィルタ解除 End With GYOMAX = Cells(65536, 1).End(xlUp).Row ' (2) If GYOMAX < 2 Then xlAPP.StatusBar = False MsgBox "テキストをA列2行目から入力してから起動して下さい。", , cnsTitle Exit Sub End If ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(出力モード) Open strFileName For Output As #intFF ' (3) ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' (4) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)" ' レコードを出力 Print #intFF, strREC ' (5) ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル出力が完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTitle End Sub -----------------------------------------------------------------------------

  • Excel VBA読み込みで文字化けが

    Excel VBAにてメールデータを読み込むプログラムを組んでいます。 データの作り方は、 (1)Mozilla Thunderbirdでメールデータをtext形式で保存 (2)VBAにてtextデータを開く。 しかし読み込みを行うと、文字化けしたデータが表示されてしまいます。 どのように解決したらよいのでしょうか? 文字コード変換を行ってもダメでした。 Sub Read_mail_data() Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受け取り用 Dim strREC As String ' 読み込んだレコード名 Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のダイアログでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行わない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' 改行までをレコードとして読み込む Line Input #intFF, strREC ' 行を加算しA列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 ' 文字コードを変換する 'StrConv(strREC, vbFromUnicode) = a Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) Cells(GYO, 1).Value = StrConv(strREC, vbFromUnicode) ' セルにデータを書き込む 'Cells(GYO, 1).Value = strREC Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。 " & vbCr & "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • VBAで、ExcelシートにCSVファイルのデータを取り込みたいのです

    VBAで、ExcelシートにCSVファイルのデータを取り込みたいのですが、 1行目しか取り込めません。 取り込む項目数は32個です。 以下のコードでは、Excelシートの1行目のみ取り込みができますが、 1行目32列目のセルには、2行目のA列に表示されるべきデータも表示されます。 2行目以下は取り込みできていません。 Sub CSV取込() Dim OpenFileName As String Dim MyString As String Dim MyVar As Variant Dim i As Long, j As Long OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv") If OpenFileName = "False" Then MsgBox "キャンセルされました。" Else Open OpenFileName For Input Access Read As #1 i = 1 While Not EOF(1) Line Input #1, MyString MyVar = Split(MyString, ",") If MyVar(0) <> "" Then For j = 0 To 31 ThisWorkbook.ActiveSheet.Cells(i + 10, j + 1) = MyVar(j) Next j i = i + 1 End If Wend Close #1 End If End Sub おそらく、改行が判別できないためかと思いますが、 どこが間違っているのかがわかりません。 アドバイスをよろしくお願いします。

  • ブックに可変のファイル名テキストファイルからデータを取り込みたい

    こんにちは 昨日質問させていただいた、コードを修正して 開かれるファイル名が可変である場合にも対応させたいのですが、"*"をもちいてみてもうまく行きません。 どの様に指定するのかご存知の方教えてください。 "\Fuji.txt"これを\****.txt \*.txtとやってみましたがダメでした。 なお、041221_fuji.txtのように日付を6桁と"_"を入れてfujiとしたく、日付の6桁の数字のみ変えたいのです。 それを下記のコードに盛り込みたいのですが、何が足りないのかうまく行きません。 宜しくお願いします。 Sub ReadTxt() Dim myTxtFile As String Dim myBuf As String, wkdt() As String Dim i As Integer, j As Integer Application.ScreenUpdating = False myTxtFile = ActiveWorkbook.Path & "\Fuji.txt" Worksheets("郵便番号").Activate Open myTxtFile For Input As #1 Do Until EOF(1) Line Input #1, myBuf wkdt = Split(myBuf, vbTab) 'データをセルに展開する i = i + 1 For j = 0 To UBound(wkdt) Cells(i, j + 1) = wkdt(j) Next j Loop Close #1 End Sub

  • FSOでテキストファイルのデータをエクセルに書き出

    FSOでテキストファイルのデータをエクセルに書き出すには? http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_040.html を参考に、 メモ帳の中身をエクセルに書き出そうとしてるのですが、 参考サイトを自分なりにアレンジしてみたのですが、何も書き出されません。 Sub WRITE_TextFile3() Const cnsFILENAME = "C:\Windows\PrimoPDF Setup Log.txt" Dim FSO As New FileSystemObject ' FileSystemObject Dim TS As TextStream ' TextStream Dim strREC As String ' 書き出すレコード内容 Dim GYO As Long ' 収容するセルの行 Dim GYOMAX As Long ' データが収容された最終行 ' 最終行の取得 GYOMAX = Cells(Rows.Count, "A").End(xlUp).Row ' 指定ファイルをOPEN(出力モード) Set TS = FSO.CreateTextFile(Filename:=cnsFILENAME, Overwrite:=True) ' 2行目から開始 GYO = 2 ' 最終行まで繰り返す Do Until GYO > GYOMAX ' A列内容をレコードにセット(先頭は2行目) strREC = Cells(GYO, 1).Value ' レコードを出力 TS.WriteLine strREC ' 行を加算 GYO = GYO + 1 Loop ' 指定ファイルをCLOSE TS.Close Set TS = Nothing Set FSO = Nothing End Sub そもそも、 ' 最終行の取得 GYOMAX = Cells(Rows.Count, "A").End(xlUp).Row で、なぜ最終行を取得するのかがわかりません。 書き出そうとしているシートには何も入ってないので、 GYOMAXは1になります。 そして、 ' 2行目から開始 GYO = 2 で、なぜ 2行目から開始から開始するのかわかりません。 ご回答よろしくお願いします。

専門家に質問してみよう