2

私はVBAプログラマーの経験がなく、Excelの問題を見つけるためのコミュニティが必要です。

私の問題は、Excelで、次の行の直後にコードの実行が停止することです。 Application.ScreenUpdating = True

msdnWebサイトの次のサンプルコードを使用します。

Dim elapsedTime(2) 
Application.ScreenUpdating = True 
For i = 1 To 2 
    If i = 2 Then Application.ScreenUpdating = False 
    startTime = Time 
    Worksheets("Sheet1").Activate 
    For Each c In ActiveSheet.Columns 
        If c.Column Mod 2 = 0 Then 
            c.Hidden = True 
        End If 
    Next c 
    stopTime = Time 
    elapsedTime(i) = (stopTime - startTime) * 24 * 60 * 60 
Next i 
Application.ScreenUpdating = True 
MsgBox "Elapsed time, screen updating on: " & elapsedTime(1) & _ 
     " sec." & Chr(13) & _ 
     "Elapsed time, screen updating off: " & elapsedTime(2) & _ 
     " sec."

ソース: http: //msdn.microsoft.com/en-us/library/office/ff193498.aspx

ただし、Msgboxが実行されることはなく、VBAにエラーが表示されることもありません。サイレントに失敗するだけです。

なぜこれが起こっているのか、そしてそれを修正する方法は?

4

2 に答える 2

3

これは答えではありません。以前のポスターのように、私はこのルーチンを失敗させることができません。

まず、これは恐ろしいコードです。マイクロソフトがなぜこんなに悪いものを投稿したのか理解できません。例えば:

  • 経過時間は入力されません。(そうあるべきですDim elapsedTime(2) As Double
  • i、startTimeとstopTimeは定義されていません。
  • Activateは最初のループの時間指定ブロック内にあるため、Sheet1が最初にアクティブなシートでない場合、それをアクティブ化する時間が最初のループの期間に追加されます。
  • 2つのループの間で列が非表示になっていないため、2番目のループは何の関係もありません。ルーチンを2回実行すると、2つのループの継続時間は同じになります。

Excelにバグがありますが、これは非常にまれで、2、3年は発生しません。それに遭遇したとき、原因を突き止めて予定より遅れてしまい、次回の詳細を記録するのを忘れてしまうのに時間がかかります。Excelが停止せず、障害を報告しない特定のエラーがあります。代わりに、現在の関数を終了し、呼び出し元のルーチンの次のステートメントに進みます。このサブルーチンは直接呼び出されているため、終了せずに停止します。

私の唯一の提案は、このエラーの原因となるコンピュータのSheet1のこのコードに関する何かがあるということです。

あなたはそのApplication.ScreenUpdating = True声明が失敗していると思っているようです。これは可能ですが、ありそうにありません。MsgBoxあなたの説明から、あなたが知っているのは、ルーチンがステートメントに到達しないということだけです。

私は疑うc.Hidden = True。非表示の列の最大数について尋ねる質問を見たことがありますが、最大数を誰も知りませんでした。1つの答えは、マージされた領域の一部を非表示にすることはできませんが、そのエラーを複製することはできません。Sheet1を見てください。一部の列は非表示になっていますが、すべてではありませんか?列を再表示して、再試行してください。ルーチンは一貫した列で失敗しますか?1,024列のようなものを隠した後に失敗しますか?

どんな調査でも幸運を祈ります。ただし、この致命的なコードを破棄してApplication.ScreenUpdating = False、アクティブなワークシートを更新するルーチンの実行時間を短縮することを受け入れることをお勧めします。

于 2012-10-23T16:06:14.553 に答える
1

この状況では、一見したところすぐには見つからなかった次の問題がありました。

  • シートには自動検証ルールがあります
  • 自動検証ルールはユーザースペース関数に基づいています。つまり、マッチングのコードルールは次の式です。=NOT(IsValidCell(INDIRECT("RC";FALSE)))
  • この機能に問題があります。

baqdコードの例:

Function IsValidCell(ByVal CellValue As String) As Boolean
IsValidCell = False
If CellValue Like "#####" Then
    IsValidColumn = True ' Notice bug
Else ' Notice second bug
End Function

その結果、Excelがルールを再計算しようとすると、完全に分離されていないルーチンのコードが失敗します。

于 2012-10-24T09:31:32.083 に答える