2013-08-07 39 views
1

我是新來的excel宏和vba。 我有一個excel文件,第一張紙中有大約300000行,第一列中有項目標識符(它們可能是幾個具有相同值的),第二張大約有1000行(第一列也包含項目標識符,但它們是這裏獨一無二)。我需要編寫一個基於第二個表格隱藏第一個表中的行的宏。我的意思是我需要循環扔第一張表中的所有行,如果第一個單元格的值不匹配第二張紙的第一列的任何單元格,然後隱藏此行。Excel 2013宏只顯示基於一個單元值的特定行

我知道這將是非常緩慢的,因爲每次我需要比較cellvalue與另一個1000單元值,我有300 000行。我該怎麼做?你能建議最快的方式嗎?任何幫助將不勝感激,在此先感謝。

編輯 搜索了很多後,我做了我自己的宏

Sub hide()  
Dim MyCell, Rng As Range, Rn2 As Range 
Dim MyCell2 
Dim id(1 To 1392) As String 
Set Rng = Sheets("Sheet0").Range("C162403:C339579") 
Set Rng2 = Sheets("IT stuff").Range("A1:A22031") 
i = 1 
For Each MyCell2 In Rng2 
    If Not MyCell2.EntireRow.Hidden Then 
     id(i) = MyCell2.Value 
     i = i + 1 
    End If 
Next MyCell2 
j = 0 
For Each MyCell In Rng 
    For A = 1 To 1392 
     If MyCell = id(A) Then 
     j = 1 
     End If 
    Next A 
    If j = 0 Then 
     MyCell.EntireRow.Hidden = True 
    ElseIf j = 1 Then 
     j = 0 
    End If 
Next MyCell 
End Sub 

現在正在處理我的Excel文件,但它是很慢...我怎樣才能改善呢??

+0

在處理問題上已經有很多帖子了。搜索'vba hide columns' ...看到這個:[SO搜索](http://stackoverflow.com/questions/17461130/vba-searching-through-rows-and-their-associated-columns-and-hide-列,如果有的話) –

+0

@ d-stroyer我已經看到了很多他們,但我的問題是,我的Excel文件非常龐大,我想知道最快的方式。因爲知道我寫了一個宏,而且它運行了30多分鐘......你知道大約需要多少時間來完成我想要的宏嗎?我想可能是我犯了一些錯誤,它會運行無限循環... – Asiat

回答

0

調用Excel對象模型會大大降低速度,因此最好將要檢查的值加載到字典或數組中,並引用該值。您還可以加載您在另一個字典中檢查的行的行號和值,並在記錄需要隱藏的行時交叉引用這兩個數據結構。以這種方式工作會佔用相當多的內存,但絕對會比直接交叉引用錶快...

心連心

+0

好吧,謝謝我已經這樣做了,現在我正在等待超過30分鐘的結果,我認爲我犯了錯誤,它正在運行infite循環?有沒有辦法知道它是實際處理,還是隻是運行無限循環? – Asiat

1

爲什麼VBA?而不是Excel Formula(Vlookup) + Autofilter

比方說,你的表1是這樣的

enter image description here

和表2是這樣的

enter image description here

只需添加一列,如下圖所示,把公式,然後使用Autofilter來隱藏相關的行。在I2使用

enter image description here

公式是

=IF(ISERROR(VLOOKUP(A2,Sheet2!A:A,1,0)),"","True") 
0

下面的代碼需要有所不同的方法,您的問題。您會注意到,它假設Sheet1在列A中具有一組值,並加上了未指定數量的數據列,並且Sheet2在列A中只有一組值,與Sheet1列A值匹配。

的代碼執行以下操作:

  • 在列創建匹配值的最後的數據列的右側在工作表1(1 =不匹配的,0 =匹配)
  • 設置一個自動篩選在工作表1數據範圍上,匹配列上的標準值爲1(即,,過濾器只顯示無匹配)
  • 分配過濾的行可變
  • 的範圍內移除過濾器,並清除的匹配列
  • 隱藏在本體的行中變量的範圍內識別

我使用A列中的300,000行代碼值的Sheet1數據集以及B和C列中的隨機數字數據對Sheet1數據集進行了測試,在Sheet2中只有超過1,000個匹配值。隨機生成的10個字符的代碼和匹配值的構造使Sheet1列A值的20%不匹配。

針對這些數據在兩分鐘內平均的運行時間。

Sub MatchFilterAndHide2() 

    Dim calc As Variant 
    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim ws1Name As String, ws2Name As String 
    Dim rng1 As Range, rng2 As Range 
    Dim hideRng As Range 
    Dim lastRow1 As Long, lastRow2 As Long 
    Dim lastCol1 As Long 

    Application.ScreenUpdating = False 
    calc = Application.Calculation 
    Application.Calculation = xlCalculationManual 

    ws1Name = "Sheet1" 
    Set ws1 = Worksheets(ws1Name) 
    With ws1 
     lastRow1 = .Range("A" & .Rows.Count).End(xlUp).Row 
     lastCol1 = .Cells(1, ws1.Columns.Count).End(xlToLeft).Column + 1 
     Set rng1 = .Range(.Cells(1, 1), .Cells(lastRow1, lastCol1)) 
    End With 

    ws2Name = "Sheet2" 
    Set ws2 = Worksheets(ws2Name) 
    With ws2 
     lastRow2 = .Range("A" & .Rows.Count).End(xlUp).Row 
     Set rng2 = .Range("A2:A" & lastRow2) 
    End With 

    'add column of match values one column to the right of last data column 
    '1 = no-match, 0 = match 
    With ws1.Range(ws1.Cells(2, lastCol1), ws1.Cells(lastRow1, lastCol1)) 
     .FormulaArray = "=N(ISNA(MATCH(" & ws1Name & "!" & rng1.Address & _ 
      "," & ws2Name & "!" & rng2.Address & ",0)))" 
     .Value = .Value 
    End With 

    'set autofilter on rng1 and filter to show the no-matches 
    With ws1.Range(ws1.Cells(1, 1), ws1.Cells(1, lastCol1)) 
     .AutoFilter 
     .AutoFilter field:=lastCol1, Criteria1:=1 
    End With 

    With ws1 
     'assign no-matches to range object 
     Set hideRng = .Range("A2:A" & lastRow1).SpecialCells(xlCellTypeVisible) 

     'turn off autofilter, clear match column, and hide no-matches 
     .AutoFilterMode = False 
     .Cells(1, lastCol1).EntireColumn.Clear 
     hideRng.EntireRow.Hidden = True 
     .Cells(1, 1).Select 
    End With 

    Application.Calculation = calc 
    Application.ScreenUpdating = True 
End Sub 
相關問題