Ошибка компиляции: требуется слишком большая процедура - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над большим проектом Excel, который требует ввода большого количества данных, распределенных по рабочему листу, которые должны быть введены как можно быстрее. Чтобы попытаться помочь с записью, я создал несколько пользовательских форм, в которые пользователь вводит данные. Одна такая форма возвращает вышеупомянутую ошибку «Process Too Large» при попытке передать данные.

Я понимаю, почему ошибка выскакивает - это слишком долго. Я включил код для одной такой записи (немного измененный, конечно) и мне было интересно, как я смогу его урезать?

    Dim ws As Worksheet
    Dim i As Long
    Set ws = ThisWorkbook.Sheets("STOCK")

' 101
If entry101.Value <> "" Then
Dim NUM101 As String

If com101.Value <> "" Then
    NUM101 = "# - " & UCase(com101.Value)
Else
    NUM101 = ""
End If

    If cmb101.Value = "FULL" Then
        ws.Range("_101").Value = UCase(code101.Value) & " " & Chr(10) & UCase(com101.Value) & " - FULL " & Chr(10) & " "
    End If
    If cmb101.Value = "OUT OF STOCK" Then
        ws.Range("_101").Value = UCase(com101.Value) & " OUT OF STOCK " & Chr(10) & UCase(code101.Value) & " " & Chr(10) & " "
    End If
    If cmb101.Value = "SHIPPED" Then
        ws.Range("_101").Value = UCase(code101.Value) & " " & Chr(10) & " - SHIPPED " & Chr(10) & NUM101
    End If
    If cmb101.Value = "DAMAGED" Then
        ws.Range("_101").Value = UCase(code101.Value) & " DAMAGED " & Chr(10) & " "" & Chr(10) & NUM101"
    End If
    If cmb101.Value = "LOW STOCK" Then
        ws.Range("_101").Value = UCase(com101.Value) & " LOW-STOCK " & Chr(10) & UCase(code101.Value) & " " & Chr(10) & " "
    End If
    If cmb101.Value = "RETURN" Then
        ws.Range("_101").Value = UCase(code101.Value) & " " & Chr(10) & "RETURNED - " & UCase(com101.Value) & " " & Chr(10) & " "
    End If
    If cmb101.Value = "" Then
        ws.Range("_101").Value = UCase(code101.Value) & Chr(10) & " - UNKNOWN CONDITION"
    End If
End If

Пользовательская форма имеет два текстовых поля («code101» и «com101») и один ComboBox («cmb101») для каждой записи. Приведенный выше код необходимо применять в диапазоне от «_101» до «_143», поэтому его необходимо повторить 43 раза.

Любая помощь будет принята с благодарностью. Спасибо всем.

1 Ответ

0 голосов
/ 05 марта 2020

Примерно так (не проверено):

Dim ws As Worksheet, vCom, vCode
Dim i As Long, s, num As String
Set ws = ThisWorkbook.Sheets("STOCK")

For i = 101 To 143
    If Me.Controls("entry" & i).Value <> "" Then

        vCom = UCase(Me.Controls("com" & i).Value)
        vCode = UCase(Me.Controls("code" & i).Value)

        num = IIf(vCom <> "", "# - " & vCom, "")
        s = ""

        Select Case Me.Controls("cmb" & i).Value
            Case "FULL": s = vCode & " " & Chr(10) & vCom & " - FULL " & Chr(10) & " "
            Case "OUT OF STOCK": s = vCom & " OUT OF STOCK " & Chr(10) & vCode & " " & Chr(10) & " "
            Case "SHIPPED": s = vCode & " " & Chr(10) & " - SHIPPED " & Chr(10) & num
            'etc
            'etc
        End Select
        If Len(s) > 0 Then ws.Range("_" & i).Value = s
    End If
Next i
...