2016-04-08 2 views
-1

Моя цель - скрыть столбец, если все значения из строки 3-10 равны нулю в этом столбце, поэтому я создаю формулу в строке 11, которая представляет собой сумму значения из строка 3 до 10Скрытие столбцов в excel на основе значения ячейки

Основном я могу создать код, как этот

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 

, но как только это, потому что я хочу этого макро-бегах от колонки B до FV,

или, может быть любое другое решение для достижения моей цели?

ответ

2

Превосходно цикл будет помогать и присоединиться к функции:

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 

Unhide все столбцы первой, то вы удалили необходимость для еще заявления

Edit: С помощью этого решения вы также дон Вам не нужна ваша формула в строке 11.

+0

Благодаря Dan, поясню это проверить, если каждая клетка имеет нулевое значение или нет, –

+0

Правильно, я выбрал это по формуле суммы, как если у вас есть одна ячейка в 1 и одна на -1 будут некорректно скрыты, а мой код не будет скрыт :) –

+0

были алгебраической суммой значений, тогда было бы быстрее использовать COUNTIF, а также сократить код внутри ' Для цикла X' в столбцы (x) .Hidden = Application.Work sheetFunction.CountIf (Диапазон (ячейки (3, x), ячейки (10, x)), 0) = 8'.Но это все еще повторяется через весь диапазон столбцов и скрывает захваченные по одному, что может привести к проблемам с производительностью – user3598756

1

Heres в одну сторону.

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 

НТН

+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 в листе. Также ваш код не отображается в сценарии, где данные теперь определяют, что нужно. Также Dim ваша переменная как длинная;) –

+0

Конечно, все ответы верны. Я только что написал тот, который сначала воспринимает ум каждого. но почему долго? –

+0

Используйте длинный тип данных, чтобы содержать целые числа, которые слишком велики для соответствия типу данных 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, то столбец будет помечен для скрытия. Я бы также не рекомендовал скрывать столбец один за другим, это делает код излишне медленным, особенно когда на листе много формул или есть много столбцов, которые нужно скрыть. Итак, что я сделал, просто отметьте столбцы для скрытия с помощью функции 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

Смежные вопросы