在动态列数中粘贴(动态)查找公式

时间:2018-11-11 23:38:26

标签: excel vba excel-vba

我有一个之前创建的工作表“ 2018”和“ 2019”。 2019与2018的不同之处仅在于它可能添加了一些行和/或删除了一些行。 表格单元格“ A3”和向下的单元格中列出了技能,如果该列所属的人员具有此技能,则在该栏中列出“ X”。

现在我需要使用以下公式用已知X填充2019的列,首先是范围选择部分的上下文代码:

Dim rng As Range
Dim rngbegin As Range
Dim rngend As Range
Dim newrng As Range

Sheets("2018").Activate

   Set rng = Application.InputBox '...and rest of the code

rng.Copy
Sheets("2019").Range("B:B").Insert Shift:=xlToRight

Sheets(2019).Activate
Set rngbegin = rng.Cells(3, 1)
Set rngend = rng.Cells(3000, rng.Columns.Count)
Set newrng = Range(rngbegin.Address & ":" & rngend.Address)
newrng.ClearContents 'To clear everything in the difined range but the headder rows

如果列不变,我可以使用以下公式。

Range("B3").Select
ActiveCell.Formula = "=IFERROR(LOOKUP(2,1/($A3='2018'!$A$3:D$5000),'2018'!$B$3:$B$5000),"")"
    Range("B2").AutoFill Destination:=Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row)

该公式有效,但是我遇到以下问题:

1-必需)我无法对每一列进行硬编码,因为列数可能会发生变化。 (我将列数存储为通过application.inputbox从用户中选择的范围var-这就是我在新的2019年工作表中插入列的方式)

2-可选)我将行硬编码为比使用的行高得多的数字,因为我不计算A列的数量,然后将range.count.Address(?)用作搜索向量的末尾。刚进入我的脑海

1 个答案:

答案 0 :(得分:1)

您可能需要调整一些地址。我保留了许多代码,因此您可以轻松地将我提出的内容用于您的目的。

Sub Whatever()

With Sheets("2018")

    ' Get the address of the old range, not used later in the macro
    iRows = .Cells(Rows.Count, 1).End(xlUp).Row
    iCols = .Cells(3, Columns.Count).End(xlToLeft).Column
    Set rngOld = Range(.Cells(3, 2), .Cells(iRows, iCols))

End With

With Sheets("2019")

    ' Get the address of the new range
    iRows = .Cells(Rows.Count, 1).End(xlUp).Row
    iCols = .Cells(2, Columns.Count).End(xlToLeft).Column

    Set rngNew = Range(.Cells(3, 2), .Cells(iRows, iCols))

    'Clear the new range
    rngNew.Clear

    ' Populate the formula
    ' Not very elegant, VBA solution would probably look nicer
    .Range("B3").Formula = "=IFERROR(if(LOOKUP(2,1/('2018'!$A$3:$A$" & iRows & " =$A3),'2018'!B$3:B$" & iRows & ")=""X"",""X"",""""),"""")"

    'Fill the formula
    Set rngTemp = .Range(.Cells(3, 2), .Cells(3, iCols))
    rngTemp.FillRight
    Set rngTemp = .Range(.Cells(3, 2), .Cells(iRows, iCols))
    rngTemp.FillDown

End With

End Sub