使用更改的单元格参考在VBA中创建和粘贴公式

时间:2019-07-18 00:12:16

标签: excel vba

我需要创建一个公式,将三个不同的单元格连接成一个日期。该公式将成为循环函数的一部分,因此我需要在循环函数运行时更改单元格引用。

我在区分“部分”和“单元格引用”所必需的语法时遇到麻烦,例如“&”和“””。

现在,我只是试图将公式粘贴到没有循环的单个单元格中。我要合并的3个单元格在N,O和P列中。我正在尝试将公式粘贴到M列中。

我尝试在单独的“数据”选项卡上创建公式,然后使用VBA将其复制并粘贴到每个单元格中,但是行号不会根据粘贴公式的行而更新。

我尝试将&和“”重新排列了一段时间,但无法确定获胜组合。

FormulaRow = Cells(Rows.Count, "M").End(xlUp).Offset(1).Row

M_Formula = "=N" & FormulaRow & "" / "" & "O" & FormulaRow & "" / "" & "P" & FormulaRow

Range("M" & FormulaRow).Value = M_Formula

我希望得到以下结果:= N5&“ /”&O5&“ /”&P5,其行号与粘贴公式的行相对应。

当我尝试复制和粘贴方法时,出现以下消息:“对象不支持此属性或方法”

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

当您一次执行范围操作时,Excel足够聪明,可以增加行引用:

Range("M5:M" & Range("N" & rows.count).end(xlup).row).formula = "=N5 & ""/"" & O5 & ""/"" & P5"

那将在1行中完成您想要的操作。

然后,您可以复制结果,将其粘贴为值,然后使用以下格式格式化为日期:

Sub EnterDate()
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).Formula = "=N5 & ""/"" & O5 & ""/"" & P5"
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).Copy
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).PasteSpecial xlPasteValues
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).NumberFormat = "DD/MM/YYYY"
    'Force a reevaluate to make it see actual dates
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).Formula = Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).Value
End Sub

使用这种方法,我刚刚对12,000多行进行了测试,并且花费了不到一秒钟的时间。

关于使用date函数的注释,使用date函数是一种更好的方法,我想向您展示如何使用自己的方法来做,但是如果您使用Date,则可以摆脱格式代码像这样:

Sub EnterDate()
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).Formula = "=DATE(P5,O5,N5)"
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).Copy
    Range("M5:M" & Range("N" & Rows.Count).End(xlUp).Row).PasteSpecial xlPasteValues
End Sub

如果要保留公式,则只需删除其中的最后两行。

答案 1 :(得分:0)

也许:

Sub sub1()
' If you have 12 in N2 and 34 in O2 and 5678 in P2:
  Dim FormulaRow&, M_Formula$
  FormulaRow = 2
  M_Formula = "=N" & FormulaRow & "&" & """" & "/" & """" & "&" & _
               "O" & FormulaRow & "&" & """" & "/" & """" & "&" & _
               "P" & FormulaRow
  Cells(FormulaRow, ColNum("M")) = M_Formula ' gives the formula you want 12/34/5678
  Cells(FormulaRow, 13) = M_Formula ' also gives the formula you want 12/34/5678
End Sub

Function ColNum&(col$)
  ColNum = Range(col & 1).Column
End Function