【问题标题】:How Do I Find The Cells With Contiguous Data In A Row In Excel VBA?如何在Excel VBA中找到连续数据的单元格?
【发布时间】:2010-12-08 05:32:21
【问题描述】:

鉴于图像...如果我知道有一些数据从 Range("B3") 开始。
如何找到具有直到单元格 E3 的连续数据的单元格?由于 F3 为空白,因此不应考虑从 G3 开始。 结果可以是范围对象 (B3:E3) 或单元格计数(在本例中为 4)。

通过将 B3 设置为活动单元格并执行..

Range(ActiveCell, ActiveCell.End(xlToRight).Count

我确实得到了计数,但是这种方法不可靠,如果只有 B3 有数据,它会计算单元格直到工作表末尾。
当然,这也可以通过循环遍历单元格来实现,但我宁愿使用工作表函数或其他一些有效的方法。

【问题讨论】:

    标签: excel vba office-2007


    【解决方案1】:

    我喜欢使用一个函数来计算包含值的列,直到它遇到一个空单元格。返回值可用于设置 FOR NEXT 循环以搅动表格。这是我的做法:

    Sub tester()
        Dim Answer
        Answer = CountColumns(3, 2)
        MsgBox "There are " & Answer & " columns."
     End Sub
    Public Function CountColumns(ByVal startRow As Integer, ByVal startColumn As Integer)
        'Pass starting location in spreadsheet for function to loop through until
        'empty cell is found. Return count of columns function loops through
    
         Do While ActiveSheet.Cells(startRow, startColumn).Value <> ""
            startColumn = startColumn + 1
         Loop
         startColumn = startColumn - 1
         CountColumns = startColumn
     End Function
    

    【讨论】:

      【解决方案2】:

      根据您需要获得的通用程度,它可能很简单

      Application.WorksheetFunction.Count([b4:e4])
      

      如果你想配合ActiveCell,试试

      Application.WorksheetFunction.Count(intersect(activecell.CurrentRegion, activecell.EntireRow))
      

      【讨论】:

      • WorksheetFunction.count 将不起作用,因为我在编译时不知道参数 e4,请查看我对 dendarii 的回复。让我看看另一个。
      【解决方案3】:

      <pre>Intersect(Activecell.CurrentRegion, ActiveCell.EntireRow)</pre>

      将返回 B3:E3。或者

      If IsEmpty(ActiveCell.Offset(0,1).Value) Then
         Set rMyRange = ActiveCell
      Else
         Set rMyRange = ActiveCell.Parent.Range(ActiveCell, ActiveCell.End(xlToRight))
      End If

      rMyRange 也会返回 B3:E3

      【讨论】:

      • 第二种方案好像不错!再次让我检查一下!
      【解决方案4】:

      您似乎正在尝试确定一行中使用的连续列数,从单元格 B3 开始。

      下面的代码将根据您的数据返回 $B$3:$E$3 和 4 的值。如果只有单元格 B3 有数据,它将返回 $B$3 和 1。

      Sub GetDataArea()
      
      Dim strCellToTest As String
      Dim rngMyRange As Range
      Dim lngColumns As Long
      
      strCellToTest = "B3"
      
      lngColumns = ActiveWorkbook.ActiveSheet.Range("" & strCellToTest).End(xlToRight).Column - 1
      
      If lngColumns >= 256 Then
       Set rngMyRange = ActiveWorkbook.ActiveSheet.Range("" & strCellToTest)
       lngColumns = 1
      Else
       Set rngMyRange = ActiveWorkbook.ActiveSheet.Range _
       (strCellToTest & ":" & Range("" & strCellToTest).Offset(0, lngColumns - 1).Address)
      End If
      
      MsgBox "Columns: " & lngColumns & vbCr & vbLf & "Range: " & rngMyRange.Address
      
      End Sub
      

      【讨论】:

        【解决方案5】:

        您可以使用 CurrentRegion 属性。这将返回与指定范围连续的范围。所以……

        Range("B3").CurrentRegion returns the range B3:E3
        Range("B3").CurrentRegion.Columns.Count returns 4
        Range("B3").CurrentRegion.Cells.Count also returns 4
        

        但是,如果您在第 4 行及以下有数据(假设您在 B4:E6 中有数据),那么您会得到这些结果

        Range("B3").CurrentRegion returns the range B3:E6
        Range("B3").CurrentRegion.Columns.Count returns 4
        Range("B3").CurrentRegion.Cells.Count returns 16
        

        这就是你想要的吗?

        【讨论】:

        • 好主意,但我可能在所述行上方和下方的行中有数据,因此 CurrentRegion 可能无法返回正确的值。
        • 我认为 CurrentRegion 总是返回 >= 已使用区域的边界区域。因此,鉴于他有列标题,CurrentRegion.Columns 将始终返回 4。
        • 在他最初的问题中,他说结果可能是一个范围或一个计数。我认为在这种情况下他想要计数为 4,这会给他 B3 周围当前区域中的列数。也许凯文可以澄清一下?
        • @dendarii:关于你的第一个问题,我真的不知道我是否认为当前区域需要在数据的所有侧面都有一个单元格空白区域才能正常工作。但在我的情况下,它们可能是从 B2 甚至 B1 以及 B4 和 B5 开始的行中的数据,我没有在图像中显示。所以真的不知道 CurrentRegion 会成功,但会检查你的建议
        • @Ryan Shannon:嗯,我已经回答了 dendarii 并希望能澄清你的问题,我刚刚检查了 Columns.Count 以及 B3 行上方或下方是否有一些数据并且它扩展了更多比列标题然后 CurrentRegion 甚至选择它们。
        猜你喜欢
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        相关资源
        最近更新 更多