Я столкнулся с ошибкой, связанной с 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 для выполнения пользовательской формы.
Может ли кто-нибудь помочь мне в этом вопросе? Большое спасибо за помощь :)
.Cells(iRow, 4).Value = PKGform.PKGText_subprodtype.Value
- person John Alexiou   schedule 05.01.2021.Cells(iRow, 1) = [Text(Now(),"DD/MM/YYYY")]
начиная с этой строки - person Hafizzi Hairi   schedule 05.01.2021[Text(Now(),"DD/MM/YYYY")]
- person Excel Hero   schedule 05.01.2021MsgBox ("You did not enter the details")
Это избыточно и приводит к тому, что виртуальная машина VBA создает временную строку как копию строкового литерала, заключенного в кавычки. Сделайте это вместо этого:MsgBox "You did not enter the details"
- person Excel Hero   schedule 05.01.2021If PKGform.PKGTxt_XSorder = "" Or PKGform.PKGTxt_XSorder = 0 Then
можно заменить более эффективным, коротким и легким для чтения и анализа:If Not PKGform.PKGTxt_XSorder Then
- person Excel Hero   schedule 05.01.2021.Cells(iRow, 1) = Now
- person Excel Hero   schedule 05.01.2021.Cells()
возвращает объектRange
, и вы присваиваете ему значение, но пользуетесь свойством ячеекRange
по умолчанию. То же самое, когда вы читаете содержимое текстового поля. Всякий раз, когда это применимо, добавляйте.Value
в конце, чтобы было ясно, что вы записываете значение ячейки, а не назначаете новый объектRange
. - person John Alexiou   schedule 05.01.2021