如果在第一个表中过滤,则使用相同的serial_nr隐藏行

使用VBA打包订单:

我试图隐藏不同的工作表中的行,这些工作表具有与第一个工作表中被过滤(因此隐藏)相同的serial_nr。

因为不同的工作表上的行不一样,我尝试使用serial_nr。 但我似乎无法链接serial_nr值作为一个条件select隐藏在其他表中的行。

最后我把它分解成了我可以毫无错误地得到的最简单的代码,但是它不起作用。

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的新手,所以我迷失在所有可能的方法和组合中。

你们谁可以帮忙吗?

试试这个代码,为了利用Dictionary类,你必须添加“Microsoft Scripting Runtime”引用到你的项目中

 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 

据我所知,你有最好的方法来使用,它是最简单的。 只是一些事情,你的Serial_nrvariables没有被使用,它可能是最好的解决你的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