VBA新手但很难学习。我最近为一位正在工作的女士用IF Then Else写了一个宏。不幸的是,她并不像计算机那样精通并且不想在列表中找到宏,所以我想我会使用命令按钮用户表单并调整代码以循环遍历单元格而不是从活动单元格变为活动单元格细胞。可悲的是,我在For For循环中遇到了If Then Else的问题。
这是原始的非循环编码宏
Sub InvoicesTotalDue()
Dim myRange As Range
Set myRange = Application.InputBox(Prompt:="Select an Invoice Type Then Hit Enter", Type:=8)
'person is on active cell and selects cell in Type column of corresponding row of active cell
If myRange.Cells.Value = "Cancel300" Then
ActiveCell.Value = 300
ElseIf myRange.Cells.Value = "Cancel350" Then
ActiveCell.Value = 350
Else
ActiveCell.FormulaR1C1 = "=Product(100,[@Hours])"
End If
End Sub
这很有效,但用户发现它很乏味,并且不习惯使用宏。所以我认为一个用户形式命令按钮循环遍及该范围,并在最后一列中填入相应的值对她来说是最好的。这就是我认为应该有效的方式。
Sub InvoicesTotalDue()
Dim myRange As Range
Set myRange = Application.Range("Invoices[Type]")
For each cCell in myRange
If myRange.Cells.Value = "Cancel300" Then
[TotalDue].Cell.Value = 300
ElseIf myRange.Cells.Value = "Cancel350" Then
[TotalDue].Cell.Value= 350
Else
[TotalDue].Cell.FormulaR1C1 = "=Product(100,[@Hours])"
End If
Next cCell
End Sub
应根据发票类型计算到期总额。取消是设定值,任何取消都不是100和工作小时数的乘积。
有人能发现我的问题或有任何建议/解决方案吗?
谢谢!
答案 0 :(得分:3)
尝试:
For Each cCell in myRange.Cells
If cCell.Value = ...
未经测试,但想快速抛弃它。
答案 1 :(得分:0)
看起来你正在使用桌子,这很棒。但是,我认为你不需要VBA来解决这个问题。在您的专栏" TotalDue"中,在一个单元格的公式栏中输入以下公式:
=IF([@Type]="Cancel300",300,IF([@Type]="Cancel350",350,100*[@Hours]))
它应该自动填满整个列。尽管我喜欢VBA,但有时一个公式是更好的答案!
但是,我正在运行您的代码,而您的问题孩子就是这一行: myRange.Cells.Value
If myRange.Cells.Value = "Cancel300" Then
这是一个不好的参考。改变它说:
If cCell.Value = "Cancel300" Then
我有另一个有用的调试工具是在vba行之后添加一个MyNewlyDefinedRange.Select,所以我知道它实际上正在我认为我告诉它工作的范围。