VBA: ошибка времени выполнения оператора if-else «-2147417848 (80010108)»

Я столкнулся с ошибкой, связанной с MS Excel VBA при разработке формы ввода данных.

Ниже приведена моя форма ввода данных/форма пользователя: -

Форма пользователя

Теперь, что я пытаюсь сделать, это: -

1- Чтобы иметь 1x PI No. и все детали слева (тип, тип продукта, тип субпродукта, код продукта, клиент и бренд)

2- Дублируйте все детали слева для каждого введенного размера (заказ и упаковка)
*может ссылаться на выделенную красным иллюстрацию на картинке пользовательской формы

После того, как я сделал коды, как показано ниже: -

Dim sh As Worksheet
Dim iRow As Long
Dim j As Long

Set sh = ThisWorkbook.Sheets("PKG_Database")

iRow = [Counta(PKG_Database!A:A)] + 1

If PKGform.PKGText_prodcode.Value = "" Or PKGform.PKGText_prodcode.Value = 0 Then

MsgBox ("You did not enter the details")
 
Else
        
    If PKGform.PKGTxt_XSorder = "" Or PKGform.PKGTxt_XSorder = 0 Then
        
        Else
        With sh
        
        .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
        .Cells(iRow, 2) = PKGform.PKGText_PI.Value
        .Cells(iRow, 3) = PKGform.PKGText_prodtype
        .Cells(iRow, 4) = PKGform.PKGText_subprodtype
        .Cells(iRow, 5) = PKGform.PKGText_prodcode
        .Cells(iRow, 6) = PKGform.PKGText_customer
        .Cells(iRow, 7) = PKGform.PKGText_brand
        .Cells(iRow, 8) = "XS"
        .Cells(iRow, 9) = PKGform.PKGTxt_XSorder
        .Cells(iRow, 10) = PKGform.PKGTxt_XSpacked
        .Cells(iRow, 12) = Application.UserName
        iRow = iRow + 1
        
        End With
        End If
        
            
            If PKGform.PKGTxt_Sorder = "" Or PKGform.PKGTxt_Sorder = 0 Then
            
            Else
            With sh
            
            .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
            .Cells(iRow, 2) = PKGform.PKGText_PI.Value
            .Cells(iRow, 3) = PKGform.PKGText_prodtype
            .Cells(iRow, 4) = PKGform.PKGText_subprodtype
            .Cells(iRow, 5) = PKGform.PKGText_prodcode
            .Cells(iRow, 6) = PKGform.PKGText_customer
            .Cells(iRow, 7) = PKGform.PKGText_brand
            .Cells(iRow, 8) = "S"
            .Cells(iRow, 9) = PKGform.PKGTxt_Sorder
            .Cells(iRow, 10) = PKGform.PKGTxt_Spacked
            .Cells(iRow, 12) = Application.UserName
            iRow = iRow + 1
            
            End With
            End If
            
            
                If PKGform.PKGTxt_Morder = "" Or PKGform.PKGTxt_Morder = 0 Then
                
                Else
                With sh
                
                .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
                .Cells(iRow, 2) = PKGform.PKGText_PI.Value
                .Cells(iRow, 3) = PKGform.PKGText_prodtype
                .Cells(iRow, 4) = PKGform.PKGText_subprodtype
                .Cells(iRow, 5) = PKGform.PKGText_prodcode
                .Cells(iRow, 6) = PKGform.PKGText_customer
                .Cells(iRow, 7) = PKGform.PKGText_brand
                .Cells(iRow, 8) = "M"
                .Cells(iRow, 9) = PKGform.PKGTxt_Morder
                .Cells(iRow, 10) = PKGform.PKGTxt_Mpacked
                .Cells(iRow, 12) = Application.UserName
                iRow = iRow + 1
                
                End With
                End If
                
                        If PKGform.PKGTxt_Lorder = "" Or PKGform.PKGTxt_Lorder = 0 Then
                    
                        Else
                        With sh
                        
                        .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
                        .Cells(iRow, 2) = PKGform.PKGText_PI.Value
                        .Cells(iRow, 3) = PKGform.PKGText_prodtype
                        .Cells(iRow, 4) = PKGform.PKGText_subprodtype
                        .Cells(iRow, 5) = PKGform.PKGText_prodcode
                        .Cells(iRow, 6) = PKGform.PKGText_customer
                        .Cells(iRow, 7) = PKGform.PKGText_brand
                        .Cells(iRow, 8) = "L"
                        .Cells(iRow, 9) = PKGform.PKGTxt_Lorder
                        .Cells(iRow, 10) = PKGform.PKGTxt_Lpacked
                        .Cells(iRow, 12) = Application.UserName
                        iRow = iRow + 1
                        
                        End With
                        End If
                        
                            If PKGform.PKGTxt_XLorder = "" Or PKGform.PKGTxt_XLorder = 0 Then
                            
                            Else
                            With sh
                            
                            .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
                            .Cells(iRow, 2) = PKGform.PKGText_PI.Value
                            .Cells(iRow, 3) = PKGform.PKGText_prodtype
                            .Cells(iRow, 4) = PKGform.PKGText_subprodtype
                            .Cells(iRow, 5) = PKGform.PKGText_prodcode
                            .Cells(iRow, 6) = PKGform.PKGText_customer
                            .Cells(iRow, 7) = PKGform.PKGText_brand
                            .Cells(iRow, 8) = "XL"
                            .Cells(iRow, 9) = PKGform.PKGTxt_XLorder
                            .Cells(iRow, 10) = PKGform.PKGTxt_XLpacked
                            .Cells(iRow, 12) = Application.UserName
                            iRow = iRow + 1
                            
                            End With
                            End If
                            
                                If PKGform.PKGTxt_XXLorder = "" Or PKGform.PKGTxt_XXLorder = 0 Then
                
                                Else
                                With sh
                                
                                .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
                                .Cells(iRow, 2) = PKGform.PKGText_PI.Value
                                .Cells(iRow, 3) = PKGform.PKGText_prodtype
                                .Cells(iRow, 4) = PKGform.PKGText_subprodtype
                                .Cells(iRow, 5) = PKGform.PKGText_prodcode
                                .Cells(iRow, 6) = PKGform.PKGText_customer
                                .Cells(iRow, 7) = PKGform.PKGText_brand
                                .Cells(iRow, 8) = "XXL"
                                .Cells(iRow, 9) = PKGform.PKGTxt_XXLorder
                                .Cells(iRow, 10) = PKGform.PKGTxt_XXLpacked
                                .Cells(iRow, 12) = Application.UserName
                                iRow = iRow + 1
                                
                                End With
                                End If
                                
                                    If PKGform.PKGTxt_XXXLorder = "" Or PKGform.PKGTxt_XXXLorder = 0 Then
                
                                    Else
                                    With sh
                                    
                                    .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
                                    .Cells(iRow, 2) = PKGform.PKGText_PI.Value
                                    .Cells(iRow, 3) = PKGform.PKGText_prodtype
                                    .Cells(iRow, 4) = PKGform.PKGText_subprodtype
                                    .Cells(iRow, 5) = PKGform.PKGText_prodcode
                                    .Cells(iRow, 6) = PKGform.PKGText_customer
                                    .Cells(iRow, 7) = PKGform.PKGText_brand
                                    .Cells(iRow, 8) = "XXXL"
                                    .Cells(iRow, 9) = PKGform.PKGTxt_XXXLorder
                                    .Cells(iRow, 10) = PKGform.PKGTxt_XXXLpacked
                                    .Cells(iRow, 12) = Application.UserName
                                    iRow = iRow + 1
                                    
                                    End With
                                    End If
                    

