簡體   English   中英

Excel:在VBA中插入包含excel公式的新行[更新]

[英]Excel: Insert new row that contains excel formula in VBA[Updated]

我有項目的樣本數據。 如您所見,共有4個欄位:截止日期,提交,說明和days_delayed。 另外,在同一張紙上,我有數據的插入形式。 其中,范圍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,所以當有新行進入時。該公式將自動知道需要計算哪些單元格。 我猜想,循環是實現此目的的合適方法。 因為如果我保持定義范圍內的相同公式。 輸出將是相同的。 那可能嗎?

主要問題是您使用.Select 而是使用以下命令確定下一個空閑行號

nRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 

並使用它直接訪問ws.Cells(nRow, "A").Value

另外,請勿將變量聲明為String而應使用Dim Deadline As Range否則您的日期將被轉換為字符串,並且您將無法再使用該日期進行計算。

在公式中,行號需要用" & nRow & "代替,以插入下一個空閑行的行號,而不是固定的行號。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM