Как заполнить ячейку, определенную в цикле, текстом, введенным в пользовательскую форму, открытую в цикле в VBA - PullRequest
0 голосов
/ 25 января 2019

Так что название немного сбивает с толку, я уверен. У меня есть цикл, показанный ниже, где определяется диапазон «заметки». Вы также можете видеть, что в цикле twords внизу кода пользовательская форма открывается при определенных условиях. У этого пользователя есть текстовое поле, когда нажата командная кнопка «отправить» в пользовательской форме. Я хочу, чтобы текст, введенный в текстовое поле пользователя, заполнялся до ячейки, в настоящее время определяемой как «примечания». Я не уверен, как это сделать .... В противном случае код работает.

Dim OP As Date
Dim AC As Date
Dim UE As Date
Dim Act As Date
Dim today As Date
Dim notes As Range
Dim OPs As Range
Dim UEs As Range

Dim i As Integer
Dim message As Integer

For i = 0 To 49

today = Date
OP = Sheets("Monthly Status").Cells(i + 23, 11).value
Act = Sheets("Monthly Status").Cells(i + 23, 13).value
UE = Sheets("Monthly Status").Cells(i + 23, 12).value
Set OPs = Sheets("Monthly Status").Cells(i + 23, 14)
Set UEs = Sheets("Monthly Status").Cells(i + 23, 15)
Set notes = Sheets("Monthly Status").Cells(i + 23, 16)



'Filling Original Plan Status

If OP < 1 Then GoTo FillUE 'Goes to the Updated Estimates Calculation if Origonal Plan Contains No Date

    If Act <= OP Then
        notes.Interior.Color = RGB(255, 255, 255)
        OPs = "On Time"
    End If
        If Act > OP Then
            OPs = "Miss"
        Else
            If Act < 1 And today > OP Then
                 OPs = "Incomplete"
            End If
                If Act < 1 And today <= OP Then
                    OPs = "OK"
                End If
            End If




'Filling Updated Estimate Status

FillUE:

If UE < 1 Then GoTo NextLine 'Goes to the next row if Origonal Plan Contains No Date

    If Act <= UE Then
        UEs = "On Time"
    End If
        If Act > UE Then
            UEs = "Miss"
        Else
            If Act < 1 And today > UE Then
                UEs = "Incomplete"
            End If
                If Act < 1 And today <= UE Then
                    UEs = "OK"
                End If
            End If
'Notifying user to fill out notes if a "miss" or "incomplete" is detected

If InStr(UEs, "Miss") > 0 Or InStr(OPs, "Incomplete") > 0 Or InStr(UEs, "Incomplete") > 0 Then
    notes.Interior.Color = RGB(255, 200, 0)
        If notes = "" Then
            UserForm2.Show

        End If
End If

NextLine:
Next

1 Ответ

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

Во-первых, с точки зрения передового опыта, Goto действительно следует избегать вне условного выхода из глубоко вложенного цикла.Вы можете сделать это, переключив

If x < 1 Then Goto someLine
    'Do Stuff
someLine:

на

If x > 0 Then
    'Do Stuff
End If

Чтобы ответить на ваш вопрос, поскольку ваш пользователь просто вводит данные и отправляет, вы могли бы использовать InputBox вместо отображениявся пользовательская форма каждой итерации?Таким образом, весь ваш код (начиная с вашего For-Next Loop) будет выглядеть следующим образом:

For i = 0 To 49

    today = Date
    OP = Sheets("Monthly Status").Cells(i + 23, 11).Value
    Act = Sheets("Monthly Status").Cells(i + 23, 13).Value
    UE = Sheets("Monthly Status").Cells(i + 23, 12).Value
    Set OPs = Sheets("Monthly Status").Cells(i + 23, 14)
    Set UEs = Sheets("Monthly Status").Cells(i + 23, 15)
    Set notes = Sheets("Monthly Status").Cells(i + 23, 16)

    'Filling Original Plan Status

    If OP > 0 Then
        If Act <= OP Then
            notes.Interior.Color = RGB(255, 255, 255)
            OPs = "On Time"
        ElseIf Act > OP Then
            OPs = "Miss"
        Else
            If Act < 1 And today > OP Then
                 OPs = "Incomplete"
            ElseIf Act < 1 And today <= OP Then
                OPs = "OK"
            End If
        End If
    End If

    'Filling Updated Estimate Status

    If UE > 0 Then
        If Act <= UE Then
            UEs = "On Time"
        ElseIf Act > UE Then
            UEs = "Miss"
        Else
            If Act < 1 And today > UE Then
                UEs = "Incomplete"
            ElseIf Act < 1 And today <= UE Then
                UEs = "OK"
            End If
        End If

    'Notifying user to fill out notes if a "miss" or "incomplete" is detected

        If InStr(UEs, "Miss") > 0 Or InStr(OPs, "Incomplete") > 0 Or InStr(UEs, "Incomplete") > 0 Then
            notes.Interior.Color = RGB(255, 200, 0)
            If notes = "" Then
                notes = InputBox("Type Notes", "Notes")
            End If
        End If
    End If

Next

Edit:

Для более чистого кода вы можете объединить некоторые из своих If-End If в If-ElseIf-End If, который я отредактировал, чтобы отразить мой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...