こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

テキストデータ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

投稿日時 - 2020-09-12 01:57:34

QNo.9797899

困ってます

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

読み込みたいファイルは、
カンマ区切りのテキストファイルで
拡張子が、.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

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2020-09-12 09:47:17

お礼

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

投稿日時 - 2020-09-12 19:07:36

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

No.1に少し補足します.
私は Excelにできることは Excelにやらせる主義なので.
理由は,そのほうがコーディングが簡単になるし,処理速度も速いからです.なので,私なら次のようにします.

(1) の処理は,GetOpenFilenameなど好きな方法で良いでしょう.
(2) の処理は,Excelの「外部データの取り込み」の「テキストファイル」をマクロ記録して使用します.
 文字コードを選択できるので,ここで文字化けしないコードを選択してください.
 記録されたマクロのファイルパスの部分を (1)で取り込んだファイル名に変数で置き換えれば OKです.
(3)(4) の処理は,cvsファイルを取り込んだワークシートにフィルタを掛けて,データがある行のみ抽出し,それを Excel関数が入力されているワークシートにコピペします.

csvファイルの選択以外は,マクロの記録だけで済むはずです.

投稿日時 - 2020-09-12 09:11:02

お礼

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

投稿日時 - 2020-09-12 19:15:20

ANo.1

まず、Excelにはcsvファイルを開く機能があるので、それで開いてみてください。
それでも文字化けしますか?

私なら、上記の方法で開いてから成形処理します。

投稿日時 - 2020-09-12 06:17:32

あなたにオススメの質問