【发布时间】:2020-04-09 15:34:30
【问题描述】:
我正在尝试编写一个宏,允许我根据他/她的居住国家/地区测试一个人的支付能力。
我有一个国家代码列表(行“S73:S128”),例如瑞典的“SE”,英国的“UK”等。我还有所有国家/地区的平均收入列表(行"T73:T128")。
该宏应该编辑计算支付能力的工作表(“计算器”),然后将结果复制到另一个工作表(“结果”)中。对于每个国家/地区,有三种情况:该人独居(以下代码中的 O38 = 1,O39 = 0),该人与另一个成年人(以下代码中的 O38 = 2,O39 = 0)共享他/她的家庭或该人与另一个成年人和一个孩子一起生活(O38 = 2 和 O39 = 1)。
我认为最简单的方法是使用 for 循环。
应该经过这些步骤:
- 激活计算器工作表
- 将家庭中的成年人 (O38) 设置为 1。
- 将家庭中的孩子 (O39) 设置为 0。
- 将国家代码单元格 (O9) 的值更改为当前迭代的国家代码(即迭代范围 S73:S128)
- 从 O9 复制国家代码
- 激活结果表
- 将复制的国家代码粘贴到 A 列的第一个空单元格中
...然后继续将当前迭代的收入输入到单元格 O23 中,将支付能力输出(N52)复制到结果表 B 列中的第一个空单元格中,等等...
这是我的非工作代码:
Sub LoopThroughCountries()
Dim CountryCode As Range
Dim CountryIncome As Range
Dim i As Long
Set CountryCode = Range("S73:S128")
Set CountryIncome = Range("T73:T128")
For i = 1 To CountryCode.Rows.Count
Worksheets("Calculator").Activate
Range("O38").Value = 1
Range("O39").Value = 0
Range("O9").Value = Range("CountryCode" & i)
Range("O9").Copy
Worksheets("Results").Activate
Range("A1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues
Worksheets("Calculator").Activate
Range("O23").Value = Range("CountryIncome" & i)
Range("N52").Copy 'N52 is the payment ability output cell
Worksheets("Results").Activate
Range("B1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues 'Pastes payment ability of scenario 1
Worksheets("Calculator").Activate
Range("O38").Value = 2
Range("N52").Copy
Worksheets("Results").Activate
Range("C1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues 'Pastes payment ability of scenario 2
Worksheets("Calculator").Activate
Range("O39").Value = 1
Range("N52").Copy
Worksheets("Results").Activate
Range("D1").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues 'Pastes payment ability of scenario 3
Next i
End sub
失败的第一行是这样的:
Range("O9").Value = Range("CountryCode" & i)
给我错误:“对象'_Global'的方法'范围'失败”
我在这里缺少什么?我试图搜索如何在 VBA 中使用 Range。我认为“Range(“CountryCode”&i)”基本上会给我CountryCode-range的第i次迭代的值。线路不完整吗?
【问题讨论】:
-
请摆脱所有那些
Activate和不合格的Ranges !那是低效且不可读的。 -
我同意...现在我只是想让它工作(这是我在 vba 中为 excel 做的第一件事),我将专注于使它不那么丑陋和低效稍后。
-
您对 range 的所有调用都是隐式的,您没有指定正在处理的工作表,可能不是错误,而是要记住的事情。 stackoverflow.com/a/42812889/10223558
-
@Balthazar 我肯定会首先清理和重新设计。之后更容易调试。