遍历国家代码列表,范围错误

时间:2018-10-30 12:47:01

标签: excel vba excel-vba

我正在尝试编写一个宏,使我可以根据一个人的居住国家/地区来测试该人的支付能力。

我有一个国家代码列表(行“ 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范围的第i个迭代值。该行不完整吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

这可能是您的起点。

您可以将范围构建为:

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