0

私は時々htmlファイルをExcelに変換する必要があります。テーブルを含む約9000個のhtmlファイルがあります。

Excel 2007 vbaを使用してそれらを変換し、その仕事をするためのマクロを作成すると便利だと思います。ワークブックのマクロを停止するExcelのバグを考慮しました。Shiftキーを押すと機能を開きます。アラート、イベント、画面の更新を行い、他のことをしているときに邪魔をしたくないので、アプリケーションを非表示にします。

'Declare API
Declare Function GetKeyState Lib "User32" _
(ByVal vKey As Integer) As Integer
Const SHIFT_KEY = 16

Function ShiftPressed() As Boolean
'Returns True if shift key is pressed
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0
End Function

Sub ConvertHtmlToExcel()
    Dim wb As Workbook
    Dim strFile As String
    Dim strPath As String

    With Application
        .EnableEvents = False
        .DisplayAlerts = False
        .ScreenUpdating = False
        .Visible = False
    End With

    strPath = "c:\FolderToConvert\"
    strFile = Dir(strPath & "*.html")

    Do While strFile <> ""
        Do While ShiftPressed()
            DoEvents
        Loop
        Set wb = Workbooks.Open(strPath & strFile)
        strFile = Mid(strFile, 1, Len(strFile) - 5) & ".xls"
        wb.SaveAs strPath & strFile, XlFileFormat.xlWorkbookNormal
        wb.Close
        Set wb = Nothing
        strFile = Dir
    Loop

    With Application
        .EnableEvents = True
        .DisplayAlerts = True
        .ScreenUpdating = True
        .Visible = True
    End With
End Sub

マクロは問題ないようですが、実行すると、1分あたりのコンバージョン率は次のようになります。

  1. 40
  2. 31
  3. 25
  4. 21
  5. 19
  6. 18

そして、500ファイルが変換された後も現在は減少し続けています。現在の速度は1分あたり8です。

2359ファイル後、速度は1分あたり2に減少しました。テストすると、visible = trueであり、ワークブックを開くのに時間がかかることがわかりました。

したがって、問題はWorkbooks.Openにあるように見えます。ループの開始時に可能な限り高速に動作しますが、それ以降のループでは速度が低下し始めます。

誰かがこれにつまずいたことがありますか?回避策はありますか?私のコードには何かが欠けていますか?また、マクロがまだ実行を停止することがあります。Shiftキーがその関数によってキャッチされなかったと思います。

4

1 に答える 1

2

Excel 内で "シフト バイパス" 関数をオーバーライドする標準的な方法はありません (Access の "AllowByPassKey" プロパティとは異なります)。適用したコードに問題がある場合 (試したことはありません)、アドインの作成を検討しましたか?

http://msdn.microsoft.com/nl-nl/library/aa671739(v=vs.71).aspx マイクロソフトのサイトでは、明示的に言及されています。

Excel アドインと一般的なブック ファイルを区別するいくつかの特徴があります。

  • ユーザーは、SHIFT キーを使用して、アドインに組み込まれているイベントをバイパスすることはできません。この機能により、アドインに記述したイベント プロシージャが適切なタイミングで実行されるようになります。

速度に関して:ループ内の「ワークブック」オブジェクトにメモリを正しく割り当て(.open)および解放(何も設定しない)しているように見えるため、プロセス中にRAMで使用するメモリが増加したり遅くなったりすることはありません。

この興味深いスレッドは説明を提供することができます:

http://www.add-ins.com/support/out-of-memory-or-not-enough-resource-problem-with-microsoft-excel.htm

「上記のテストから到達した結論は、VBA アドインは大量のメモリを使用しないということです。ワークブックはメモリの主要なユーザーです。また、Excel はワークブックが閉じられたときにすべてのメモリを解放するわけではありません。これは、閉じる方法の 1 つをサポートしています。多くの作業を行った後、Excel を再起動します。少なくとも 2 時間に 1 回、Excel を閉じて再度開く必要があります。」

おそらく、毎回新しいアプリケーションを設定し、application.quit を使用して試してみる価値があります。これにより、使用されている Excel アプリケーション全体がメモリからクリアされます。

 Dim appExcel As Excel.Application

 Set appExcel = CreateObject("Excel.Application")
 appExcel.Workbooks.Add
 'Do smtg
 appExcel.Quit

これがうまくいくことを願っています!興味深い質問です!

于 2012-06-29T09:23:23.947 に答える