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

Excel 将公式一直插入到最后一个空列的最后一行,excel,vba,Excel,Vba,我对用VBA编写宏相当陌生,但我正在尽我最大的努力尽可能快地学习。无论如何,我试图完成的任务非常简单,但我很难想出一个方法来完成它 我要做的是将公式粘贴到电子表格最后一个空列的所有行中 因此,在本例中,进入屏幕截图中显示的突出显示的单元格: 例如: 但是,我不想依赖于键入(“K1:K”&lastrow),我要做的是创建对最后一列和最后一行的引用 到目前为止,我只能使用以下方法将公式粘贴到整个列中: lastcol = .Cells(1, .Columns.Count).End(xlToLeft

我对用VBA编写宏相当陌生,但我正在尽我最大的努力尽可能快地学习。无论如何,我试图完成的任务非常简单,但我很难想出一个方法来完成它

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

因此,在本例中,进入屏幕截图中显示的突出显示的单元格: 例如:

但是,我不想依赖于键入(“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”的选项卡中,因为表中的某些项实际上在我正在查找的表中没有值,需要为它们创建JEs。因此,如果我沿着这条路线走,新选项卡中会有很多不必要的行

不管怎样,我试过:

    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试图执行的过程仅限于以我设置宏的方式将数据插入整列或其中的一部分,就像它无法找到最后一列并以我设置宏的方式插入最后一行一样。因此,如果是这样的话,或者如果我应该用不同的方式写的话,我道歉

任何人在这个问题上提供任何建议或指导都将不胜感激


谢谢你抽出时间

用这样的代码替换代码怎么样:

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。

而不是在末尾循环,我只使用
。FillDown

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

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

您还可以使用
formula1c1
,一次性使用公式填充列的单元格,前提是您要小心单元格引用。以下是一个例子:

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]
直接引用每个公式左侧的单元格。

我不确定你在问什么。只要表格没有完全空白的行或列,那么
Range(“A1”).CurrentRegion
将识别表格,您可以从中读取
rows.Count
columns.Count
。然后您就可以准确地知道下一个空白列的位置并将其扩展到。谢谢,这非常有帮助,而且肯定是我需要记住的一种方法,以供将来参考。我记得在我读过的一本书中读到过关于使用For和Next的内容,但我并没有想到它可以解决我的问题,因为直到现在我还没有在现实生活中使用它。感谢您的指导,非常感谢!这种方法似乎可以更快地执行Xabier建议的任务。这两种方法都有效,因此感谢您对这个问题的建议!谢谢你的解释,我为我原来帖子中的混乱道歉。您设置的过程很清楚,看起来会很顺利地完成我所需要的。我可以在另一个答案中使用一个建议来做我需要的事情,但是如果我决定调整它,或者开发一个新的宏来做类似的事情,你上面提供的步骤肯定会派上用场。谢谢你的帮助!