Excel: 当最后一列改变数字时如何获取最后一列的列索引号
Excel: how to get column index number for the last column when the last column changes number
我正在尝试为每周更新的数据 sheet 自动执行 VLOOKUP。目前我的 VLOOKUP 看起来像这样:
=VLOOKUP(A3,'[Report.xlsm]All'!$I:$OA,COLUMN('[Report.xlsm]All'!$NX:$NX)-8,0)
每周都会在 table 中插入两个新列(在最后一列之前)。新列填充了新数据,我必须重新编写 VLOOKUP。
我要查找的列始终是倒数第三列、倒数第二列和最后一列。
有没有一种方法可以使用查找倒数第三列、倒数第二列和最后一列的函数来分配列索引号?我想这样我就可以添加一个为我完成这项工作的宏。
对于最后一列,您可以使用以下代码并将其减 3
Dim lastcolumn As Long
dim ws as worksheet
set ws = activesheet
lastcolumn = ws.UsedRange.Columns.Count
对于公式解,如果您的数据集没有空白,您可以使用 counta 函数找到最后一列 headers。
如果您发现任何问题,我们可以稍后修改代码
将您的数据转换为 Excel table,然后使用 .Range.columns.count
。您可以使用 Ctrl+ T 将选定范围内的单元格转换为 table。确保提示包括所有必需的列。这是一个稳健的方法。
Option Explicit
Public Sub test()
Dim totalColumns As Long
With ThisWorkbook.Worksheets("All").ListObjects(1)
totalColumns = .Range.Columns.Count
Debug.Print totalColumns '<==All columns
If totalColumns < 4 Then Exit Sub
Debug.Print totalColumns - 3 '<== etc
End With
End Sub
第 1 行使用文本列 header 标签,
=VLOOKUP(A3, '[Report.xlsm]All'!$I:$zz, match("zzz", '[Report.xlsm]All'!:)-8, false)
对于第 1 行中的日期或数字,使用 1e99 而不是 "zzz"。
所以我使用 MIN 和 COLUMN(S) 函数解决了这个问题:
最后一列:MIN(COLUMN(range)+COLUMNS(range)-1)
对于倒数第二列:MIN(COLUMN(range)+COLUMNS(range)-2)
这是完整的代码:
Dim Rng As Range
Dim DataWorkbook As String
Dim DataWorksheet As String
Dim Data As String
On Error Resume Next
'Input box asking for a range of cells for subsequent VLOOKUPs'
Set Rng = Application.InputBox(Prompt:="Please select data range:", Type:=8)
If Rng Is Nothing Then
MsgBox "Macro Stopped"
Exit Sub
End If
Application.ScreenUpdating = False
DataWorkbook = Rng.Worksheet.Parent.Name
DataWorksheet = Rng.Worksheet.Name
Data = "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address
'VLOOKUPS'
'Column Index for VLOOKUP is MIN(COLUMN(range)+COLUMNS(range)-4) where -4 is the number of columns before the desired column'
ActiveWorkbook.Activate
'Third last column'
Range("D3").Select
ActiveCell.Formula = "=VLOOKUP(A3, " & "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address & ", MIN(COLUMN(" & "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address & ")+COLUMNS(" & "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address & ")-4),0)"
Selection.AutoFill Destination:=Range("D3:D116")
我正在尝试为每周更新的数据 sheet 自动执行 VLOOKUP。目前我的 VLOOKUP 看起来像这样:
=VLOOKUP(A3,'[Report.xlsm]All'!$I:$OA,COLUMN('[Report.xlsm]All'!$NX:$NX)-8,0)
每周都会在 table 中插入两个新列(在最后一列之前)。新列填充了新数据,我必须重新编写 VLOOKUP。
我要查找的列始终是倒数第三列、倒数第二列和最后一列。
有没有一种方法可以使用查找倒数第三列、倒数第二列和最后一列的函数来分配列索引号?我想这样我就可以添加一个为我完成这项工作的宏。
对于最后一列,您可以使用以下代码并将其减 3
Dim lastcolumn As Long
dim ws as worksheet
set ws = activesheet
lastcolumn = ws.UsedRange.Columns.Count
对于公式解,如果您的数据集没有空白,您可以使用 counta 函数找到最后一列 headers。
如果您发现任何问题,我们可以稍后修改代码
将您的数据转换为 Excel table,然后使用 .Range.columns.count
。您可以使用 Ctrl+ T 将选定范围内的单元格转换为 table。确保提示包括所有必需的列。这是一个稳健的方法。
Option Explicit
Public Sub test()
Dim totalColumns As Long
With ThisWorkbook.Worksheets("All").ListObjects(1)
totalColumns = .Range.Columns.Count
Debug.Print totalColumns '<==All columns
If totalColumns < 4 Then Exit Sub
Debug.Print totalColumns - 3 '<== etc
End With
End Sub
第 1 行使用文本列 header 标签,
=VLOOKUP(A3, '[Report.xlsm]All'!$I:$zz, match("zzz", '[Report.xlsm]All'!:)-8, false)
对于第 1 行中的日期或数字,使用 1e99 而不是 "zzz"。
所以我使用 MIN 和 COLUMN(S) 函数解决了这个问题:
最后一列:MIN(COLUMN(range)+COLUMNS(range)-1)
对于倒数第二列:MIN(COLUMN(range)+COLUMNS(range)-2)
这是完整的代码:
Dim Rng As Range
Dim DataWorkbook As String
Dim DataWorksheet As String
Dim Data As String
On Error Resume Next
'Input box asking for a range of cells for subsequent VLOOKUPs'
Set Rng = Application.InputBox(Prompt:="Please select data range:", Type:=8)
If Rng Is Nothing Then
MsgBox "Macro Stopped"
Exit Sub
End If
Application.ScreenUpdating = False
DataWorkbook = Rng.Worksheet.Parent.Name
DataWorksheet = Rng.Worksheet.Name
Data = "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address
'VLOOKUPS'
'Column Index for VLOOKUP is MIN(COLUMN(range)+COLUMNS(range)-4) where -4 is the number of columns before the desired column'
ActiveWorkbook.Activate
'Third last column'
Range("D3").Select
ActiveCell.Formula = "=VLOOKUP(A3, " & "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address & ", MIN(COLUMN(" & "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address & ")+COLUMNS(" & "'[" & DataWorkbook & "]" & DataWorksheet & "'!" & Rng.Address & ")-4),0)"
Selection.AutoFill Destination:=Range("D3:D116")