2012-04-18 6 views
1

VBAコードを通じて細胞上のデータを変更しますのは、私はこのコラムでスプレッドシートを持っているとしましょうVBA Excelは、私は次のようにいくつかのVBAコードを書いた

[Cost1] [ Cost2] [Cost3] [にtotalCost] [マージン%] [証拠金$] [価格]

  1. 彼らはコストに依存しているため、ユーザは、コスト、総コストの変化とマージン$および価格を変更する場合と、利益率%
  2. ユーザーが価格を変更した場合、コストは変更されませんが、マージン%とマージン$は変更されます。これは、新しい価格に依存するためです。

私は、ユーザーは、このように式が消去されるだろう、その値を変更することもできますので、価格の列に保護された数式を追加することができませんでした。だから私は完璧な計算を行うVBAをコード化することに決めました。しかし、私はExcelの最も重要な機能のいくつかを失ってしまった。 1つの価格の値をいくつかの他の行にコピーしたい場合は、コピーされたばかりの行の再計算を開始しますが、他の行の再計算はトリガーしません。私はまた、セルを出た後にUNDOの能力を失った。セルが、私は次のように使用している修正されたことを検出する

Private Sub Worksheet_Change(ByVal Target As Range) 
    If (Target.Column = Range("Price").Column)     
    Call calcMargins(Target.Row) 
    End If 

    If (Target.Column = Range("Cost1").Column) or _ 
    If (Target.Column = Range("Cost2").Column) or _ 
    If (Target.Column = Range("Cost3").Column) or 
    Call calcMargins(Target.Row) 
    Call calcPrice(Target.Row) 
    End If 
+0

を使用しますか? – texasbruce

+0

数式を使用し、VBA(ダブルクリック/ボタン、/ etc)を使用して、ユーザーが望む場合に式を再確立することを検討しましたか? – CaBieberach

答えて

1

この

を試してみて、私は意図的であれば、いくつかの文と理解の視点の重複コードにコードを分解しています。たとえば、

 Cells(Target.Row, 4) = "Some Calculation"    '<~~ TotalCost Changes 
     Cells(Target.Row, 6) = "Some Calculation"    '<~~ Margin$ Changes 
     Cells(Target.Row, 7) = "Some Calculation"    '<~~ Price Changes 

一般的な手順で入力してください。

また、Error HandlingApplication.EnableEventsの使用にも注意してください。これらの2つは、Worksheet_Changeを使用する場合、である必要があります(MUST)。 Application.EnableEvents = Falseは、再帰的アクションがある場合にコードが可能な無限ループにならないようにします。 Error Handlingはエラーを処理するだけでなく、エラーメッセージを表示してApplication.EnableEventsTrueにリセットしてコードを正常に終了することで、コードが分割されないようにします。

コード

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    On Error GoTo Whoa 

    Application.EnableEvents = False 

    If Not Intersect(Target, Columns(1)) Is Nothing Then  '<~~ When Cost 1 Changes 
     Cells(Target.Row, 4) = "Some Calculation"    '<~~ TotalCost Changes 
     Cells(Target.Row, 6) = "Some Calculation"    '<~~ Margin$ Changes 
     Cells(Target.Row, 7) = "Some Calculation"    '<~~ Price Changes 

    ElseIf Not Intersect(Target, Columns(2)) Is Nothing Then '<~~ When Cost 2 Changes 
     Cells(Target.Row, 4) = "Some Calculation"    '<~~ TotalCost Changes 
     Cells(Target.Row, 6) = "Some Calculation"    '<~~ Margin$ Changes 
     Cells(Target.Row, 7) = "Some Calculation"    '<~~ Price Changes 

    ElseIf Not Intersect(Target, Columns(3)) Is Nothing Then '<~~ When Cost 3 Changes 
     Cells(Target.Row, 4) = "Some Calculation"    '<~~ TotalCost Changes 
     Cells(Target.Row, 6) = "Some Calculation"    '<~~ Margin$ Changes 
     Cells(Target.Row, 7) = "Some Calculation"    '<~~ Price Changes 

    ElseIf Not Intersect(Target, Columns(7)) Is Nothing Then '<~~ When Cost Price Changes 
     Cells(Target.Row, 5) = "Some Calculation"    '<~~ Margin% Changes 
     Cells(Target.Row, 6) = "Some Calculation"    '<~~ Margin$ Changes 
    End If 

LetsContinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 

私は1が保護され、その行を想定していますし、ユーザーがそのつもり変更ではありません。ヘッダ行が保護されていない場合、あなたは、行1

フォロー

を除外するIfステートメントをwithing行番号のチェックを持って、私は最初Cost1の(コストのいずれかを選択します)、Ctrl + Cを実行し、コスト3の下のすべてのセルを選択してCrl + Vを実行すると、値がコピーされますが、選択の前のセルのTotalCostが再計算されます。あなたの助けをあなたより! - 私はあなたが:)

をしようとしているかを見るロナルド・バルディビア24分前

ああはあなたの質問は、このコードに

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cl As Range 

    On Error GoTo Whoa 

    Application.EnableEvents = False 

    If Not Intersect(Target, Columns(1)) Is Nothing Then 
     For Each cl In Target 
      Cells(cl.Row, 4) = Cells(cl.Row, 1) + Cells(cl.Row, 2) + Cells(cl.Row, 3) 
     Next 
    ElseIf Not Intersect(Target, Columns(2)) Is Nothing Then 
     For Each cl In Target 
      Cells(cl.Row, 4) = Cells(cl.Row, 1) + Cells(cl.Row, 2) + Cells(cl.Row, 3) 
     Next 
    ElseIf Not Intersect(Target, Columns(3)) Is Nothing Then 
     For Each cl In Target 
      Cells(cl.Row, 4) = Cells(cl.Row, 1) + Cells(cl.Row, 2) + Cells(cl.Row, 3) 
     Next 
    End If 

LetsContinue: 
    Application.EnableEvents = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 
+0

ありがとうございますが、動作しません。私はちょうどコードをテストしましたが、同じ結果:1)取り消しは機能しません。2)複数のセルに値をコピーするとき、イベントは最初のセルのトリガだけです。 –

+0

1)元に戻すことはできません。これはデフォルトではvbaコードを実行するとき2)投稿する前にコードをテストしたので、www.wikisend.comなどでサンプルファイルをアップロードしてリンクを共有して見せることができたらお勧めします。 –

+0

1)元に戻すことを模倣する方法はありますか? 2)http://wikisend.com/download/563698/TestVBA.xlsmにサンプルコードを掲載しました。あなたの助けをありがとう!ほんとうにありがとう。 –

関連する問題