End If
    

Скажем, я ввожу числа (заказ и упаковка) в пользовательскую форму для размера XS и S. Детали для XS (более ранние коды) прекрасно отображаются в таблице. Но появляется ошибка времени выполнения для S (более поздние коды): - ошибка времени выполнения '- 2147417848 (80010108)'

Как правило, эти коды могут захватывать только 1 размер за один раз. Если превысить 2 и более размеров, он будет собирать данные только для того, что было раньше в кодах, тогда ошибка времени выполнения будет отображаться для следующих кодов после оператора if else ends для более раннего размера (например, размер XS).

Я действительно не знаю, что вызывает ошибку.

Вы можете получить файлы по этой ссылке: - Файл Excel

**Пожалуйста, найдите макрос с именем Submit2, чтобы увидеть коды. Макрос с именем show_form для выполнения пользовательской формы.

Может ли кто-нибудь помочь мне в этом вопросе? Большое спасибо за помощь :)


person Hafizzi Hairi    schedule 05.01.2021    source источник
comment
Вы полагаетесь на членов по умолчанию, и что-то идет не так. Постарайтесь быть более явным, например .Cells(iRow, 4).Value = PKGform.PKGText_subprodtype.Value   -  person John Alexiou    schedule 05.01.2021
comment
Какая строка выдает ошибку?   -  person John Alexiou    schedule 05.01.2021
comment
.Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")] начиная с этой строки   -  person Hafizzi Hairi    schedule 05.01.2021
comment
@JohnAlexiou, не могли бы вы поразмышлять над первым комментарием. К вашему сведению, мой навык vba был очень низким. Спасибо за помощь   -  person Hafizzi Hairi    schedule 05.01.2021
comment
Почему вы назначаете текст, похожий на дату, ячейкам листа? Даты должны быть числовыми, а затем могут быть преобразованы в любой формат с помощью форматирования чисел. Это выражение оценивается как текст... не число: [Text(Now(),"DD/MM/YYYY")]   -  person Excel Hero    schedule 05.01.2021
comment
Не используйте здесь круглые скобки: MsgBox ("You did not enter the details") Это избыточно и приводит к тому, что виртуальная машина VBA создает временную строку как копию строкового литерала, заключенного в кавычки. Сделайте это вместо этого: MsgBox "You did not enter the details"   -  person Excel Hero    schedule 05.01.2021
comment
If PKGform.PKGTxt_XSorder = "" Or PKGform.PKGTxt_XSorder = 0 Then можно заменить более эффективным, коротким и легким для чтения и анализа: If Not PKGform.PKGTxt_XSorder Then   -  person Excel Hero    schedule 05.01.2021
comment
Но вашу основную проблему можно решить, изменив строки, выдающие ошибки, на этот шаблон: .Cells(iRow, 1) = Now   -  person Excel Hero    schedule 05.01.2021
comment
@HafizziHairi — метод .Cells() возвращает объект Range, и вы присваиваете ему значение, но пользуетесь свойством ячеек Range по умолчанию. То же самое, когда вы читаете содержимое текстового поля. Всякий раз, когда это применимо, добавляйте .Value в конце, чтобы было ясно, что вы записываете значение ячейки, а не назначаете новый объект Range.   -  person John Alexiou    schedule 05.01.2021


