我尝试使用vba找出excel电子表格中最后使用的列,以便在该列之后立即开始编写内容。在下面的图像中,我试图显示我的意思以及我想从哪里开始写作。已经在此处选择了所需字段,即“ F2”。
但是,问题是那里已经可用的数据无法保持一致性。如何使用vba找出上次使用的列?
这是我的尝试:
Sub FindLastColumn()
Dim lCol&
lCol = Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox lCol
End Sub
它产生 8 的结果,该结果不正确,因为正确的应该是 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