2017-10-24 16 views
-1
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 
    Set KeyCells = Range("bw1:bw1000") 
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then 
    Range(Target.Address).Copy 
    Range(Target.Address).PasteSpecial xlPasteValues 
    End If 
End Sub 
+1

あなたの質問は何ですか? > [なぜ誰かが私を助けることができるのですか?]実際の質問ではありませんか?](https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-実際の質問) –

+1

あなたの質問/問題は何ですか –

+1

これは無限にprocするので、この問題はおそらく凍結します。コピー/貼り付けをしてからイベントを再度有効にする前にイベントを無効にする必要があります – tigeravatar

答えて

1

にはThisWorkbookモジュールにこのコードを入れて(しないシートモジュール)同じセルに値として貼り付け:

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 

    Dim KeyCells As Range 
    Dim ChangedCell As Range 
    Dim OldVal As Variant 
    Dim NewVal As Variant 

    'Adjust the name of the worksheet to be the name of the actual sheet containing the formulas in column BW 
    Set KeyCells = Me.Sheets("Sheet1").Range("BW1:BW1000") 

    If Sh.Name = KeyCells.Parent.Name Then 
     For Each ChangedCell In KeyCells.Cells 
      If ChangedCell.HasFormula Then 
       Application.EnableEvents = False 
       NewVal = ChangedCell.Value 
       Application.Undo 
       OldVal = ChangedCell.Value 
       Application.Undo 
       If NewVal <> OldVal Then ChangedCell.Value = NewVal 
       Application.EnableEvents = True 
      End If 
     Next ChangedCell 
    End If 

End Sub 

EDIT:からコメント当たり

OP: "ファイル内のすべての変更に対してマクロが実行されていますが、シート上のH57の値を変更すると、変更が発生するように制限できますか?"これを行うにはThisWorkbookモジュールから上記のコードを削除し、「モック」シートモジュールに以下のコードを入れて

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim KeyCells As Range 
    Dim ChangedCell As Range 
    Dim OldVal As Variant 
    Dim NewVal As Variant 

    If Target.Address = "$H$57" Then 

     Set KeyCells = ThisWorkbook.Sheets("Main.Data").Range("BW1:BW1000") 

     For Each ChangedCell In KeyCells.Cells 
      If ChangedCell.HasFormula Then 
       Application.EnableEvents = False 
       NewVal = ChangedCell.Value 
       Application.Undo 
       OldVal = ChangedCell.Value 
       Application.Undo 
       If NewVal <> OldVal Then ChangedCell.Value = NewVal 
       Application.EnableEvents = True 
      End If 
     Next ChangedCell 
    End If 

End Sub 
+0

変更されたセルにはまだ式があります。変更された値を値として貼り付けて、式をPasteSpecial xlPasteValuesのように削除します。 –

+0

@AJ_FELIX私はそれをテストして、数式を削除してその値のみを持つことを確認できます。結果が異なる場合は、キーセルの割り当てでシート名とセル範囲が正しいことを確認してください。 – tigeravatar

+0

@AJ_FELIXコードがThisWorkbookコードモジュールにあることも確認してください。 – tigeravatar

関連する問題