2013-07-20 89 views
-1

我將不勝感激以下VBA宏問題的一些幫助, 截圖在這裏:VBA宏加快

Excel Data

我的數據在2列比較 - 指數& Sec_Index。在匹配的情況下,它應該檢查哪些值被分配給Sec_Index,並填充「1」到對應於Index的匹配Value列和填充其他Value列的「0」(我希望截圖更好地解釋它)

我寫了一個很好的短宏。但是,我有大量的數據 - 兩個索引列至少包含400000-500000行。這使得我的代碼無用,因爲它需要很長的執行時間。

有沒有辦法讓這項工作?我讀了Variant數組,但我對它們並不熟悉。

+2

你可以用公式來做到這一點。但是如果你需要代碼的幫助,那麼你需要顯示你的代碼。 –

回答

0

你可以用公式做到這一點。例如:

=IF(AND(LOOKUP($B2,$H$2:$H$6,$I$2:$I$6)="A",LOOKUP($B2,$H$2:$H$6,$H$2:$H$6)=B2),1,0) 

替換「B」和「C」。

1

你可以把這個公式(如Excel 2007或以上):

=COUNTIFS($H$2:$H$5,$B2,$I$2:$I$5,"A") 

到C2並把它複製下來,對面;只需將「A」更改爲「B」和「C」即可。

已添加鑑於行數,我會將數據導入到MS Access中,創建交叉表查詢,然後將此數據複製回Excel。

+0

啊,比我的乾淨得多。做得好。 – buckminst

+0

@buckminst。謝謝。您也可以使用$ B2,以便您可以複製。 –

+0

感謝您的回覆。您的建議似乎可行,但是,執行計算需要很長時間。對於我獲得的數據量(400000-500000行×10列/值),需要數小時。這就是爲什麼我想知道如果一個宏不會更快。 –

0

試試這個,不是過於健壯,但確實有效。不知道這將與你可能有多快相比?

它做了約60,000行與25 keys在約5 seconds

編輯:添加定時器功能。

Public Declare Function GetTickCount Lib "kernel32.dll"() As Long 
public Sub main() 
Dim t As Long 
t = GetTickCount 
    Application.ScreenUpdating = False 
    Dim Arr1(), Arr() As Double 
    Dim x, y, i, j As Double 
    Dim v As String 
    x = Cells(Rows.Count, 2).End(xlUp).Row - 2 
    y = Cells(Rows.Count, 8).End(xlUp).Row - 2 
    Range("c2", "e" & x + 2) = 0 
    ReDim Arr1(x) 
    ReDim Arr2(y) 
    i = 0 
    Do Until Cells(i + 2, 2) = "" 
     Arr1(i) = Cells(i + 2, 2) 
     i = i + 1 
    Loop 
    i = 0 
    Do Until Cells(i + 2, 8) = "" 
     Arr2(i) = Cells(i + 2, 2) 
     i = i + 1 
    Loop 
    i = 0 
    Do Until i > UBound(Arr1) 
     j = 0 
     Do Until j > UBound(Arr2) 
      If Arr1(i) = Arr2(j) Then 
       v = Cells(Arr2(j) + 1, 9) 
       Select Case v 
        Case "a" 
         Cells(i + 2, 3) = 1 
        Case "b" 
         Cells(i + 2, 4) = 1 
        Case "c" 
         Cells(i + 2, 5) = 1 
       End Select 
       Exit Do 
      End If 
      j = j + 1 
     Loop 
     i = i + 1 
    Loop 
    MsgBox GetTickCount - t, , "Milliseconds" 
End Sub