cyb*_*rol 4 excel vba for-loop
我有两个问题,第一个是关于一个 excel 公式,即使我使用了记录宏来检索公式,我也无法在 VBA 中复制它,第二个是因为我无法解决我的第一个问题,并且是关于代码效率的: 基本上在单元格 AR2 中,我放置了一个 excel 公式:
IF=(P2="LDN";"UK;IF(P2="MAD";"SPAIN"
IF(P2="PRA";"CZECH REPUBLIC";"")))))))))
Run Code Online (Sandbox Code Playgroud)
我为很多国家做这件事。
然后我在我的第二行做 autfill 单元格目标,直到最后一行在我的工作表上有数据以获得结果。主要问题是,在 excel 中它运行良好,但是在使用 vba 记录器在 VBA 中编码时,我在下面的代码中出现错误。虽然我只是复制粘贴了 vba 记录器的结果。请在下面找到代码。
i = Range("A:A").Find("*", [A1], xlValues, xlWhole, xlByRows, xlPrevious).Row
Range("AR2").Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-28]=""LDN"",""UK"",IF(RC[-28]=""MAD"",""SPAIN"",IF(RC[-28]=""STO"",""SWEDEN"",IF(RC[-28]=""DUB"",""IRELAND"",IF(RC[-28]=""SAO"",""BRASIL"",IF(RC[-28]=""PAR"",""FRANCE"",IF(RC[-28]=""TOR"",""CANADA"",IF(RC[-28]=""TOK"",""JAPAN"",IF(RC[-28]=""ZUR"",""SWITZERLAND"",IF(RC[-28]=""HKG"",""HONG KONG"",IF(RC[-28]=""HEL"",""FINLAND"",IF(RC[-28]=""MIL"",""ITALY"",IF(R"& _
""FRA"",""GERMANY"",IF(RC[-28]=""COP"",""DANEMARK"",IF(RC[-28]=""BRU"",""BELGIUM"",IF(RC[-28]=""AMS"",""NETHERLANDS"",IF(RC[-28]=""SIN"",""SINGAPORE"",IF(RC[-28]=""SEO"",""SOUTH KOREA"",IF(RC[-28]=""OSL"",""NORWAY"",IF(RC[-28]=""LIS"",""PORTUGAL"",IF(RC[-28]=""NYK"",""USA"",IF(RC[-28]=""VIE"",""AUSTRIA"",IF(RC[-28]=""LUX"",""LUXEMBOURG"",IF(RC[-28]=""JOH"",""SOUTH AF"& _
"(RC[-28]=""MEX"",""MEXICO"",IF(RC[-28]=""SYD"",""AUSTRALIA"",IF(RC[-28]=""TAI"",""TAIWAN"",IF(RC[-28]=""VAR"",""POLAND"",IF(RC[-28]=""BUD"",""HUNGARY"",IF(RC[-28]=""IST"",""TURKEY"",IF(RC[-28]=""BAN"",""INDIA"",IF(RC[-28]=""MOS"",""RUSSIA"",IF(RC[-28]=""TEL"",""ISRAEL"",IF(RC[-28]=""KUA"",""MALAYSIA"",IF(RC[-28]=""ATH"",""GREECE"",IF(RC[-28] =""PRA"",""CZECH REPUBLIC"& _
"))))))))))))))))))))))))))))))))))"
Range("AR2").Select
Selection.AutoFill Destination:=Range("AR2:AR" & i)
Run Code Online (Sandbox Code Playgroud)
由于上述代码不起作用,我尝试使用 Loop 在 vba 中执行此操作,但是我发现需要很长时间才能获得结果,因为我有近 20k 行......用 5 分钟来处理使用 excel 公式的即时结果:代码我的循环在这里:
For j = 2 To i
If Range("P" & j) = "AMS" Then Range("AR" & j) = "NETHERLANDS"
If Range("P" & j) = "ATH" Then Range("AR" & j) = "GREECE"
If Range("P" & j) = "BAN" Then Range("AR" & j) = "INDIA"
If Range("P" & j) = "BRU" Then Range("AR" & j) = "BELGIUM"
If Range("P" & j) = "BUD" Then Range("AR" & j) = "HUNGARY"
If Range("P" & j) = "COP" Then Range("AR" & j) = "DANEMARK"
.
.
.
.
.
If Range("P" & j) = "VAR" Then Range("AR" & j) = "POLAND"
If Range("P" & j) = "VIE" Then Range("AR" & j) = "AUSTRIA"
If Range("P" & j) = "ZUR" Then Range("AR" & j) = "SWITZERLAND"
Next j
Run Code Online (Sandbox Code Playgroud)
如果 excel 公式在 VBA 中不起作用,我如何以高效和快速的方式进行编码,以便获得至少 20k 行的国家/地区,而无需等待并几乎像 excel 公式自动填充模式一样立即获得结果。
非常感谢您的帮助 Olivier
您可以在没有 VBA 的情况下轻松完成此操作,如下所示;但我也会进一步提供 VBA 解决方案。
不过,首先,我要说对查找数据进行硬编码(即直接在 VBA 程序中编写城市代码和国家/地区名称)是不好的做法。这使得人们现在很难阅读和检查它们,以后也不方便更改它们。
在此示例中,我将所有城市代码和国家/地区名称放在 Excel 工作表右侧的查找表中(但如果您愿意,也可以将其放在其他隐藏工作表中)。为了将 A 列中列出的城市代码与相应的国家/地区相匹配,我只需使用例如在单元格 B2 中查找表中的城市代码:
=INDEX($F$4:$F$12,MATCH(A2,$E$4:$E$12,0))
Run Code Online (Sandbox Code Playgroud)
一直向下复制公式。

如果你真的想要 VBA,你可以用这段短代码得到完全相同的结果(给定相同的输入和相同位置的查找表):
Dim i As Long
Dim cityCodes
Dim countryNames
Dim listOfCountryNames
Dim listOfCityCodes
'Read look-up table from sheet.
listOfCityCodes = WorksheetFunction.Transpose(Range("E4:E12").Value)
listOfCountryNames = WorksheetFunction.Transpose(Range("F4:F12").Value)
'Read the input city codes from sheet to array
cityCodes = Range("A2:A9").Value
'Make a blank array of same size to receive the corresponding country names
ReDim countryNames(LBound(cityCodes, 1) To UBound(cityCodes, 1), _
LBound(cityCodes, 2) To UBound(cityCodes, 2))
'Lookup individual country names one by one, write them in array
For i = LBound(cityCodes, 1) To UBound(cityCodes, 1)
countryNames(i, 1) = listOfCountryNames( _
WorksheetFunction.Match(cityCodes(i, 1), listOfCityCodes, 0))
Next i
'Write country names from array to sheet
Range("B2:B9").Value = countryNames
Run Code Online (Sandbox Code Playgroud)
您会注意到我一次从工作表读取所有内容到数组,然后在这些数组中进行所有操作,最后写回工作表。这比在单个单元格中一个接一个地执行读/写要快得多。