2014-08-28 2 views
4

두 가지 질문이 있습니다. 첫 번째 것은 수식을 검색하기 위해 레코드 매크로를 사용했지만 VBA에서 복제 할 수없는 Excel 수식에 대한 것입니다. 난 내 첫 번째 질문을 해결을 couldnt 및 코드의 효율성에 대해 때문에 : 기본적으로 셀에 AR2는 내가 엑셀 ​​수식을 넣어 해요 :루프를 사용하여 코드를 더 빠르게 실행하는 방법

IF=(P2="LDN";"UK;IF(P2="MAD";"SPAIN" 
IF(P2="PRA";"CZECH REPUBLIC";""))))))))) 

메신저 국가의 무리를 위해이 일을.

그런 다음 결과를 얻기 위해 내 시트의 데이터가있는 마지막 행까지 두 번째 행의 자동 채우기 대상을 사용하고 있습니다. 주요 문제는 Excel에서 잘 작동하지만 VBA 레코더를 사용하여 VBA에서 코딩 할 때 아래 코드에서 오류가 발생합니다. VBA 레코더의 결과를 붙여 넣기 만해도됩니다. 아래 코드를 찾으십시오. 위의 코드 didnt 한 근무로

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) 

는 내가 루프 그러나 나는이 순간의 프로세스 insteand에 5 분 .... 내가 거의 20K 행이 같은 결과를 얻을 나이 걸리는 것을 발견하여 VBA에서 그것을 시도 엑셀 수식을 사용한 결과 : 을 내 루프의 코드는 여기에 있습니다 :

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 

하면 VBA에서 엑셀 formulat 나던 작업, 내가 어떻게 적어도 20K의 국가를 얻기 위하여 효율적이고 빠른 방법 코드 열을 기다릴 필요없이 거의 즉시 엑셀 수식 자동 채우기 모드와 같은 결과를 얻을 수 있습니다. ryour 도움 FO

많은 감사 올리비에

,

답변

0

좋아 몇 가지 아주 간단한 제안 : 당신은 매우 자주 범위의 값에 액세스하는 경우 모든

Dim vals() As Variant 
vals = Range("P1:P1000") ' Substitute with the range you're looking at 

Dim i As Integer 
Dim val As String 

For i = LBound(vals, 1) To UBound(vals, 1) 
    val = CStr(vals(i, 1)) 

    Select Case val 
     Case "AMS" 
      Range("AR" & i + some_fixed_offset_if_needed) = "NETHERLANDS" 
     Case "AR": 
      ' ..... 
     ' Case ..... 
    End Select 
Next i 

먼저, 범위 개체에 액세스하지 않습니다 매번. 이것은 매우 느립니다. 해당 값을 임시 변수에 저장하고 대신 해당 변수에 액세스하십시오. 더 나은 방법은 찾고있는 전체 범위를 배열 변수에 저장 한 다음 해당 배열을 반복하는 것입니다.

둘째,의 경우는 상호 배타적 인 경우, 단지의 톤을 기록하지 않으면 문 - 사용 하면 ... 의 ElseIf ...

것은, 그것은에 그 방법이 필요하지 않는 등 이미 일치하는 것이 발견되면 다른 모든 조건을 점검하십시오. 위의 코드에서 방금 선택한 문을 사용했습니다.

속도가 조금 느려지는지 확인하십시오. 그렇지 않으면 가능한 단축 코드를 Scripting.Dictionary에 키로, 대체 (예 : "NETHERLANDS")를 값으로 추가 할 수 있습니다. 사전 조회는 매우 빠릅니다.

그리고 여전히 느린 경우 언제든지 WorksheetFormula.something을 사용하여 VBA의 시트 기능에 액세스 할 수 있습니다.

+0

정확히 무엇을 내려 놓으려고 했는가 – Tom

+1

이것은 단기간에 효과가 있지만 모든 도시 코드와 국가 이름은 하드 코딩되어 있다는 단점이 있습니다! –

+0

@ Jean-FrançoisCorbett이 접근법의 가장 큰 단점은 반복과 코드 라인의 양이라고 생각합니다. –

4

아래와 같이 VBA없이 쉽게 수행 할 수 있습니다. 하지만 VBA 솔루션을 추가로 제공 할 예정입니다.

먼저, 귀하의 조회 데이터를 하드 코딩 (즉, VBA 프로그램에서 도시 코드 및 국가 이름을 직접 작성)하는 것이 좋지 않다고 말씀 드리고자합니다. 그것은 사람들이 지금 그것을 읽고 확인하는 것을 어렵게 만들고, 나중에 그들을 바꾸는 것이 불편합니다.

이 예제에서는 모든 도시 코드와 국가 이름을 Excel 시트 오른쪽의 찾아보기 테이블에 넣었습니다 (그러나 원하는 경우 다른 숨겨진 시트에 넣을 수는 있습니다). 그런 다음 A 열에 나열된 도시 코드를 해당 국가와 일치 시키려면 예를 들어를 사용하여 표에서 도시 코드를 찾습니다. 셀 B2의 경우 :

=INDEX($F$4:$F$12,MATCH(A2,$E$4:$E$12,0)) 

수식을 끝까지 복사하십시오.

enter image description here

당신이 정말로 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 

시트에서 배열까지 모든 것을 한 번에 읽은 다음 해당 배열에서 모든 조작을 수행 한 다음 마지막으로 시트에 다시 쓰는 것을 볼 수 있습니다. 이것은 개별 셀에서 하나씩 읽기/쓰기를 수행하는 것보다 훨씬 빠르게 실행됩니다.

+1

나는 비 VBA 방식을 좋아합니다 : P –

+0

++, 그 20K 행을 사용하여 수동으로 계산을 전환하거나 값으로 복사하여 붙여 넣기를 원하고 원본을 바꾸는 것을 제외하고 나쁘지 않습니다. –

+1

그가 수식 계산식으로 만 문제를 해결하고 싶다면 - 해당 조회 테이블에 대해 VLOOKUP을 사용하지 않는 이유는 무엇입니까? 이것은 동일한 결과를 더 간단하게 만들어야하며, 약간 더 빨라질 수도 있습니다. – Bogey

관련 문제