Excel:如何在最后一列更改编号时获取最后一列的列索引号

时间:2018-09-04 10:39:34

标签: excel vba excel-vba excel-2010

我正在尝试自动化我的VLOOKUP,以获取每周更新的数据表。目前,我的VLOOKUP如下所示:

=VLOOKUP(A3,'[Report.xlsm]All'!$I:$OA,COLUMN('[Report.xlsm]All'!$NX:$NX)-8,0)

每周两次在表中插入新列(在最后一列之前)。新列中填充了新数据,我必须重新编写VLOOKUP。

我要查找的列始终是倒数第三,倒数第二和最后一列。

是否可以通过查找倒数第三,倒数第二和最后一列的函数来分配列索引号?我认为这样可以添加一个可以为我完成工作的宏。

4 个答案:

答案 0 :(得分:1)

对于最后一列,您可以使用以下代码并将其递减3

Dim lastcolumn As Long
dim ws as worksheet

set ws = activesheet

lastcolumn = ws.UsedRange.Columns.Count

对于公式解决方案,如果数据集没有空白标题,则可以使用counta函数查找最后一列。

如果发现任何问题,我们可以稍后修改代码

答案 1 :(得分:1)

将数据转换为Excel表,然后使用.Range.columns.count。您可以使用 Ctrl + T 并在选定范围内的单元格中创建表格。确保提示包括所有必填列。这是一种可靠的方法。

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

答案 2 :(得分:0)

在第1行中使用文本列标题标签,

=VLOOKUP(A3, '[Report.xlsm]All'!$I:$zz, match("zzz", '[Report.xlsm]All'!$1:$1)-8, false)

对于第1行中的日期或数字,请使用1e99而不是“ zzz”。

答案 3 :(得分:0)

所以我通过使用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")