- ベストアンサー
エクセルVBA:テキストデータ(txt)の読込(改行が変なところでされる)
勉強しながら、エクセルVBAを組んでみたのですが うまくいきません。 テキストデータを以下のようなプログラムで読んだのですが (100行のデータを縦に並ぶように100個のセルの書き出す) 読み込みデータに「↓」で改行されているところでは 「↓」の間は同一行と見なされてしまうのですが どのようにしたら一行で一つのデータと見てくれるのでしょうか? 分かる方がいましたら教えて下さい。 よろしくお願いします。 Sub pon() '*** 変数の宣言 *** Dim filenum As String Dim i As Integer Dim num As Integer, ms As String, cnt As Integer Dim BookName As String, PathName As String Dim ca As String cnt = 1 i = 1 ca = Cells(1, 56) PathName = "C:\" textpath = Dir(PathName & "pon" & ca & ".txt") BookName = Dir(PathName & "pon" & ca & ".txt") Open PathName & BookName For Input As #1 'ファイルを開きます Do While Not EOF(1) Line Input #1, ms cnt = cnt + 1 Cells(1, 57) = BookName 'データの書き出し Cells(cnt, 56) = ms 'データの書き出し Loop Close #1 End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
FileSystemObjectを使って入力すれば、改行コードに悩まされることなく同じようにプログラムできます。 Public Sub pon() Dim objFs, file, filename, BookName Dim cnt Dim ca, ms Set objFs = CreateObject("Scripting.FileSystemObject") ca = Cells(1, 56) filename = "C:\pon" & ca &".txt" BookName = dir(filename) Set file = objFs.OpenTextFile(filename, 1) 'read Only Cells(1, 57) = BookName 'データの書き出し cnt = 1 Do Until file.AtEndOfStream ms = file.ReadLine cnt = cnt + 1 Cells(cnt, 56) = ms 'データの書き出し Loop file.Close End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。補足頂いてありがとうございます。 半分判りましたが、私が知りたいのは、メモ帳に読みこませた時どういう風に見えるかと言うことです。 1 3656 247 2 14175 1257 3 なし↓ の (A)247のあと1257のあとは↓なのか、改行+復帰 なのか (B)なし↓のあとは改行+復帰があるのか (B)は多分・・・なし↓なし↓16655 4135・・・ なのでしょうが。 (A)によって使う入出力ステートメントが違い、その後の ロジックが大幅に変わります。と言っても数行のことですが。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 No.1の方の補足とちょっと訂正を交えて。 「↓」はNo.1の方の指摘の通り、文字コード10のラインフィード(VBではvbLf)です。 通常改行に使用されるのは、このラインフィードの他に、文字コード13(12ではない)のキャリッジリターン(VBではvbCr)があります。 通常のWindowsの改行は、 キャリッジリターン+ラインフィード の2文字で1つです。(VBではvbCrLf、文字コード13→10の順) また、Macでは、キャリッジリターンのみが改行として扱われます。 この、vbCrLf(13+10)とvbCr(13)が、Openステートメントでは改行として判断されます。 vbLf(10)だけでは改行とは判断されません。 (ちなみに、Excelでは文字コード10はセル内改行として使用されています。) 方法としては、Line Inputで読み込んだデータを、vbCrのみで連結して、1つのデータにしておきます。 Dim alldata As String ・・・・・ Do While Not EOF(1) Line Input #1, ms alldata = alldata & ms & vbCr Loop という風に。 そして、最後まで読み込みが終わったら、全データで、 vbLf → vbCr に置換してやります。 alldata = Replace(alldata, vbLf, vbCf) これを、Split関数でvbCrで分割してやればいいでしょう。 Dim myArray As Variant ・・・・・ myArray = Split(alldata, vbCr) For i = 1 To UBound(myArray) Cells(i + 1, 56).Value = myArray(i) Next i
- imogasi
- ベストアンサー率27% (4737/17069)
この質問文の中で、↓文字コードとしては10、文字ではCHR(10)改行コードがテキストファイルに入っているはずです。 エクセルへデータをセットした時に下行に移るのは, 改行復帰CHR(10)+CHR(12)(VBではvbcrlf)が現れたときです。 従ってCHR(10)だけでは、下の行に移らないのは当然です。 だからテキストデータを変えられないのなら、プログラムでINSTR関数でCHR(10)を探し、そのタイミングで、Cells(i、j)を使う場合なら、i=i+1することになります。 実例でテキストデータの様子を実例で挙げてもらわないと 上記のヒントでやり方が判ればよいですが、サンプルプログラムが組めません。知りたいのは区切り文字の様子とか↓のあり様です。
補足
回答ありがとうございました。 言葉足らずですみませんでした。 実例データは以下の通りです。 1 3656 247 2 14175 1257 3 なし↓ 4 なし↓ 5 16655 4135 6 なし↓ 7 なし↓ 8 なし↓ 9 14662 1936 10 85977 32589 ちなみに「なし」が表れるのは不規則です。 「なし」以外は通常の改行です。 marumaru01さんのではまだうまくいかないようで。。。 (ちょっと自分でも考えてみますが)