Ответы (1)


Примечание: ниже непроверенный код

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

.Cells(iRow, 1).Value = Format(Now(),"DD/MM/YYYY")

для хранения текстового значения отформатированной даты или

.Cells(iRow, 1).Value = Now()
.Cells(iRow, 1).NumberFormat = "mm/dd/yy"

чтобы сохранить дату и отформатировать ее так, как вы хотите.

person John Alexiou    schedule 05.01.2021
comment
Evaluate() не ожидает адрес ячейки внутри. - person Excel Hero; 05.01.2021
comment
@ExcelHero, когда вы делаете [A1], это переводится как Range("A1"), а не Evaluate("A1"), верно? - person John Alexiou; 05.01.2021
comment
@BigBen - я исправил. Спасибо. - person John Alexiou; 05.01.2021
comment
@JohnAlexiou Нет. [a1] оценивается как тот же объект Range, что и Range("a1"). Это не переводится. Но причина, по которой [a1] соответствует этому объекту, заключается в том, что A1 является ссылкой на диапазон рабочего листа. Квадратные скобки — это просто сокращение для функции Evaluate(), где аргументом является ОДИН строковый литерал. Но функция Evaluate(), аналогичная оценке формулы в ячейке рабочего листа, не ограничивается диапазонами. ="abc" в ячейке будет оцениваться как строка, abc точно так же, как [abc] будет оцениваться как abc. Диапазон не возвращается! - person Excel Hero; 05.01.2021
comment
@JohnAlexiou продолжил ... Аналогичным образом [Text(Now(),"DD/MM/YYYY")] законно оценивает строковое представление сегодняшней даты. В этом нет ничего плохого, кроме того, что вводить ТЕКСТ как представление даты в ячейку рабочего листа — не лучшая идея. Но присвоение строки свойству .Value объекта Range не вызовет ошибки и часто желательно. Проблема, с которой сталкивается OP, заключается в том, что .Value не достигается. - person Excel Hero; 05.01.2021
comment
@JohnAlexiou Основная часть вашего ответа разумна, но первое предложение и первый пример кода просто неверны. Вам нужно удалить их, иначе этот ответ получит отрицательный голос. - person Excel Hero; 05.01.2021
comment
Мой код отлично работает для первой строки, но не работает во второй строке (часть дублирования). Например, я ввел 2 размера; XS & S. Для XS (код написан ранее) он отлично работает и способен захватить все данные. Но для S (код пишется после) возникала ошибка времени выполнения для каждого оператора в коде. - person Hafizzi Hairi; 05.01.2021
comment
Не только .Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")], но и следующее утверждение ›› .Cells(iRow, 2) = PKGform.PKGText_PI.Value и так далее... - person Hafizzi Hairi; 05.01.2021
comment
Я также заменил код на sh.Cells(iRow,1).Resize(1,10).Value = Array( _ Format(Now(),"DD/MM/YYYY"), _ PKGform.PKGText_PI.Value, _ PKGform.PKGText_prodtype.Value, _ PKGform.PKGText_subprodtype.Value, _ PKGform.PKGText_prodcode.Value, _ PKGform.PKGText_customer.Value, _ PKGform.PKGText_brand.Value, _ "XXXL", _ PKGform.PKGTxt_XXXLorder.Value ) sh.Cells(iRow, 12).Value = Application.UserName iRow = iRow + 1 , ошибка по-прежнему появляется, когда речь идет о части S (более поздние кодировки) (тот же пример с XS и S, что и выше) - person Hafizzi Hairi; 05.01.2021
comment
@HafizziHairi Вам нужно сделать такие строки: .Cells(iRow, 2).Value = PKGform.PKGText_PI.Value - person Excel Hero; 05.01.2021
comment
@HafizziHairi Пожалуйста, обновите свой вопрос выше. Укажите, где в вопросе возникает ошибка, а также покажите значение, которое вы пытаетесь присвоить ячейке, когда возникает ошибка. В нынешнем виде в вашем вопросе и вашем коде слишком много шума. Разберитесь с ошибкой. - person Excel Hero; 05.01.2021
comment
ошибка все равно выскакивает. В общем, после его выполнения и получения данных из пользовательской формы и копирования в рабочий лист (подробности XS). Ошибка начинает всплывать из инструкции размера S в инструкцию XXXL. Дублирование введенной части сведений по-прежнему вызывает ошибку. - person Hafizzi Hairi; 05.01.2021