MS Excel VBA – 循环遍历行和列(如果为空则跳过)

你好,stackoverflow社区,

我必须承认我主要是在MS Access中的代码,并且对MS Excel VBA有非常有限的经验。

我目前的目标是这样的,我有一个费用报告发送给我与扣除在另一个国家的货币,这个报告有很多列不同的帐户名称可能会填充或可能为空。

我目前有一个macros,将打开一个input框,并要求HostCurrency /美元汇率,我的下一步将开始在第一个logging(第14行;列AK包含扣除个人信息),然后跳到第一个扣除科目(扣除科目开始在列L和跨度列DG)检查每个单元格是否为空,如果它继续向右移动,如果它包含一个值,那么我想乘以我的FX利率variables在input框中input,并用收敛来更新单元格。 一旦最后一列(DG)被执行,我想移动到下一行(第15行),并一直重新开始这个过程,直到我的“已用范围”中的“LastRow”。

我非常感谢任何反馈,解释或链接,可能指向我的目标。 提前感谢您花时间阅读这个!

这将做到没有循环。

Sub fooooo() Dim rng As Range Dim mlt As Double Dim lstRow As Long mlt = InputBox("Rate") With ActiveSheet lstRow = .Cells(.Rows.Count, 1).End(xlUp).Row Set rng = .Range(.Cells(14, 12), Cells(lstRow, 111)) rng.Value = .Evaluate("IF(" & rng.Address & " <>""""," & rng.Address & "*" & mlt & ","""")") End With End Sub 

如果工作表是静态的,则可以用WorkSheets("YourSheetName")replaceActiveSheet 。 将"YourSheetName"更改为工作表的名称。

首先,你应该尝试自己编写代码,发布你的代码,以便有人能够指引你正确的方向。 如果你的范围将是静态的,这是一个非常简单的问题。 你可以尝试一下:

 Sub calcRate(rate As Double, lastrow As Integer) Dim rng As Range Set rng = Range("L14" & ":DG" & lastrow) Dim c As Variant For Each c In rng If c.Value <> "" Then c.Value = c.Value * rate End If Next End Sub 

这段代码将遍历给定范围中的每个单元格,并且不需要多个循环就可以应用代码。 现在你可以从你inputratelastrow表单中调用calcRate子。