2016-04-08 16 views
-1

私の目標は、3行目から10行目までのすべての値がその列で0である場合、列を非表示にすることです。 Basicly セルの値に基づいてExcelを非表示にする

〜10行3、私は列BからFVにこのマクロ実行したいので、私は、

または多分他のソリューションをこの

If Range("B11").Value = 0 Then 
Columns("B:B").EntireColumn.Hidden = True 

Else 

Columns("B:B").EntireColumn.Hidden = False 

End If 

If Range("C11").Value = 0 Then 
Columns("C:C").EntireColumn.Hidden = True 

Else 

Columns("C:C").EntireColumn.Hidden = False 
End If 

が、どのようにこの単純に、のようなコードを作成することができます私の目標を達成するために?

答えて

2

も置かループが役立つだろうと機能参加:あなたのelse文

編集のためにあなたが削除した後、最初の必要性を

Dim X as Long 
Columns("B:FV").EntireColumn.Hidden = False 
For X = 2 To 178 
    If Join(Application.Transpose(Range(Range(Cells(3, X).Address & ":" & Cells(10, X).Address).Address).Value), "") = "00000000" Then Columns(X).Hidden = True 
Next 

再表示列をすべて:このソリューションでは、あなたもドンを11行目に式が必要です。

+0

basiclyこのチェックおかげでダン、すべてのセルの値がゼロかどうか、あなたが持っているかのよう –

+0

が正しい、私は和式の上にこれを選んだのを持っている場合1つのセルが1で-1が1つの場合、間違って隠されてしまいます。私のコードでは隠されません:) –

+0

は代数和で問題があった場合、COUNTIFを使う方が速くなり、 X'ループの 'Columns(x).Hidden = Application.Work sheetFunction.CountIf(Range(Cells(3、x)、Cells(10、x))、0)= 8'です。しかし、これはまだすべての列範囲を反復し、トラップされたものを1つずつ隠すため、パフォーマンスの問題が発生する可能性があります。 – user3598756

1

片方向です。

Sub test() 
Dim iStart As Long:  iStart = Range("B1").Column 
Dim iFin As Long:   iFin = (Range("FV1").Column) - 1 
Dim iCntCol As Long:  iCntCol = iStart 'Col B is #2 
    For iCntCol = iStart To iFin 'FV is Col # 178 
     If Cells(11, iCntCol).Value = 0 Then 
      Columns(iCntCol).EntireColumn.Hidden = True 
      Else 
      Columns(iCntCol).EntireColumn.Hidden = False 
     End If 
    Next iCntCol 
End Sub 

HTH

+0

答えShag –

2

私は誰もが最も簡単な答えを書かない驚いています。

for i = 2 to 178 
    if cells(11, i).value = 0 then 
     Columns(i).EntireColumn.Hidden = True 
    end if 
next 
+0

ありがとうございました。シートにExcel式が必要です。また、あなたのコードは、データが今べきであると判断したシナリオで再表示されません。また、あなたの変数をlongとして薄暗くしてください;) –

+0

もちろん、すべての答えが正しいです。私はちょうど誰もが最初に気づいたものを書きました。 しかし、なぜですか? –

+0

Longデータ型を使用してIntegerデータ型に収まらない大きすぎる整数を格納します。 – ShaggyRogers

1

パフォーマンスは、それが中に再利用できるように私たちは、ハード配慮の範囲をコーディングしないことによって、これを行うために、より汎用性の高いコードを使用することができます

Option Explicit 

Sub hide() 
Dim found As Range 

With Intersect(ActiveSheet.Range("B11:FV11"), ActiveSheet.UsedRange.EntireColumn) 
    .EntireColumn.Hidden = False 
    .FormulaR1C1 = "=sum(R3C:R10C)" 
    Set found = GetZeroColumns(.Cells, 0) 
End With 
If Not found Is Nothing Then found.EntireColumn.Hidden = True  

End Sub 


Function GetZeroColumns(rng As Range, value As Variant) As Range 
Dim firstAddress As String 
Dim found As Range 

With rng 
    Set found = .Find(What:=value, LookIn:=xlValues, lookat:=xlWhole) 
    If Not found Is Nothing Then 
     firstAddress = found.Address 
     Set GetZeroColumns = found 
     Do 
      Set GetZeroColumns = Union(GetZeroColumns, found) 
      Set found = .FindNext(found) 
     Loop While Not found Is Nothing And found.Address <> firstAddress 
    End If 
End With 
End Function 
+0

お返事ありがとうございます –

1

を以下のものを検討し、問題なければなりません多くの場所。以下を考慮すると、For...Nextループは各セルをSelectionでテストします。 Selectionは現在選択されているセルです。そのため、コードを実行するセルを選択するだけです。セルの値が0の場合、列には非表示としてマークされます。また、列を1つ1つ隠すことをお勧めしません。コードが不必要に遅くなります。特に、シートに多数の数式がある場合、または非表示にする列が多い場合は特にそうです。だから私はちょうどUnion関数を使用して隠すための列をマークしています。そして、コードの最後の行で見ることができるように、それらを非表示にします。

Sub HideZerosByColumn() 
    Dim iRng As Range 
    Dim uRng As Range 
    Set uRng = Nothing 
    For Each iRng In Selection 
     If iRng = 0 And Not IsEmpty(iRng) Then 
      If uRng Is Nothing Then Set uRng = iRng Else Set uRng = Union(uRng, iRng) 
     End If 
    Next iRng 
    If Not uRng Is Nothing Then uRng.EntireColumn.Hidden = True 
End Sub 

コードを実行する前に、検討する範囲を選択してください。

enter image description here

コードを実行した後

enter image description here

+0

答えKSのおかげで、私はまだこのコーディングに精通していません。しかし、私はそれを試してみます –

+0

ようこそ。私に問題を知らせてください – Rosetta

関連する問題