
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で飛ばせるのですが、その判定式が探しても見つかりません。
どなたかご教授よろしくお願いします。
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については、他の人も指摘されていますが、ローカル変数にするのは、サイズが大きいので、大域変数にするか、最終的にセルに格納するならセルに入れるようにしたらどうでしょう?
ありがとうございます!
出来ました。
256文字までしか読めないと言ったのですが、
デバックのクイックウォッチでBuf(i)を確認したら256までしか入ってなかったので「256までしか駄目なのか~」と思ってしまいました。
今Buf(i)をCellに書き出したらちゃんと読み込めてました。早とちりして申し訳ないです。
.skipLine '改行をスキップ
↑これ入れてなかった為エラーとなっていたようです。
とても参考になりました。ありがとうございます。
(Bufについては、実は300万超えのデータもあるようなのである程度読み込んだら書き出してクリアする等の方法を取ってみます。「大域変数」について調べてみたのですがちょいと難しそう@@)
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
No.5
- 回答日時:
>(正確には250万くらい)でも2文字ずつずれた状態ですが、全て確保はできました。
あっ、そうですか、入りましたか?
そんなにできるとは知りませんでしたね。
そのBuf は、後で、再び、Text あたりに出力するのでしょうか?そのために、Excelを使っているとしたら、多少、もったいないような気がしますが、シーケンシャルにするにしても、ランダムにするにしても、そのままではないですよね。
Excelで、シーケンシャルに入れていくのなら、静的領域のCells(i) [←この場合は左から右の横になる]で、データを埋め込む方法もありますね。
BLUEPIXYさん曰く
「Stringが256バイトまでしか読めないって本当ですか?」
私も同感です。
もし、そうなら、どちらかというと、WSH の Version の問題なのかもしれませんが。
Dim buf(30000000) As String
という組み方は、Excel 2000以上だったとは思いますね。
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 で確保していけばよいのではありませんか?
この回答への補足
ご回答ありがとうございます。
>最初に、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つの列に書き込んでいきます。
No.1
- 回答日時:
buf(i) = .read(10)
で、一項目ずつ読むのではなく
一行分のバッファを準備し、Readlineで一行分まとめて読み出し
そのバッファから、一項目ずつ拾い出せば改行コードを意識しなくても良いと
思いますが
注)関数内変数で、巨大なバッファを確保するとトラブルの元なので
バッファは静的領域に確保した方がよいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルの読みこみ方法とファ...
-
txtファイルの数字を計算
-
C or C++で2次元のデータの並び...
-
バイナリデーター内の文字を検索
-
データグリッドビューの一覧に...
-
Cocoa+Objective-Cで、CSVファ...
-
エクセルvbaでdocuworksprinter...
-
リストボックスに関連してファ...
-
エクセルのプロパティーでセキ...
-
Excelマクロのファイルサイズ
-
frxファイルの役目
-
【VBA】テキストファイルを指定...
-
エクセルのショートカットキー...
-
実行ファイルのパスを取得したい
-
ルミーズショッピングカート
-
URL正規化・www付き、無しそれ...
-
VB6.0 FileListBoxでフォルダ表示
-
[C#]FolderBrowserDialogのタイ...
-
ExcelのVBAでフォルダ指定がで...
-
タイムスタンプの更新の方法2
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
バイナリファイルの一部分をカ...
-
バイナリファイルでOutOfMemory...
-
DXFファイルをVBで取り込み、図...
-
Cで2次元配列にCSVファイルを...
-
配列操作について
-
日本語を配列に収め、そして表...
-
VBScriptの配列は、要素数を指...
-
テキストファイルを後ろから読...
-
CSVファイルによる検索の高速化
-
グレースケール画像の画素値を得る
-
ファイルをメモリに出力する方法
-
RGBのバイナリデータをCImageに...
-
C++による ファイルの読み込み
-
日本語混じりのファイルをラン...
-
VBAでテキストファイルの改行を...
-
VBでバイナリファイルのコピー...
-
[VBS] 16進数でバイナリファイ...
-
C言語でのファイル読み込み
-
Unicodeのファイル読み込みがう...
おすすめ情報