【问题标题】:Excel: Insert new row that contains excel formula in VBA[Updated]Excel:在 VBA 中插入包含 excel 公式的新行[更新]
【发布时间】:2019-01-10 06:59:32
【问题描述】:

我有我项目的示例数据。如您所见,有 4 列:deadline、submitted、description 和 days_delayed。另外,在同一张表中我有数据的插入形式。其中 Range G1 是截止日期,G3 是用户提交文档的实际日期。

在这段代码中,您将在 vba 中以公式方式编写条件语句。这样每次添加新行时,公式都会跟随并复制到其相应的单元格区域。

    Private Sub CommandButton1_Click()

    Dim Deadline, Submitted, Description, Days_Delayed As String
    Worksheets("Sheet3").Select
    Deadline = Range("G1")
    Submitted = Range("G3")
    Description = "=IF(AND(D2>0,ISBLANK(B2)),"NO- 
    DOCUMENT",IF(AND(D2<=0,NOT(ISBLANK(B2))),"ON-TIME", IF(AND(D2 > 0,NOT(ISBLANK(B2))),"DELAYED")))"
    Days_Delayed = "=IF(COUNT(A2:B2)=2,B2-A2,IF(B2="","0"))"


    Worksheets("Sheet3").Select
    Worksheets("Sheet3").Range("A2").Select
    If Worksheets("Sheet3").Range("A2").Offset(1, 0) <> "" Then
    Worksheets("Sheet3").Range("A2").End(xlDown).Select
    End If



    ActiveCell.Offset(1, 0).Select
    ActiveCell.Value = Deadline
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Value = Submitted
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Formula = Description
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Formula = Days_Delayed

    End Sub

这段代码运行良好,但是当我尝试在 vba 代码中实现公式时。错误说“语句结束”


由 Peh 修复 VBA的公式插入应该是这样的

Days_Delayed = "=IF(COUNT(N36:O36)=2,O36-N36,IF(O36="""",TODAY()-N36))"

另一个问题是:

由于添加的新行是新数据,因此公式不应在其中放置定义的范围。

Days_Delayed = "=IF(COUNT(N36:O36)=2,O36-N36,IF(O36="""",TODAY()-N36))"

在此公式中,您可以看到定义了公式范围。我想要解决的是做这样的事情:

Days_Delayed = "=IF(COUNT(N(i):O(i))=2,O(i)-N(i),IF(O(i)="""",TODAY()-(i)))"

你可以看到有变量 i 所以当新行进来时。公式会自动知道需要计算哪些单元格。我想,循环是合适的方式。因为如果我在定义范围内保持相同的公式。输出将是相同的。这可能吗?

【问题讨论】:

  • 请注意Dim Deadline, Submitted, Description, Days_Delayed As String只将最后一个变量声明为String,其他的都是Variant。您必须为 每个 变量指定一个类型:Dim Deadline As String, Submitted As String, Description As String, Days_Delayed As String。 • 请阅读并申请您的代码How to avoid using Select in Excel VBA。使用Select 会大大降低您的代码速度并且不是很可靠。
  • 致您的问题:如果您在其他引号中使用引号",则必须将它们加倍。例如:Days_Delayed = "=IF(COUNT(A2:B2)=2,B2-A2,IF(B2="","0"))" 必须是 Days_Delayed = "=IF(COUNT(A2:B2)=2,B2-A2,IF(B2="""",""0""))"
  • 现在我明白了,有没有办法不声明该公式内的单元格范围。喜欢循环吗?
  • 我不明白你的意思。请edit您的问题使用我上面提到的修复程序更新代码并提出更详细的问题。告诉我们你想要做什么而不是你不想做什么可能更容易理解。
  • 查看更新后的帖子,谢谢

标签: excel vba excel-formula


【解决方案1】:

主要问题是您使用.Select。而是用

确定下一个空闲行号
nRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 

并使用它直接访问单元格ws.Cells(nRow, "A").Value

也不要将您的变量声明为String,而应使用Dim Deadline As Range,否则您的日期将被转换为字符串,并且您无法再使用日期进行计算。

在公式中,行号需要替换为" &amp; nRow &amp; ",以插入下一个空闲行的行号,而不是固定的行号。

Option Explicit

Public Sub AddData()
    Dim ws As Worksheet 'define worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet3")

    Dim Deadline As Range 'define deadline range
    Set Deadline = ws.Range("G1")

    Dim Submitted As Range 'define submitted range
    Set Submitted = ws.Range("G3")

    Dim nRow As Long 'find next free row = last used used row +1
    nRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1


    ws.Cells(nRow, "A").Value = Deadline.Value
    ws.Cells(nRow, "B").Value = Submitted.Value

    ws.Cells(nRow, "C").Formula = "=IF(AND(D" & nRow & ">0,ISBLANK(B" & nRow & ")),""NO-DOCUMENT"",IF(AND(D" & nRow & "<=0,NOT(ISBLANK(B" & nRow & "))),""ON-TIME"", IF(AND(D" & nRow & " > 0,NOT(ISBLANK(B" & nRow & "))),""DELAYED"")))"
    ws.Cells(nRow, "D").Formula = "=IF(COUNT(A" & nRow & ":B" & nRow & ")=2,B" & nRow & "-A" & nRow & ",IF(B" & nRow & "="""",""0""))"
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多