在数据繁忙的工作表中找不到最后一列

时间:2018-10-22 12:20:38

标签: excel vba excel-vba

我尝试使用vba找出excel电子表格中最后使用的列,以便在该列之后立即开始编写内容。在下面的图像中,我试图显示我的意思以及我想从哪里开始写作。已经在此处选择了所需字段,即“ F2”。

但是,问题是那里已经可用的数据无法保持一致性。如何使用vba找出上次使用的列?

这是我的尝试:

Sub FindLastColumn()
    Dim lCol&

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

它产生 8 的结果,该结果不正确,因为正确的应该是 5

充满数据的工作表如下:

enter image description here

5 个答案:

答案 0 :(得分:1)

您似乎想要在数据末尾的第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

当然,您需要确定工作表上使用的最大 row 并将其传递给MaxUsedColumnInRange函数-除非您碰巧恰好有50行数据,示例测试Sub可能不会为您带来实际的期望结果。

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

答案 1 :(得分:1)

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

<meta name="theme-color" content="#eef1f5">

答案 2 :(得分:1)

简单的方法是使用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"),如果您想跳过支票的第一行。

答案 3 :(得分:1)

使用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 :(得分:0)

使用内置函数无法获得所需的结果,要么获得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

OR

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