3

実行に数分から 1 時間かかる Excel VBA マクロがいくつかあります。実行の最後に、一連の並べ替えを行います。問題は、Excel にフォーカスがない場合 (つまり、別のウィンドウで何かをしている場合)、問題があり、Excel を閉じて再度開く必要があることです。何が問題なのかはわかりませんが、Sort.Apply を実行しようとすると発生することはわかっています。とにかく、Excelにフォーカスがあるかどうかを確認できますか?そうでない場合は、フォーカスを与えるか、チェックボックスをポップアップしますか?

更新:これがコードです。テストしたところ、失敗しました。エラーは、「オブジェクト 'Sort' のメソッド 'Apply' が失敗しました」、「実行時エラー '-2147417848 (80010108)':」です。

    With rws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("A7:A" & i _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("C7:C" & i _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A6:K" & i)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With

iシート内の数値から、またはソートの直前に取得される、ソート範囲の下限を持つ変数です。

毎回それを得るとは思いませんが、焦点を合わせ続ける以外にそれを防ぐ方法がわかりません. 私が今行っている方法は、ソート中であることをメッセージボックスに警告させることですが、これを完全に自動化しようとしているので、何か他のことをする必要があります.

更新:これが私の更新されたコードです。

    With rws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=rws.Range("A7:A" & i _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=rws.Range("C7:C" & i _
        ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange rws.Range("A6:K" & i)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With
4

2 に答える 2

2

範囲を正しく指定していないため、このエラーが発生しています。

Range("A7:A" & i)たとえば、前にシート名を追加します

ws.Range("A7:A" & i) 

where wsis は、ソートを行う必要がある関連シートです。この方法では、ウィンドウをアクティブにする必要はありません:)

編集

複数の Excel ウィンドウを開いていて、コードを含む Excel ファイル内のシートを並べ替える場合は、シート オブジェクトも完全修飾することを忘れないでください。例えば

Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("Sheet1")
于 2012-07-13T20:16:33.933 に答える
0

私はこれに何度か遭遇しましたが、どのように処理したかを正確に思い出せません。に変更.SetRange rws.Range("A6:K" & i)して.SetRange Range("A6:K" & i)、残りのコードをそのままにしてみてください。ワークシート オブジェクトで Range を再度修飾する必要があるかどうかはわかりません。これで問題が解決しない場合は、明日仕事で書いたコードを確認します。

編集: @RBarryYoung - あなたは正しいです。私はこれについて間違った方向に進んでいました。上記の提案はうまくいかないと思います。

私の他の唯一の提案は、ワークブックを別のインスタンスで実行することです。例えば:

Dim objXL as New Excel.Application
With objxl
.Workbooks.Open("C:\Someworkbook.xlsx")
.Visible = True ''or false
''Your Code Here
.ThisWorkbook.SaveAs("C:\Someworkbook.xlsx")
.Quit
End With

すべてのコードをWith objXLandで修飾する必要がありますEnd With(つまり、 cells(1,1)will become .cells(1,1)ThisWorkbookwill become .ThisWorkbook)。すでに多くのコードを記述している場合はちょっと面倒ですが、これにより、Excel はスクリプトを実行しているインスタンスのみを参照するようになり、フォーカスが失われるのを防ぐことができます。

于 2012-07-15T17:15:09.587 に答える