检查选定范围内的单元格是否可见

Check if a cell from a selected range is visible

我在 Excel 中有一个 VBA 函数 returns 用户选择的单元格中的文本串联字符串。

这按我的要求工作,但是如果选择中有隐藏单元格,隐藏单元格的值将被包括在内,这是不希望的。发生此问题的示例是过滤 table 时。

有没有办法修改我的函数来检查正在读取的单元格是否可见?

Sub ConcatEmialAddresses()

    Dim EmailAddresses As String

    ActiveSheet.Range("C3").Value = combineSelected()
    ActiveSheet.Range("C3").Select

    Call MsgBox("The email address string from cell ""C3"" has been copied to your clipboard.", vbOKOnly, "Sit back, relax, it's all been taken care of...")

End Sub

Function combineSelected(Optional ByVal separator As String = "; ", _
                         Optional ByVal copyText As Boolean = True) As String

    Dim cellValue As Range
    Dim outputText As String

    For Each cellValue In Selection
        outputText = outputText & cellValue & separator
    Next cellValue

    If Right(outputText, 2) = separator Then outputText = Left(outputText, Len(outputText) - 2)

    combineSelected = outputText

End Function

要确定一个范围是否有隐藏单元格,我会检查每个 row/column 的 height/width 是否不为零:

Function HasHiddenCell(source As Range) As Boolean
  Dim rg As Range

  'check the columns
  If VBA.IsNull(source.ColumnWidth) Then
    For Each rg In source.Columns
      If rg.ColumnWidth = 0 Then
        HasHiddenCell = True
        Exit Function
      End If
    Next
  End If

  ' check the rows
  If VBA.IsNull(source.RowHeight) Then
    For Each rg In source.rows
      If rg.RowHeight = 0 Then
        HasHiddenCell = True
        Exit Function
      End If
    Next
  End If
End Function

Sub UsageExample()
  If HasHiddenCell(selection) Then
    Debug.Print "A cell is hidden"
  Else
    Debug.Print "all cells are visible"
  End If
End Sub

我用过这个

Function areCellsHidden(Target As Range)
    areCellsHidden = False
    If (Target.Rows.Hidden = True) Then
        areCellsHidden = True
    ElseIf (Target.Columns.Hidden = True) Then
        areCellsHidden = True
    ElseIf (Target.Count > 1) Then
        If _
            Target.Count <> Target.Columns.SpecialCells(xlCellTypeVisible).Count _
            Or Target.Count <> Target.Rows.SpecialCells(xlCellTypeVisible).Count _
        Then
            areCellsHidden = True
        End If
   End If
End Function