VBA搜索行及其关联列,如果没有,则隐藏列

时间:2013-07-04 02:50:13

标签: vba search loops hide

我是VBA编程新手。我想

  • 搜索工作表,并在第6行找到“N”或“TR”
  • 然后,对于“N”或“TR”列中的每个单元格
  • 如果所有单元格都为空白,则删除/隐藏列
  • 如果单元格不为空白,请突出显示空白的单元格

这听起来很简单,但我认为它需要两个for循环。

 Sub checkandhide()    
    Set r = Range("6:6")  
    Rows("7:7").Select  
    For Each Cell In r  
        Selection.Find(What:="N", After:=ActiveCell, LookIn:=xlFormulas, LookAt _  
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _  
            False, MatchByte:=False, SearchFormat:=False).Activate  
        'search for N  
        Application.Run "hidecolumn"  
    Next  
 End Sub  


Sub hidecolumn()
    Dim target As Range
    Dim dwn As Range

    Set dwn = Range(ActiveCell.End(xlDown).Address)
    ActiveCell.Select

    ActiveCell.Offset(6, 0).Select

    For Each Cell In dwn
        If Cell.Text = "" Then Columns.Delete
    Next      
End Sub    

attached example spreadsheet

1 个答案:

答案 0 :(得分:1)

  1. 您不需要两个循环。
  2. 您提到要隐藏列,但您的代码建议您删除它(我保留了隐藏的解决方案)
  3. 您没有提到哪个是空范围(哪些单元格为空)决定隐藏列 - 我假设所有内容都低于第11行。
  4. 以下代码经过试用,其中包含一些注释。

    Sub checkandhide()
    Dim r As Range
    Dim Cell As Range
    'don't run it for the complete row but from first to last cell in it
    Set r = Range("A6", Cells(6, Columns.Count).End(xlToLeft))
    
    For Each Cell In r
        'you don't need find if you simply need to check value of the cell
        'let's assume we check for 'N' & 'TR'  but not 'n' or 'tr'
        If Cell.Value = "N" Or Cell.Value = "TR" Then
    
            'there are few possibilities to check if there is any value below _
            row 11 (?!) in analysed column. I would use this one:
            If Cells(Rows.Count, Cell.Column).End(xlUp).Row < 12 Then
                Cell.EntireColumn.Hidden = True
            End If
    
        End If
    Next
    End Sub