VBA: ошибка 1004 при попытке загрузить пользовательскую форму с непустого листа - PullRequest
1 голос
/ 11 ноября 2019

Я создал пользовательскую форму с именем blocksForm внутри книги. Кнопки внутри формы заполнят лист BBG данными из формы. Я хочу, чтобы форма могла отображаться, даже если мой лист BBG не пустой и заполните следующую пустую ячейку. Моя форма будет загружаться только после нажатия кнопки команды, когда лист BBG пуст.

Когда лист не пуст, и я нажимаю кнопку команды, чтобы загрузить форму, я получаю ошибку 1004 и отладчиквыделение Load blocksForm из моего кода

Private Sub blocksSorter_Click()
    Load blocksForm
    blocksForm.Show
End Sub

Я предполагаю, что проблема может быть из-за кода инициализации, приведенного ниже, но я не могу точно указать его

Public Sub UserForm_Initialize()

    With Worksheets("DATA")
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    With Worksheets("BBG")
        lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With

    MsgBox (lastRow)

    If Worksheets("BBG").Range("A1") = "" And i < 3 Then
        i = 2
    End If

    activeCheck.Value = False
    itwCheck.Value = False
    yestCheck.Value = False
    recentCheck.Value = False
    TextBox2.Value = ""

    ric = Worksheets("DATA").Range("H" & i)
    name = Worksheets("DATA").Range("B" & i)
    valueUSD = Worksheets("DATA").Range("C" & i)
    adV = Worksheets("DATA").Range("D" & i)
    sitchStr = ""
    dstr = ""
    timeStr = ""

    pStr = ric & "   " & name & "   " & valueUSD & "   " & adV

    Label1.Caption = pStr

    If i > lRow Then
        Unload Me
        Application.Worksheets("BBG").Activate
    End If

End Sub

Моя публикацияпеременные

Public valueUSD, name, ric, adV, dstr, sitchStr, timeStr, pStr As String
Public i, lRow, lastRow, j, k As Long

Остальная часть моего кода

Private Sub activeCheck_Change()

    If activeCheck.Value = True Then
        sitchStr = activeCheck.Caption
        dstr = dstr + sitchStr
    Else
        sitchStr = ""
    End If

End Sub

Private Sub itwCheck_Change()

    If activeCheck.Value = False And itwCheck.Value = True Then
        sitchStr = sitchStr + itwCheck.Caption
        dstr = dstr + sitchStr
    ElseIf activeCheck.Value = True And itwCheck.Value = True Then
        MsgBox ("You can only be active OR ITW")
    End If

End Sub

Private Sub yestCheck_Change()

    If yestCheck.Value = True Then
        timeStr = timeStr & " " & yestCheck.Caption
        dstr = dstr + timeStr
    End If

End Sub

Private Sub recentCheck_Change()

    If yestCheck.Value = False And recentCheck.Value = True Then
        timeStr = timeStr & " " & recentCheck.Caption
        dstr = dstr + timeStr
    ElseIf yestCheck.Value = True And recentCheck.Value = True Then
        MsgBox ("You cannot select both yesterday and recently")
    End If

End Sub

Private Sub TextBox2_Change()

    If sitchStr = "" Then
        dstr = TextBox2.Value
    ElseIf sitchStr <> "" Then
        dstr = sitchStr & timeStr & ", " & TextBox2.Value
    End If

End Sub

Private Sub addBtn_Click()

    Application.ScreenUpdating = False
    Dim pasteSheet As Worksheet

    Set pasteSheet = Application.Worksheets("SHANE FOR BBG")

    If j = 0 Then j = 1

    If Worksheets("BBG").Range("A1") = "" Then
        k = 1
    ElseIf Worksheets("BBG").Range("A1") <> "" Then
        With Worksheets("BBG")
            lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
        End With
        j = lastRow + 2
    End If

    If Not IsError(Application.Match(name, Sheets("BBG").Range("A:A"), 0)) Then
        MsgBox ("This is already on your list")
    End If

    pasteSheet.Cells(j, k) = name
    pasteSheet.Cells(j, k + 1) = "(" & ric & ")"
    pasteSheet.Cells(j + 1, k) = valueUSD & ","
    pasteSheet.Cells(j + 1, k + 1) = " " & adV & " ADV"



    If dstr = "" Then
        j = j + 3
    ElseIf dstr <> "" Then
        pasteSheet.Cells(j + 2, k) = dstr
        j = j + 4
    End If

    i = i + 1

    UserForm_Initialize

End Sub

Private Sub skipBtn_Click()

    If i = 2 Then
        i = 3
    Else
        i = i + 1
    End If

    UserForm_Initialize

End Sub

Private Sub prevBtn_Click()

    i = i - 1
    MsgBox (dstr)
    UserForm_Initialize

End Sub

Sub exitBtn_Click()
    Unload Me
End Sub




1 Ответ

0 голосов
/ 11 ноября 2019

Вы можете включить оператор IF, чтобы предотвратить ошибку, но это не решит основную проблему того, как i был установлен на 0, во-первых ...

If i = 0 Then
    Msgbox "Somehow, i got set to zero. Aborting."
    Exit Sub
Else
    ric = Worksheets("DATA").Range("H" & i)
    name = Worksheets("DATA").Range("B" & i)
    valueUSD = Worksheets("DATA").Range("C" & i)
    adV = Worksheets("DATA").Range("D" & i)
End If
...