我有一个之前创建的工作表“ 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(?)用作搜索向量的末尾。刚进入我的脑海
答案 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