• ベストアンサー

VBAでテキストファイルの改行を無視する方法

VBAでテキストファイルにある文字列を配列の変数に格納したいのですが、改行が含まれているとそこから2バイトずつずれてしまいます。 1行毎に読もうとしても1行の文字列が6000バイトぐらいあるので変数に格納しきれません。 読み込むテキストファイルは _________0_________1_________2・・・・________10 _______100________51 のようになっており、10バイトずつ変数に格納していきたいです(スペースも格納する必要あり) 以下のように作ったのですが、改行のあるところからずれてしまいます。 Sub ファイル読み込み() Dim buf(30000000) As String Dim i As Long i = 0 With CreateObject("Scripting.FileSystemObject") With .OpenTextFile("C:\test.text", 1) Do While .AtEndOfStream <> True buf(i) = .read(10) Loop End With End With End Sub 「次の文字列が改行コードである」ということが分かれば.skipで飛ばせるのですが、その判定式が探しても見つかりません。 どなたかご教授よろしくお願いします。

  • kikei
  • お礼率70% (82/116)

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>改行のところでエラーとなってしまいます; i = 0 With CreateObject("Scripting.FileSystemObject") With .OpenTextFile("C:\test.text", 1) Do While .AtEndOfStream <> True Do While .AtEndOfLine <> True buf(i) = .read(10) i = i + 1 Loop .skipLine '改行をスキップ Loop End With End With てな感じでやっていますか? 一応ウチの環境ではこれでうまくいきました。 あと、Stringが256バイトまでしか読めないって本当ですか? OSは、なんでしょう? 最終的にセルに入らなかったからでは? bufについては、他の人も指摘されていますが、ローカル変数にするのは、サイズが大きいので、大域変数にするか、最終的にセルに格納するならセルに入れるようにしたらどうでしょう?

kikei
質問者

お礼

ありがとうございます! 出来ました。 256文字までしか読めないと言ったのですが、 デバックのクイックウォッチでBuf(i)を確認したら256までしか入ってなかったので「256までしか駄目なのか~」と思ってしまいました。 今Buf(i)をCellに書き出したらちゃんと読み込めてました。早とちりして申し訳ないです。 .skipLine '改行をスキップ ↑これ入れてなかった為エラーとなっていたようです。 とても参考になりました。ありがとうございます。 (Bufについては、実は300万超えのデータもあるようなのである程度読み込んだら書き出してクリアする等の方法を取ってみます。「大域変数」について調べてみたのですがちょいと難しそう@@)

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

私の書いていた話は、あまり理解されていないような気がしますから、論より証拠で、私の言っていたコードも公開しておきます。一行、6K のチェックもしました。ただ、その処理は、テキストで再びOutputするなら、Read_OutLine_Testのように配列のBuf はいりませんね。 Sub ReadLine_Test()  Dim Buf() As String  Dim Textline As String  Dim i As Long  Const myFname As String = "C:\Test.txt"  Open myFname For Input As #1  Do While Not EOF(1)   Line Input #1, Textline   If Len(Textline) > 1 Then    ReDim Preserve Buf(i)    Buf(i) = Left(Textline, 10)    i = i + 1   End If  Loop  Close #1 End Sub '--------------------------------------------- 'テキスト出力用 Sub Read_OutLine_Test()  Dim Buf As String '出力前段階のバッファ  'Dim Buf As String * 10 '固定長ならこちら,Buf = TextLine  Dim TextLine 'テキストInputデータ  Dim inFno As Integer 'in用ファイルNo  Dim outFno As Integer 'Out用ファイルNo  '読み込みデータ  Const InFname As String = "C:\Test.txt"  '出力データ  Const OutFname As String = "C:\Test2.txt"  inFno = FreeFile  Open InFname For Input As #inFno  outFno = FreeFile  Open OutFname For Output As #outFno  Do While Not EOF(1)   Line Input #inFno, TextLine   If Len(TextLine) > 1 Then    Buf = Left(TextLine, 10)    'Buf = TextLine    Write #outFno, Buf   End If  Loop  Close #inFno  Close #outFno End Sub

kikei
質問者

お礼

ご回答ありがとうございます。 おかげで対処することができました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

>(正確には250万くらい)でも2文字ずつずれた状態ですが、全て確保はできました。 あっ、そうですか、入りましたか? そんなにできるとは知りませんでしたね。 そのBuf は、後で、再び、Text あたりに出力するのでしょうか?そのために、Excelを使っているとしたら、多少、もったいないような気がしますが、シーケンシャルにするにしても、ランダムにするにしても、そのままではないですよね。 Excelで、シーケンシャルに入れていくのなら、静的領域のCells(i) [←この場合は左から右の横になる]で、データを埋め込む方法もありますね。 BLUEPIXYさん曰く 「Stringが256バイトまでしか読めないって本当ですか?」  私も同感です。 もし、そうなら、どちらかというと、WSH の Version の問題なのかもしれませんが。  Dim buf(30000000) As String という組み方は、Excel 2000以上だったとは思いますね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

