2016-07-25 99 views
0

使用VBA的打包順序表:具有相同serial_nr隱藏行,如果過濾,第一片

我試圖將內容隱藏在具有相同serial_nr爲已被過濾的那些不同的錶行(因此隱藏)在第一張紙上。

因爲不同的工作表上的行不一樣,我嘗試使用serial_nr。但我似乎無法鏈接serial_nr值作爲選擇要隱藏在其他工作表中的行的條件。

最後我把它分解成了我可以沒有錯誤地得到的最簡單的代碼,但它不起作用。

Sub Filter_over_multiple_sheets() 

    Dim Serial_nr As Integer 
    Dim Row_nr As Integer 

    For Row_nr = 3 To 1020 

     If Worksheets("Raaplijst").Cells(Row_nr, 1).EntireRow.Hidden = True Then 
     Worksheets("Boutenlijst Kist B").Cells(Row_nr, 1).EntireRow.Hidden = True  
     End If 
    Next 

End Sub 

我仍然是VBA的新手,所以我迷失在所有可能的方法和組合中。

你們誰可以幫忙嗎?

回答

1

試試這個代碼,您必須添加「Microsoft腳本運行」引用到您的項目,以利用Dictionary

Option Explicit 

Sub Filter_over_multiple_sheets() 
    Dim IDsDict As New Dictionary 
    Dim rng As Range 

    With Worksheets("Raaplijst") '<--| consider "mother" worksheet 
     For Each rng In .Range("A3", .Cells(.Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants) '<--| loop through column "A" non empty cells from row 3 down to last non empty one 
      If rng.EntireRow.Hidden Then If Not IDsDict.Exists(CStr(rng.Value)) Then IDsDict.Add CStr(rng.Value), rng.Value '<--| if row is hidden add its ID to dictionary provided it's not been added already 
     Next rng 
    End With 

    If IDsDict.Count > 0 Then '<--| go on if there's been at least one hidden row ID 
     With Worksheets("Boutenlijst Kist B") '<--| consider "child" worksheet 
      With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) '<--| loop through column "A" cells fom row 2 (header) down to last non empty one 
       .AutoFilter field:=1, Criteria1:=(IDsDict.Keys), Operator:=xlFilterValues '<--| filter column "A" with IDs corresponding with "mother" worksheet hidden rows 
       If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then '<--| if any cell has been filtered... 
        Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) '<--| ... store filtered cells in a range variable... 
        .AutoFilter '<--| .. show all rows back... 
        rng.EntireRow.Hidden = True '<--| ... and hide only just stored cells rows 
       Else '<--| otherwise 
        .AutoFilter '<--| .. show all rows back... 
       End If 
      End With 
     End With 
    End If 
End Sub 
+0

這似乎工作得很好。雖然我還沒有熟悉字典功能,但代碼是不可估量的。我已經閱讀並理解它的功能。非常有用。 我可以deffinitly使用這個和它的工作。非常感謝! – B33ks

+0

歡迎您 – user3598756

+0

不錯的做法+1 – skkakkar

0

據我所知,你有最好的使用方法,它是最簡單的。只是一些事情,你的Serial_nr變量沒有被使用,它可能是最好的解決你的if語句的縮進,它使得閱讀更容易,特別是在長段代碼中,最後使用.Rows代替.Cells

Sub Filter_over_multiple_sheets()

Dim Row_nr As Integer For Row_nr = 3 To 1020 If Worksheets("Sheet1").Rows(Row_nr).EntireRow.Hidden = True Then Worksheets("Sheet2").Rows(Row_nr).EntireRow.Hidden = True End If Next End Sub

+0

感謝Rabbitman,它看起來有點清潔這我同意的方式。我會試試看。 – B33ks

+0

公平地說,這取決於你到底在做什麼,user3598756的回答非常明確,並且在複雜的情況下可能很有用,但是如果問題如你所述那麼簡單,那麼它不需要如此不必要的複雜化。 – Rabbitman14

+0

你簡化的解決方案並沒有成功。它沒有提供任何錯誤,但在表單中沒有任何變化(不知道爲什麼)。此外,序列號的比較確保了正確性。這很好。 User3598756的解決方案。目錄的使用對我來說是新的,所以我必須考慮到這一點。 – B33ks

相關問題