代码之家  ›  专栏  ›  技术社区  ›  SIM

无法从充满数据的工作表中查找最后一列

  •  1
  • SIM  · 技术社区  · 7 年前

    我试着在我的Excel电子表格中找出最后一个使用过的列,用VBA在该列之后开始写东西。在下面的图片中,我试图展示我的意思和我想从哪里开始写作。所需字段已在此处选择,即“F2”。

    然而,问题是现有的数据没有保持一致性。如何使用VBA计算最后使用的列?

    这是我的尝试:

    Sub FindLastColumn()
        Dim lCol&
    
        lCol = Cells(1, Columns.Count).End(xlToLeft).Column
        MsgBox lCol
    End Sub
    

    它产生 结果是不正确的 .

    数据列表如下:

    enter image description here

    5 回复  |  直到 7 年前
        1
  •  1
  •   Xabier    7 年前

    如果要查找范围中除标题之外的最后一列,可以按如下方式实现,将工作表名称从Sheet1修改为实际使用的工作表:

    Sub foo()
    LastRow = Sheet1.UsedRange.Rows.Count
    'get the last row with data in your used range
    MaxCol = 1
    For i = 2 To LastRow 'loop from row 2 to last
        If Sheet1.Cells(i, Sheet1.Columns.Count).End(xlToLeft).Column > MaxCol Then
            MaxCol = Sheet1.Cells(i, Sheet1.Columns.Count).End(xlToLeft).Column
            'get the highest value for the column into variable
        End If
    Next i
    MsgBox MaxCol
    End Sub
    
        2
  •  1
  •   FreeMan    7 年前

    似乎您希望在数据的第2行中找到最常用的右侧列。要做到这一点,您需要遍历所有数据行,以跟踪哪一列是 Max(LastUsedColumn) . 不幸的是,没有这样的内置函数,但是您可以编写这样的函数:

    Public Function MaxUsedColumnInRow(ByVal SheetToCheck As Worksheet, ByVal RowToCheck As Long) As Long
      MaxUsedColumnInRow = SheetToCheck.Cells(RowToCheck, Columns.count).End(xlToLeft).Column
    End Function
    

    现在您有了一个漂亮的函数来确定哪一列是行中使用的最大列,您可以在循环中调用它,如下所示:

    Public Function MaxUsedColumnInRange(ByVal SheetToCheck As Worksheet, ByVal StartRow As Long, ByVal EndRow As Long) As Long
    
      Dim curRow As Long
      For curRow = StartRow To EndRow
        Dim CurCol As Long
        CurCol = MaxUsedColumnInRow(SheetToCheck, curRow)
        Dim maxCol As Long
        If CurCol > maxCol Then
          maxCol = CurCol
        End If
      Next
    
    End Function
    

    最后,给它一个快速测试,将“Sheet1”替换为您要特别检查的工作表的名称:

    Public Sub TestIt()
      MsgBox "Max Used column on sheet1 = " & CStr(MaxUsedColumnInRange("Sheet1", 2, 50))
    End Sub
    

    当然,您需要确定使用的最大值 在你的床单上,把它传给 MaxUsedColumnInRange 函数-除非正好有50行数据,否则示例测试 Sub 可能不会得到你真正想要的结果。

    作为一个附带的好处,您现在有了一个方便的函数,将来您可以调用它来确定一行中的max列,这样您就不必记住正确的方法了。(我通常忘记了,所以我必须查找它,或者使用一个漂亮的助手函数为我“记住”。)

        3
  •  1
  •   Darren Bartrup-Cook    7 年前

    使用的变体 Find 查找方法,但限制为忽略第1行:

    Sub Test()
    
        Dim rng As Range
    
        Set rng = LastCell(Sheet1)
    
        MsgBox "Last cell containing data is " & rng.Address & vbCr & _
               "Selected cell is in example is " & Sheet1.Cells(2, rng.Column + 1).Address
    
    End Sub
    
    Public Function LastCell(wrkSht As Worksheet) As Range
    
        Dim lLastCol As Long, lLastRow As Long
    
        On Error Resume Next
    
        With wrkSht.Rows("2:1048576")
                lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
                lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    
            If lLastCol = 0 Then lLastCol = 1
            If lLastRow = 0 Then lLastRow = 1
    
            Set LastCell = wrkSht.Cells(lLastRow, lLastCol)
    
        End With
        On Error GoTo 0
    
    End Function
    
        4
  •  1
  •   Marcucciboy2 Scott Craner    7 年前

    简单的路线是使用 Find 如下所示:

    Dim rgLastColumnCell As Range
    Set rgLastColumnCell = ActiveSheet.Cells.Find("*", , , , xlByColumns, xlPrevious)
    MsgBox "Last Used Column is : " & rgLastColumnCell.Column
    

    调整 ActiveSheet.Cells 适合您需要的部分,如: Activesheet.Range("B2:XFD1048576") 如果您想从支票中跳过第一行。

        5
  •  0
  •   usmanhaq    7 年前

    您无法通过使用内置函数获得所需的结果,或者您可以获取列H,因为它是最后一个使用的列,或者列B,因为它是最后一个填充的列,要获取E,您必须编写自己的代码,并且从它的外观来看,您似乎希望颜色的结尾范围。可以检查循环中不存在颜色的最后一列

    Sub checkLastColumn()
        col_num = 1
        Do While Cells(2, col_num).Interior.Pattern <> xlNone
            col_num = col_num + 1
        Loop
        MsgBox col_num
    End Sub
    

    它将返回F列

    编辑….

    正如我前面所说,您不能通过任何内置函数获得所需的单元,您必须编写一些代码,为了实现这一点,您必须具有一个明确的逻辑,该逻辑应该在您和工作表的用户之间知道并决定。

    例如:

    • 你可以像你已经做的那样给范围上色。
    • 您可以为列标题命名,例如在您的示例中,它是状态。
    • 您可以固定数据列和状态列的数量,并且不需要使用任何代码。

    用于查找状态列或其他任何列(如果您决定可以使用以下循环)

    Sub getStatusColumn()
        col_num = 1
        Do While Cells(1, col_num) <> "status"
            col_num = col_num + 1
        Loop
        MsgBox col_num
    End Sub
    

    Sub getLastItemColumn()
        col_num = 1
        Do While Left(Cells(1, col_num), 4) = "Item"
            col_num = col_num + 1
        Loop
        MsgBox col_num
    End Sub
    
    推荐文章