0

現在、テキスト ファイルを解析し、特定のルールセットに従って Excel シートのセルを埋める Excel マクロを再構築しています。私の新しいバージョンは、1 週間の結果を合計するのではなく、はるかに長い期間にわたるファイルを毎日処理することになっています。ただし、これらの大きなファイルを取得して以来、分割コマンドは何も返さないようです。

    rawDataArray = Split(rawData, Chr$(10))

ソース テキスト ファイルから読み込んだデータが rawData 文字列に含まれていることがはっきりとわかります。また、ファイルを 16 進エディタで開いて、必要な chr(10) が存在することを確認しました。操作が実行された後でも、rawDataArray はまだ空です。

以前のバージョンでは、せいぜい数千文字のテキスト ファイルしか処理できず、問題なく動作していました。現在のファイルの長さは約 500.000 文字で、これが機能しない唯一の (最初の ;)) 行であり、分割コマンドが処理できる文字列の長さに上限があるのではないかと思いました。これは本当でしょうか?もしそうなら、それはどのくらいですか?

また、オフィスで Office 2007 から Office 2010 に切り替えたことが原因でしょうか? vbscript のバージョンが同じように動作するかどうかはわかりませんが、これも要因である可能性があります。

よろしくお願いします!

編集:解決策で自分の投稿に答えるのが慣習であるかどうかはわかりませんが、ここに行きます.

分割コマンドはそのような大きな文字列を処理できないようです。ファイルを〜7k文字に減らしてみましたが、うまくいきました。正確な数はまだわかりませんが、少なくともこれが理由のようです。また、vbscript と VBA に関する訂正をしてくれた Avner に感謝します。私はプログラミングやスクリプト作成に関しては独学なので、新しいことを学びました。

Avner さん、訂正ありがとうございます

4

2 に答える 2

1

Excel マクロは、VBScript ではなく VBA で記述されます。VBA の制限が問題になることはありません。どちらかといえば、コンピューターの RAM が限界かもしれません。これは Office 2010 のVBA ドキュメントからのもので、Office 2007 にも当てはまります。

文字列には、可変長文字列と固定長文字列の 2 種類があります。

  • 可変長文字列には、最大で約 20 億 (2^31) 文字を含めることができます。
  • 固定長文字列には、1 から約 64K (2^16) 文字を含めることができます。

問題は、Splitメソッドが巨大な文字列をうまく処理できないことだと思います。おそらくMid、ループ内で使用してチャンクに分割し、Split個別に呼び出すのが最善ですが、これには別の問題があります。

于 2012-08-19T12:53:20.263 に答える
0

Split は、任意のサイズの文字列を処理できます。単純なサブで分割機能を確認しました(Excel 2010では、2007でも同じように機能するはずです)

Public Sub TestSplit()

    Dim Count As Long
    Count = 1000000

    Dim x
    ReDim x(Count)

    Dim i As Long
    For i = 1 To Count
        x(i) = "My String " & i
    Next

    Dim RawString As String
    RawString = Join(x, Chr(10))

    Debug.Print "RawString length = " & Len(RawString)

    Dim SplitArray
    SplitArray = Split(RawString, Chr(10))

    Debug.Assert UBound(SplitArray) = Count

End Sub

Output:
RawString length = 16888896

ソースファイルの読み取りには何かがあるはずです。rawData 変数に chr(10) 文字が含まれていますか? instr 関数で確認することをお勧めします。

InStr(RawString, Chr(10))

0 より大きくなければなりません。ただし、この場合でも、rawDataArray には、rawData 文字列全体を含む 1 つの要素が含まれている必要があります。

于 2012-08-20T11:06:35.007 に答える