VBA Excel中通过VBA代码
我已经写了一些VBA代码以下修改对细胞的数据:VBA Excel中通过VBA代码
- 比方说,我有此列的表格
[COST1] [ Cost2] [COST3] [TOTALCOST] [页边距%] [保证金$] [参考价格]
- 如果用户因为它们依赖于成本和修改成本,总成本变化和保证金$和价格保证金%
- 如果用户修改价格,成本不会改变,但保证金%和保证金$确实会发生变化,因为它们取决于新的价格。
我无法将受保护的公式添加到Price列,因为用户可能想要更改该值,因此公式将被删除。所以我决定编写完美的计算方式的VBA。但是,我失去了一些最重要的excel功能:例如如果想将一个价格的值复制到其他几行,它只会触发第一行的重新计算,而不是其他行。退出单元后,我也失去了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
试试这个
我刻意打破代码为几个if语句和重复的代码理解的角度。例如
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 Handling
和Application.EnableEvents
。当与Worksheet_Change
一起工作时,这两个是MUST。 Application.EnableEvents = False
确保代码在进行递归操作时不会进入可能的无限循环。 Error Handling
不仅可以处理错误,还可以通过显示错误消息来停止代码分解,然后将Application.EnableEvents
重置为True
并最终正常退出代码。
代码
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行是受保护的用户是不会改变这一点。如果标题行是不受保护的,那么你将有检查的行号withing的If
语句排除行1
随访
我选择成本之一(第一COST1的),按Ctrl + C,选择Cost 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
谢谢,但它不起作用。我只是测试了代码,但结果仍然相同:1)撤销不起作用,2)将值复制到多个单元格时,只有该事件仅触发第一个单元格。 – 2012-04-18 14:42:28
1)撤消将不起作用。这是默认情况下,当你运行vba代码2)我在发布之前测试了代码,所以我会建议你是否可以在www.wikisend.com上面上传示例文件,并在这里分享链接,以便我可以看看它。 – 2012-04-18 14:52:05
1)有没有办法模仿撤消? 2)我在http://wikisend.com/download/563698/TestVBA.xlsm上发布了我的示例代码。非常感谢你的帮助!对此,我真的非常感激。 – 2012-04-18 16:50:33
你的问题是什么? – texasbruce 2012-04-18 13:56:13
您是否考虑过使用公式并使用VBA(双击/按钮,/ etc)重新建立公式以防万一用户想要? – CaBieberach 2012-04-18 13:57:59