2016-10-05 7 views
1

私はVBAで可能な限り多くのノブであると言って始めなければなりません。私は条件に基づいて別のワークシート内の名前付き範囲を非表示にするコードに取り組んでいます。ここに私がやろうとしていることがあります。Excelマクロ(VBA) - 条件に基づいて別のワークシートの特定の名前付き範囲を非表示にします

私は「コミットコスト」というワークシートを持っており、それは以下のようになります。

enter image description here

(私は今7000以上の少しを持っている)下部に、より多くの行があるでしょう。範囲A3:E14の名前はcc_0101、範囲のA14:E26の名前はcc_0195です。そして以下にはさらに多くのものがあります。

私はそのように見える「設定」のワークシートがあります。「表示」および「隠す」:

enter image description here

列Cには、ドロップダウン二つのオプションです。 D列の式には、「非表示」が選択されている場合は1、「表示」が選択されている場合は0が表示されます。ここでマクロを「設定」ワークシートのアカウントリストに移動し、D8 = 1の場合、「Committed Costs」ワークシートのcc_0101という名前の範囲全体を非表示にし、D9 = 0の場合はcc_0195を隠されているなど。基本的に、マクロは各行の列Eの値を取得する必要があります。

私はExcelで、次のコードを持っている:私は配列と以下のようにコードが見えたすべてについて読み始めた前

Dim showhide1 As Range 
Set showhide1 = ThisWorkbook.Worksheets("Settings").Range("d7:g716") 
Dim showhide2 As Variant 
showhide2 = showhide1.Value 
Dim i As Integer, j As Integer 

For i = LBound(showhide2, 1) To UBound(showhide2, 1) 
    For j = LBound(showhide2, 2) To UBound(showhide2, 2) 
    If showhide1(i, 1) = 1 Then 
     Sheets("Committed Costs").Range("showhide2(i,2)").EntireRow.Hidden = True 
    Else 
     Sheets("Committed Costs").Range("showhide2(i,2)").EntireRow.Hidden = False 
    End If 
    Next j 
Next i 

コードは、実行時エラー1004

を生成します。

Dim drng As Range, d as Range 
Dim erng As Range, e as Range 

Set drng = Range("D7:D716") 
Set erng = Range("E7:E716") 

For Each d In drng 
    If d = 1 Then 
    Sheets("Committed Costs").Range("e").EntireRow.Hidden = True 
    Else 
    Sheets("Committed Costs").Range("e").EntireRow.Hidden = False 
    End If 
Next d 

それから私は "e"を決して定義していないので、マクロはE列の値を取得することを知らない(私は推測している)。私が仕事の条件を得た唯一の方法は:

Dim d as Range 
Set d = Range("D8") 

If d = 1 Then 
    Sheets("Committed Costs").Range("cc_0101").EntireRow.Hidden = True 
Else 
    Sheets("Committed Costs").Range("cc_0101").EntireRow.Hidden = False 
End If 

ですが、それはまったく目的には役立ちません。この例ではcc_0101という範囲の名前をハードコードしなければならず、コードはアカウントのリスト全体を調べるのではなく、1行(行8)を比較するだけです。

私はこの

答えて

1

でこれは簡単な修正である任意の助けに感謝、それはあなたがあなたの配列項目を参照する方法を周りにあります。また、決して使用されないので、列インデックスをループする必要はありません。コードを以下に変更してください。配列値を"showhide2(i,2)"として渡す理由は、showhide2(i,2)に格納された値ではなく、 "showhide2(i、2)"という名前のシートを探しています。

Dim showhide1 As Range 
Set showhide1 = ThisWorkbook.Worksheets("Settings").Range("d7:g716") 
Dim showhide2 As Variant 
showhide2 = showhide1.Value 
Dim i As Integer, j As Integer 

For i = LBound(showhide2, 1) To UBound(showhide2, 1) 
    If showhide2(i, 1) = 1 Then 
     Sheets("Committed Costs").Range(showhide2(i,2)).EntireRow.Hidden = True 
    Else 
     Sheets("Committed Costs").Range(showhide2(i,2)).EntireRow.Hidden = False 
    End If 
Next i 
+0

私はそれをカイルが提案する方法を実行しようとしましたが、それはデバッガは、コードの次のセクション浮き彫りに同じファイル名を指定して実行時エラー1004になり:「シート(」コミット費用を」)範囲(showhide2 (i、2))EntireRow.Hidden = False " – user3055019

+0

はい、私はそれも気づきましたが、一貫性を保ち、showhide2(i、1)を使用しますが、残念ながら問題は解決しませんでした。 – user3055019

+0

@ user3055019 - マクロブックの設定シートで定義されたすべての範囲名です。セルE7:E716で定義されていますか? (セルが空の場合、または範囲名が存在しない場合は、そのエラーが発生します)既存のIfステートメントを囲む余分なIfステートメントが必要な場合があります。たとえば 'If showhide1(i、2)<>" "Then''もしshowhide1(i、1)= 1 Then' ... 'End If'' End If'。 – YowE3K

関連する問題