【问题标题】:Looping through a list of country codes, error with Range循环浏览国家代码列表,范围错误
【发布时间】: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 循环。

应该经过这些步骤:

  1. 激活计算器工作表
  2. 将家庭中的成年人 (O38) 设置为 1。
  3. 将家庭中的孩子 (O39) 设置为 0。
  4. 将国家代码单元格 (O9) 的值更改为当前迭代的国家代码(即迭代范围 S73:S128)
  5. 从 O9 复制国家代码
  6. 激活结果表
  7. 将复制的国家代码粘贴到 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 我肯定会首先清理和重新设计。之后更容易调试。

标签: excel vba


【解决方案1】:

CountryCode 已经是一个范围,因此,除非您定义了命名范围 CountryCode1、CountryCode2、Range("CountryCode" & i),否则将不起作用。

CountryCode.Cells(i, 1) 将引用定义为 CountryCode 的列中的 i = 1st、2nd 等行。

【讨论】:

  • 谢谢,就是这样!对 CountryIncome 部分也进行了相同的更改。我的代码的粘贴部分也存在问题,现在将开始处理。非常感谢。
  • @Andy G. 这真是太棒了。我今天学了些新东西!!谢谢。 Balthazar,请随时在 SO 上提出新问题。很好,你提供了一个试用代码!
【解决方案2】:

这可能是你的开始。

您可以将范围构建为:

Range("S73:S128") -> Range(Cells(S73), Cells(S128)) -> 
Range(Cells(row number, column number), Cells(row number, column number)) -> 
Range(Cells(73, 19), Cells(128, 19))

由于您想遍历具有变量“i”的列,因此您将行表示为 i

所以你的代码需要一些修改: For i = 1 To CountryCode.Rows.Count -> For i = 73 To CountryCode.Rows.Count 如果你愿意,你可以从第 73 行转到最后一行

Range("O9").Value = Range(Cells(i, 19), Cells(i, 19)).value

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 2010-11-22
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2016-08-08
    相关资源
    最近更新 更多