プロが教えるわが家の防犯対策術!

勉強しながら、エクセル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

A 回答 (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
    • good
    • 0

#1です。

補足頂いてありがとうございます。
半分判りましたが、私が知りたいのは、メモ帳に読みこませた時どういう風に見えるかと言うことです。
1 3656 247
2 14175 1257
3 なし↓

(A)247のあと1257のあとは↓なのか、改行+復帰
なのか
(B)なし↓のあとは改行+復帰があるのか
(B)は多分・・・なし↓なし↓16655 4135・・・
なのでしょうが。
(A)によって使う入出力ステートメントが違い、その後の
ロジックが大幅に変わります。と言っても数行のことですが。
    • good
    • 0

こんにちは。

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
    • good
    • 0

この質問文の中で、↓文字コードとしては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さんのではまだうまくいかないようで。。。
(ちょっと自分でも考えてみますが)

補足日時:2004/11/04 12:21
    • good
    • 0

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