まだ、良く質問がわかっていないのですが、いくつか疑問を感じています。 最初に、VBAとありますが、何のVBAですか?Excelですか?Wordですか?  buf(i) = .read(10) これって、10byte ではありませんよね。10語ですね。2byte 文字は存在しないのですか?それによって、コードは変わると思います。 FileSystemObject を使う必要があるのでしょうか? 単純なテキストファイルなら、Line Input ステートメントで、シーケンシャルモードで行が取れますね。 それから、なぜ、 Dim buf(30000000) As String 配列に、300万も必要ですか?VBAの配列の限界値そのものは知らないのですが、VBAでは、それだけの量になると、満杯になる前に、確保できないのではないでしょうか?数十メガになると思います。 Redim Preserve で確保していけばよいのではありませんか?

kikei
質問者

補足

ご回答ありがとうございます。 >最初に、VBAとありますが、何のVBAですか?Excelですか?Wordですか? ExcelのVBAになります。 >これって、10byte ではありませんよね。10語ですね。2byte 文字は存在しないのですか?それによって、コードは変わると思います。 失礼しました。10バイトではなく10語ですね。ですが2バイト文字は存在しません。 質問事項にも書いてありますが、1行の文字列が多いため読みきれません。 Dim buf as String ・ ・ buf = .ReadLine とやっても256バイトまでしか読みきれないのです。 あと配列が300万と定義していますが、実際に必要なんです。(正確には250万くらい)でも2文字ずつずれた状態ですが、全て確保はできました。 Outputは格納したデータを複数のシートにわけて 1つの列に書き込んでいきます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>「次の文字列が改行コードである」ということが分かれば.skipで飛ばせるのですが、その判定式が探しても見つかりません。 試してはいませんが、 AtEndOfLineが使えるのではないかと思います。

kikei
質問者

補足

回答ありがとうございます。 AtEndOfLineも試してみたのですが、 Do While .AtEndOfLine <> True buf(i) = .read(10) とやると、改行のところでエラーとなってしまいます;

  • Traja
  • ベストアンサー率19% (107/546)
回答No.1

buf(i) = .read(10) で、一項目ずつ読むのではなく 一行分のバッファを準備し、Readlineで一行分まとめて読み出し そのバッファから、一項目ずつ拾い出せば改行コードを意識しなくても良いと 思いますが 注)関数内変数で、巨大なバッファを確保するとトラブルの元なので   バッファは静的領域に確保した方がよいと思います。

