将公式一直插入到最后一个空列

时间:2018-01-12 15:39:30

标签: excel-vba vba excel

我很擅长在VBA中编写宏,但我尽我所能尽可能快地学习。无论如何,我尝试执行的任务非常简单,但是我无法想出办法。

我想要做的是将公式粘贴到电子表格的最后一个空列中的所有行中。

所以在这种情况下,进入屏幕截图中显示的突出显示的单元格: 例如:

enter image description here

但是,我不想依赖打字(“K1:K”和“lastrow”),我想要做的是创建对最后一列和最后一行的引用。

到目前为止,我只能使用以下方法将公式粘贴到整个列中:

lastcol = .Cells(1, .Columns.Count).End(xlToLeft).Offset(0, 1).Column
fvlookup = "=vlookup(@1,@2,@3,False)"
fvlookup = Replace (fvlookup, "@1", rng.Address)
fvlookup = Replace (fvlookup, "@2", [LookupFile.csv]LookupFile!$B:$1")
fvlookup = Replace (fvlookup, "@3", "5")
.Columns(lastcol).Formula = fvlookup

但是稍后在我正在处理的过程中,我想删除所有“#N / A”并将它们放入名为“JEs”的不同选项卡中,因为表中的某些项目实际上并非如此在我正在查看的表中有一个值,并且需要为它们创建JE。所以,如果我走这条路,我会在新标签中有很多不必要的行。

无论如何,我试过这个:

    lastcol = .Cells(1, .Columns.Count).End(xlToLeft).Offset(0,1).Column
    fvlookup = "=VLOOKUP(@1,@2,@3,False)"
    fvlookup = Replace(fvlookup, "@1", rng.Address)
    fvlookup = Replace(fvlookup, "@2", "[LookupFile.csv]LookupFile!$B:$I")
    fvlookup = Replace(fvlookup, "@3", "5")
    With .Columns(lastcol)
    lrow = .range("A" & .Rows.Count).End(xlUp).Row
    .Rows(lrow).Formula = fvlookup
    End With

但它只将公式放入“K1”(参考附图)

我已经尝试在粘贴公式并自动填充后选择此值(我知道建议避免使用vba选择范围,但我仍然想尝试作为最后的手段),但它说它不是'允许。

我也尝试过使用:

.range(lastcol & .range("A" & .Rows.Count).End(xlUp).Rows).Formula = fvlookup

但是这给了我运行时错误'1004':应用程序定义的或对象定义的错误。我尝试创建一个名为'lrange'的变量,并将其设置为类似于我设置lastcol的方式,但没有运气(它返回与上面相同的错误消息)。我也尝试在上面的字符串中将lastcol编辑为lastcol.Column或.Columns(lastcol),但仍然没有。

我尝试过研究类似的问题,并且所有的建议都建议定义两个变量(一个是一个变量,一个是最后一个变量)并将公式插入到该范围内,但这似乎与我正在使用的不一致。

我觉得VBA尝试执行的过程仅限于能够以我设置宏的方式将数据插入整个列或其中的一部分,就像它无法找到最后一列一样并按照我设置的方式一直插入最后一行。如果是这种情况,我会道歉,或者我应该以不同的方式写出来。

任何人都可以就此主题提供的任何建议或指示将不胜感激。

感谢您的时间!

3 个答案:

答案 0 :(得分:1)

不是在最后循环,而是使用.FillDown

Cells(2, lastcol).FormulaR1C1 = fvlookup
Range(Cells(2, lastcol), Cells(lrow, lastcol)).FillDown

答案 1 :(得分:0)

如何用这样的代码替换你的代码:

Sub foo()
    lastcol = .Cells(1, .Columns.Count).End(xlToLeft).Offset(0, 1).Column
    fvlookup = "=VLOOKUP(@1,@2,@3,False)"
    fvlookup = Replace(fvlookup, "@1", Rng.Address)
    fvlookup = Replace(fvlookup, "@2", "[LookupFile.csv]LookupFile!$B:$I")
    fvlookup = Replace(fvlookup, "@3", "5")

    lrow = .Range("A" & .Rows.Count).End(xlUp).Row
    For i = 2 To lrow
        .Cells(i, lastcol).Formula = fvlookup
    Next i

End Sub

这将从第2行循环到lastrow并将公式添加到lastcol。

答案 2 :(得分:0)

只要表没有完全空白的行或列(因为它不应该),Range("A1").CurrentRegion标识表的范围。然后,.Rows.Count.Columns.Count会为您提供使用公式填充相邻列所需的信息。

您还可以使用FormulaR1C1一次性使用公式填充列的单元格 - 前提是您要小心进行单元格引用。这是一个例子:

Dim tableRange As Range
Dim x As Integer, y As Integer

Set tableRange = Range("A1").CurrentRegion

x = tableRange.Rows.Count
y = tableRange.Columns.Count

'fill the adjacent column with a SUM function summing across each row
Range(Cells(2, y + 1), Cells(x, y + 1)).FormulaR1C1 = "=SUM(RC[-" & y & "]:RC[-1])"

(您也可以使用y和1为此新列指定标题。)

如果您需要使用特定(绝对)地址(例如$B:$I)复制VLOOKUP,那么我将首先命名该范围并在公式中插入名称。

这样的一个例子是:

.FormulaR1C1 = "=VLOOKUP(RC[-1],mylookup,2,FALSE)"

其中mylookup是范围名称,RC[-1]正在引用每个公式左侧的单元格。