2016-07-25 8 views
0

非表示行が、場合は、最初のシートでフィルタリング梱包オーダーシートにVBAを使用して

私はフィルタリングされたものと同じ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

おかげRabbitmanが、それはこのビットクリーンに見えるあなたが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

これは美しく動作するようです。コードは私がまだ辞書機能を使い慣れていないのにもかかわらず理解できる。私はそれを読んで、それが何をしているのか理解しています。非常に便利です。 私はこれをうまく使用して作業することができます。どうもありがとう! – B33ks

+0

あなたは歓迎です – user3598756

+0

ニースアプローチ+1 – skkakkar

0

あなたが使用する最良の方法を知っている限り、最も簡単です。あなたのSerial_nr変数は使用されていません。おそらく、if文の字下げを修正するのが一番良いでしょう。特に長いコードで読みやすく、最後に.Cellsの代わりに.Rowsを使用します。

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

を利用するためにあなたのプロジェクトに「Microsoftスクリプトランタイム」の参照を追加するために持っているため、このコードを試してみてください私は同意する。私はそれを試してみます。 – B33ks

+0

あなたが何をしているかによって、正確には何が行われているのかによって異なります。user3598756の答えは非常に明示的で、複雑な状況で役に立つことがありますが、問題があなたの言ったように単純であれば、不要に複雑になる必要はありません。 – Rabbitman14

+0

あなたの単純化された解決策はそのトリックをしませんでした。エラーは発生しませんが、シートには何も変更されません(理由はわかりません)。また、シリアル番号の比較によって正しいことが保証されます。どちらがいいですか? User3598756の解決策がありました。ディレクトリの使用は私には新しく、病気はそれを調べなければなりません。 – B33ks

関連する問題