関連するQ&A

  • VBA バイナリ―から文字列にする方法

    この度はお世話になります。 現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。 バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。 そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。 Sub 電文解析プログラム() Dim Deciphering_file As Variant '読み込みファイル Dim buf As Byte '1バイト格納 Dim fLen As Long 'ファイルサイズ Dim TEMP(1) As String ' Dim S_JIS As String '文字コード(2バイト) Dim str As String '文字列データ Dim i As Long Deciphering_file = Application.GetOpenFilename("BINファイル(*.bin),*.bin") fLen = FileLen(Deciphering_file) Open Deciphering_file For Binary As #1 For i = 1 To fLen Get #1, i, buf S_JIS = Hex(buf) If buf = 0 Then S_JIS = "00" End If TEMP(0) = Mid(S_JIS, 1, 1) TEMP(1) = Mid(S_JIS, 2, 1) str = myChr & TEMP(0) & TEMP(1) Next i End Sub ホントは3行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

  • ExcelVBAマクロでワードファイル書き込み方法

    ExcelVBAマクロについて確認させてください。 下記のように読み込みたいWordファイルをフォームで指定して Wordファイルの内容を変数aに読み込ませてます。 変数Xにある任意の文字列を代入し、変数aでその変数Xが検索された場合は その検索された文字列全てを赤文字にして別の名前で保存という方法は可能でしょうか。 可能であればその方法をご教授下さい。 以上、よろしくお願いいたします。 ---------------------------------- Sub sample() Dim buf As String Dim a As String buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル") 'フルパスも含めたファイル名をbufに代入 With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream '指定したファイルを開く a = .ReadAll 'テキスト文書の内容を文字列aに代入 .Close '指定したファイルを閉じる End With End Sub

  • ExcelVBAマクロでワードファイル読み込み方法

    ExcelVBAマクロについて確認させてください。 下記のように読み込みたいファイルをフォームで指定して それを変数aに読み込ませています。 ですが、この方法ではテキスト文書しか読み込みが出来ないようです。 ワードファイルも読み込むように設定したいのですが可能でしょうか? 可能でしたらその方法をご教授いただけますでしょうか。 ---------------------------------- Sub sample() Dim buf As String Dim a As String buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル") 'フルパスも含めたファイル名をbufに代入 With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream '指定したファイルを開く a = .ReadAll 'テキスト文書の内容を文字列aに代入 .Close '指定したファイルを閉じる End With End Sub

  • エクセルに二つのテキストファイルをインポートしたい

    エクセルのsheet1の1行目にタイトルがあります。 ボタンのクリックイベントで、テキストファイル2つをインポートしたいのですが。 ・テキストファイルの名前は、固定ではありません ・テキストファイルの保存先は、デスクトップで、ファイルの選択は自分でしたい ・テキストファイルの一行目は、タイトル行なので、二行目以降をインポートしたい 行数は固定ではありません ・タブ区切りです 複数選択はできなく、1ファイルでタイトル行も含めるのであれば下記コードできたのですが。 どなたか、ご教示いただけますでしょうか・・・・ よろしくお願いいたします。 ----------------------------------------------------- Sub ReadTextFile() 'タブ区切りファイルを全て文字列として読み込む Dim FileName As String Dim i As Long Dim Cnt As Long Dim Buf As Variant Dim FileNo As Integer Dim SplitString As Variant 'ファイルダイアログを表示 FileName = Application.GetOpenFilename("テキストファイル,*.txt") If FileName <> "False" Then '全セル選択して書式を文字列にセットする Cells.Select Selection.NumberFormatLocal = "@" Cells(1, 6).Select '空いているファイル番号を取得 FileNo = FreeFile() Buf = Space(FileLen(FileName)) 'ファイルを開いてbufに1行読み込み ' → タブで配列に分割 ' → セルに書き出し Open FileName For Input As #FileNo Do Until EOF(FileNo) Line Input #FileNo, Buf Cnt = Cnt + 1 SplitString = Split(Buf, vbTab) For i = 0 To UBound(SplitString) Cells(Cnt, i + 1) = SplitString(i) Next i Loop Close #FileNo Else End If End Sub -----------------------------------------------------

  • ExcelVBAマクロでテキストボックスの値の代入

    ExcelVBAマクロについて確認させてください。 下記のように読み込みたいファイルをフォームで指定して それを変数aに読み込ませています。 この方法の他に、ユーザーフォームでテキストボックスを 作成してテキストボックス内で文字を記入してその文字を 変数aに読み込ませることは可能でしょうか。 可能であればその方法をぜひご教授ください。 ---------------------------------- Sub sample() Dim buf As String Dim a As String buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル") 'フルパスも含めたファイル名をbufに代入 With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream'指定したファイルを開く     a = .ReadAll'テキスト文書の内容を文字列aに代入     .Close'指定したファイルを閉じる End With End Sub

  • 配列格納時にスペース、セル内改行を無視したい。

    ExcelVBAで、配列に文字列を一文字ずつ格納する方法について質問します。 以下の(1)の機能において改行や、全半角スペースは無視して格納したい のですが、方法が判りません。教えてください。よろしくお願いします。 下記のマクロは、 (1)A1セルに記載された文字列を,1文字ずつ配列aに格納し、 <現行では、a(n,0)には、左からn文字目、a(n,1)には右からn文字目の文字が格納される> (2)B列、C列に1それぞれの文字を順々に1文字ずつ順次転記し、 (3)B列の文字のうち”ー”を”~”に変更する マクロです。これの出力結果を、添付画像の赤枠内にようにしたいというのが、質問の内容です。 よろしくおねないします。 【マクロのソース】 Public a() As Variant Public s As String Sub Macro1() Dim n As Long, i As Long s = Range("A1") n = Len(s) Call submacro(n) Call submacro2(n) Call submacro3(n) End Sub Sub submacro(n As Long) Dim ss As String ReDim a(n - 1, 1) For i = 1 To n ss = Mid(s, i, 1) a(i - 1, 0) = ss a(n - i, 1) = ss Next i End Sub Sub submacro2(n As Long) Dim i As Long For i = 1 To n Cells(i, 2) = a(i - 1, 0) Cells(i, 3) = a(i - 1, 1) Next i End Sub Sub submacro3(n) Range("B1").Resize(n, 1).Select Selection.Replace What:="ー", Replacement:="~", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub 【関連質疑】 http://okwave.jp/qa/q7479718.html

  • Word VBA テキストボックスのフォントサイズ

    Wordでマクロを組んでいます。 文書内から取得した値を変数へ格納し、複数の変数をつないでテキストボックスに入れ、文書へ追加しています。 このテキストボックスの文字のフォントサイズを前と後ろで変えたいのですが、色々試していますがうまくいきません。 お分かりになる方がいらっしゃいましたら教えてください! 以下コードです。 下記の「EIJI」のみフォントサイズを20ptにしたいのです。 変数に格納する文字列は都度変化し、文字数も変わります。 よろしくお願いします! Sub try() Dim KANA As String, KATAKANA As String, EIJI As String KANA = "あああ" KATAKANA = "アアア" EIJI = "AAA" Dim myTxt As String myTxt = KANA & "/" & KATAKANA & "/" & EIJI Dim objTextBox As Object Set objTextBox = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 25, 20, 530, 25) objTextBox.Select With Selection .Font.Size = 16 .TypeText Text:=myTxt End With End Sub

  • テキストファイルから改行コードを削除して読込む方法

    ExcelエクセルVBAマクロについてテキストファイルから改行コードを取り除いて 変数に読み込む方法について確認させてください。 下記のVBAログラムはWordファイルをテキストファイルに落としたファイルを変数aに 読み込んでいます。 このとき、読み込んだテキストファイルはWordファイルをテキストファイルに 落とし込んだファイルなので改行コードが残ってしまいます。 この改行コードを削除したうえで変数aに読み込みたいのですが可能でしょうか。 改行コードはメモ帳では「↓」と下矢印に似た文字で表示されます。 (実際には下矢印ではないようです。) 今のところ、Replace関数で改行コードを削除するプログラムを 考えているのですが、改行コードのVBAでの表現方法が分からないので 先に進むことが出来ません。いい案があればぜひご教授下さい。 あるいはほかの方法でも改行コードが削除出来れば結構です。 またこの変数aに読み込んである文字列からかぎカッコの内部にある文字を 抽出してエクセルの行方向に出力する方法があればご教授頂ければ幸いです。 例えば “あなたは「こんにちは」と言いました。 私は「元気ですか」と聞きました。” が文字列aに読み込んである場合、“こんにちは”、“元気ですか”を抽出して エクセルに順に出力という方法です。 色々と書きましたが、よろしくお願いいたします。 以下、VBAプログラム本文です。 ---------------------------------- Sub sample1() Dim a As String a = CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Readall CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Close End Sub

  • VBA教えて下さい

    for nextの使い方がわかりません 変数を使用し条件に当てはまる数値だけ 処理するといった内容です 考えたコード sub test() dim a as variant dim b as variant dim i as variant with workbooks("book1").activesheet set a =.range("A5") set b =.range("B5") end with with workbooks("book2").activesheet for i = 80 to 110 if a = cells(i,1) then b.value = cells(i,2) end if next i end sub このコードにてやりたい事は まず、book1の今開いてるシートを参照し A5セル、B5セルをセットし (例えばA5は2と入力している B5セルは10000と入力している) 次に、book2の今開いてるシートを参照し もし、1行目の80~110どれかのセルの数字が 変数aと同じ値ならば (A行80~110行のセルの数字2があれば 例えば85列) 変数bの数字を2行目の80~110に条件に当てはまるセルに移す (B行85列にB5セルの値10000を移す) ()の部分は例えで書いてます 読みにくかったら無視でお願いしますm(__)m 指定の仕方など間違ってると思うので コードを書いてくれると助かります 回答お願いしますm(__)m

  • 【VB.Net】バイト型配列に読み込んで改行区切り

    教えて下さい。 ファイルをバイト型配列に読み込んで、ある固定長に区切(改行)って出力したいです。 以下簡単にサンプルとして作っているのが以下です。 【読み込みファイル.txt】 ---------------------------------------------------------------------------------- AB ---------------------------------------------------------------------------------- このテキストファイルの内容(byte型では、"41 42")を1バイトづつに改行で区切りたいです。 【VB.Net】 ---------------------------------------------------------------------------------- Dim BUFSIZE As Integer = 1 ' 1バイトづつ処理 Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ Dim readSize As Integer ' Readメソッドで読み込んだバイト数 Dim srcName As String = "C:\Temp\読み込みファイル.txt" ' 読み込みファイル名 Dim dstName As String = "C:\Temp\書き込みファイル.txt" ' 書き込みファイル名 Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read) Using dest As New FileStream(dstName, FileMode.Create, FileAccess.Write) While True ' 1バイト読み込み readSize = src.Read(buf, 0, BUFSIZE) ' 読み込むものが無ければ終了 If readSize = 0 Then Exit While ' 改行いれたい部分(動かないけど、、、) buf = (0D,0A) ' 書き込み dest.Write(buf, 0, BUFSIZE) End While End Using End Using ---------------------------------------------------------------------------------- ↓ 理想の処理後 【書き込みファイル.txt】 ---------------------------------------------------------------------------------- A B ---------------------------------------------------------------------------------- 重要なのはバイト型で処理を行いたいです。(文字列ではない) すいませんがよろしくお願いします。

専門家に質問してみよう