1

5 人のユーザーと共有し、継続的に使用するワークブックがあります。約 1800 のレコードと 26 列のデータがあります。データは、VLOOKUPS、標準値の混合です。実行中のマクロが 3 つ、条件付き書式ルールが 2 つ、およびダンプデータを含む 5 つのシート (17K レコードと 40 列のデータを含むシート) があります。

必要のない余分な機能をすべて削除し、それらを標準のテキストに置き換えようとしましたが、違いはわかりません。

ワークブックは継続的にクラッシュします。ワークブックに触れずにクリックしただけでもフリーズし、再び使用できるようになるまでに最大 10 分かかる場合があります。また、かなりのリソースを消費し (CPU が 100% に急上昇することもあります)、保存すると 100% の CPU を使用することにも気付きました。

ワークブックを高速化する方法、または少なくともファイルのクラッシュを停止する方法について、いくつかのアイデアを持っている人はいますか? :)


Sheet1(Voice)で呼び出されます

Private Sub Worksheet_Change(ByVal Target As Range)
    '43 = ok '41 = NOK

    'check if change happened in column A
    If Target.Column = 1 Then
      'check if changed value is X
      If Target.Value Like "*x*" Then
          'add datestamp if it is
          Cells(Target.Row, 43).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")
      Else
      End If

      If Target.Value Like "*NOK*" Then
          Cells(Target.Row, 41).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")
      Else
      End If
    End If

End Sub

ThisWorkbook で呼び出される

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Set shtVO = Sheets("Voice")
endRowVO = shtVO.Range("J" & Rows.Count).End(xlUp).Row

For Row = 2 To endRowVO
    If IsEmpty(shtVO.Cells(Row, 28).Value) = False Then
        If shtVO.Cells(Row, 3).Value <> shtVO.Cells(Row, 28).Value Then
            If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then
            Else
                shtVO.Cells(Row, 1).Value = shtVO.Cells(Row, 1).Value + "CheckDoneDate"
            End If
        Else
            If shtVO.Cells(Row, 3).Value = shtVO.Cells(Row, 28).Value Then
                If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then
                    shtVO.Cells(Row, 1) = Replace(shtVO.Cells(Row, 1), "CheckDoneDate", "")
                End If
            End If
        End If
    Else
            If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then
                shtVO.Cells(Row, 1) = Replace(shtVO.Cells(Row, 1), "CheckDoneDate", "")
            End If
    End If
Next Row

End Sub

モジュール 1 として呼び出される

Sub DateNow()

ActiveCell.Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")

End Sub

Sub UpdateLinks()
'
' Update Links
'
    'ActiveWorkbook.UpdateLink Name:="F:\VOICE.xlsm", Type:=xlExcelLinks
    'ActiveWorkbook.CalculateFull

End Sub

現在のステータス:私の回答を読んでください。

4

3 に答える 3

2

Excel の数式は、引数が変更されると (関数が揮発性の場合はセルが変更されると) 再計算されます。

あなたの場合の計算ワークフローの例は次のようになります。

  • Voice シートの列 1 のセルを変更します。
  • VLOOKUPデータ テーブルを参照するすべての が再計算されます。
  • Worksheet_Change変更されたセルに対して発生します。ハンドラーから、同じテーブルの列 41 または 43 を修正します。
  • VLOOKUPデータ テーブルを参照するすべての が再計算されます。
  • Worksheet_Change列 41/43 の変更されたセルに対して発生します。何もしません。

行ごとに、保存時に同じことが起こります。

あなたはできる:

  • VLOOKUP可能であれば、 s が列 41 まで見えないようにします。これにより、2 回目の再計算が不要になります。
  • 手動再計算に切り替えます。
于 2012-10-01T10:30:36.940 に答える
2

いくつかの可能性

あなたのWorksheet_Change変更イベントは、それ自体の別のトリガーを引き起こします。テストするセルは列 1 であり、列 41/43 で変更されるため、それほど悪くはありませんが、とにかく修正する価値があります。大きな違いはないかもしれません。

また、シートがアクティブでないときにシートの「Voice」セルがコードによって変更される可能性がある場合、予期しない結果が得られます。範囲呼び出しにシート修飾子を追加して修正します。

Private Sub Worksheet_Change(ByVal Target As Range)
'43 = ok '41 = NOK

'check if change happened in column A
If Target.Column = 1 Then
  'check if changed value is X

  Application.EnableEvents = False  ' <-- Add This

  If Target.Value Like "*x*" Then
      'add datestamp if it is
      Me.Cells(Target.Row, 43).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") ' <---
  ' Else   <--- don't need this
  'End If
  ' --> change to ElseIf (assuming conditions are mutually exclusive)
  ElseIf Target.Value Like "*NOK*" Then
      Me.Cells(Target.Row, 41).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") ' <---
  'Else   <--- don't need this
  End If
End If
Application.EnableEvents = True  ' <-- Add This

End Sub

同様の for -発火_BeforeSaveを避けるためにイベントを無効にする_Change

于 2012-10-01T10:39:14.570 に答える
1

OK、私がしたことは次のとおりです。新しいファイルを作成してクリーンアップすることから、不要なアイテムを処理しないようにマクロを編集することまで、全員のソリューションを実装しました(ただし、もう使用していませんが、まだコピーしています未来!)。

ワークブックを 2 つのワークブックに分割しました。1 つのワークブックと 1 つのシート (私たちがいつも使用するもの)。これには、VLOOKUPS、その他の関数、ボタン マクロ、および 2 つの条件付き書式が含まれます。ダンプ シートをすべて削除し、マクロの動作方法を変更しました (onchange または beforesave の代わりにボタンを使用)。

2 番目のファイルがトラブルシューティング ファイルになりました。これにはすべてのシートが含まれていますが、マクロや条件付き書式は含まれていません。最初のワークブックの 1 つのシートは、セルへの参照のみを使用して表示されます。このファイルは、トラブルシューティングにのみ使用されます。

  • 効率が良くなりそうです
  • ロード時間の短縮
  • クラッシュが少なくなりました (まだ発生しますが、常にではなく、たまにしか発生しません:P)

皆さんの時間と労力に感謝します。これが将来も人々を助けることができることを願っています. :)

于 2012-10-02T07:23:10.257 に答える