Excel: вставить новую строку, содержащую формулу Excel, в VBA [Обновлено] - PullRequest
0 голосов
/ 10 января 2019

У меня есть примерные данные моего проекта. Как вы можете видеть, есть 4 столбца: крайний срок, отправленный, описание, и days_delayed. Кроме того, в том же листе у меня есть форма вставки данных. Где Диапазон G1 - крайний срок, а G3 - фактическая дата, когда пользователь представляет свой документ.

enter image description here

В этом коде вы будете использовать условный оператор, написанный формульным способом внутри 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. В сообщении об ошибке говорится «Конец оператора»


Исправлено Пэ Вставка формулы в 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, поэтому, когда придет новая строка. Формула автоматически знает, какие ячейки необходимо вычислить. Я предполагаю, что циклы - подходящий способ для этого. Потому что если я останусь той же формулой с определенными диапазонами. Выход будет таким же. Это возможно?

1 Ответ

0 голосов
/ 10 января 2019

Основная проблема заключается в том, что вы используете .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...