简体   繁体   中英

Excel 2010 VBA- Loop If Then Statements

New to VBA but trying really hard to learn. I recently wrote a macro with IF Then Else for a woman at work. Unfortunately she is not as computer savvy and doesn't want to find the macro in the list so I figured I would use a command button user form and adjust the code to loop through the cells for her rather than her going from active cell to active cell. Sadly, I am having issues with the If Then Else in the For each loop.

Here was the original non-looping coded macro

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

This was working but the user found it tedious and she is not used to macro usage. So I figured a userform command button that looped through the range and filled in the corresponding values in the final column would be best for her. This the way I figured it should work.

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

Should calculate a total due based on type of invoice. Cancellations are set values, anything not a cancellation is the product of 100 and number of hours worked.

Can anyone spot my problem or have any suggestions/solutions?

Thanks!

Try:

For Each cCell in myRange.Cells
If cCell.Value = ...

Untested, but wanted to throw that out quickly.

It looks like you are using tables, which is great. However, I don't think you need VBA to solve this one. In your column "TotalDue", enter the following formula into the formula bar for one cell:

=IF([@Type]="Cancel300",300,IF([@Type]="Cancel350",350,100*[@Hours]))

It should automatically fill down the entire column. As much as I love VBA, sometimes a formula is a better answer!

However, I was running through your code, and your problem child is this line: myRange.Cells.Value

If myRange.Cells.Value = "Cancel300" Then

That is a bad reference. Change it to say this:

If cCell.Value = "Cancel300" Then

Another useful debugging tool I have is adding a MyNewlyDefinedRange.Select after a vba line so I know it is actually working on the range I think I told it to work on.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM