【问题标题】:runtime 1004 error, every second time code executes运行时 1004 错误,每隔一秒执行一次代码
【发布时间】:2020-12-04 12:20:13
【问题描述】:

我会尽量让我的查询保持简单,我不认为我的代码过于相关。

我有一个 sub 可以更改工作表上的值,其中一些更改会触发工作表更改事件侦听器。所以这可能有点低效,但不应该给我带来任何问题。

问题来了:每隔一次我运行我的第一个宏 - 更改值 - 我的工作表表现完美。每次之间,我都会遇到 1004 运行时错误。

当我遇到错误时,我结束代码执行。再次做同样的事情,它会工作,失败,工作,失败等等。

我认为有一些 VBA 或 Excel 设置需要手动清除以避免运行时错误。但我不知道它可能是什么。我也可以重写我的程序来避免触发事件侦听器的单元格,但我真的很想了解发生了什么。

编辑:好的,这里有一些代码,我用它来按客户查找我的发票列表并显示一个用户表单来选择要显示的发票:

Sub Look_for_invs()
Dim cell, invDB As Range
Dim srch_rng As Range
Set invDB = Range("Invoice_DB")

invDB.AdvancedFilter xlFilterCopy, Range("inv_lookup_crit"), Range("inv_lookup_result"), True

Dim length As Integer
On Error GoTo exerr

length = Int(WorksheetFunction.CountA(Range("inv_lookup_result_list").Columns(1)))
Range("inv_lookup_result_list").Cells(1, 1).Offset(length, 0).Value = "NEW"

GoTo exok
exerr:
length = 1
Range("inv_lookup_result").Cells(1, 1).Offset(length, 0).Value = "NEW"
exok:


Set srch_rng = Range("inv_lookup_result_list")

With InvoiceSelection.InvListBox
    .ColumnCount = 4
    .ColumnHeads = True
    .RowSource = "inv_lookup_result_list"
End With

Worksheets("Invoice Entry").Select

InvoiceSelection.Show vbModeless

End Sub

这是用户表单的代码,它获取发票编号并将值放入我的发票模板中,在我看来,当用户表单处于活动状态时,我无法访问 Range 对象的成员。自从发布问题后,我禁用了事件以尝试查看是否有帮助,但没有:

Private Sub InvListBox_Click()
Dim invnum, invitems_cnt, invitem As Integer
Dim accnum As String
Dim inv_arrival, inv_depart As Date
Dim invDB, cell, invoice_lines As Range
Dim inv_ent_sht As Worksheet

With Application
    .Calculation = xlCalculationManual
    .EnableEvents = False
    .ScreenUpdating = False
End With

invnum = InvListBox.Value
accnum = Range("invoice_ent_account")
Set invDB = Range("Invoice_DB")
Set invoice_lines = Range("invoice_lines")
Set inv_ent_sht = Worksheets("Invoice Entry")

clear_inv_sheet


If invnum <> "NEW" Then
    'set variables
    inv_depart = WorksheetFunction.VLookup(invnum, invDB.Offset(0, 1), 5, False)
    inv_arrival = WorksheetFunction.VLookup(invnum, invDB.Offset(0, 1), 4, False)
    'transfer header-level invoice details to sheet
    Range("inv_inv_num") = invnum
    Range("inv_depart") = inv_depart
    Range("inv_arrival") = inv_arrival

    'find all items relating to invoice lines and move them to invoice lines area of statement
    For Each cell In invDB.Columns(2).Cells
        If cell.Value = invnum Then
            invitem = Application.WorksheetFunction.CountA(invoice_lines.Columns(1)) + 1
            invoice_lines.Cells(invitem, 1) = cell.Offset(0, 5)
            invoice_lines.Cells(invitem, 2) = cell.Offset(0, 2)
            invoice_lines.Cells(invitem, 5) = cell.Offset(0, 6)
            invoice_lines.Cells(invitem, 6) = cell.Offset(0, 7)
            invoice_lines.Cells(invitem, 7) = cell.Offset(0, 12)
            invoice_lines.Cells(invitem, 8) = cell.Offset(0, 13)
        End If
    Next cell


    'invitems_cnt = WorksheetFunction.CountIf(Range("invoice_DB").Columns(2), invnum)

End If
InvoiceSelection.Hide
With Application
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
End With

End Sub

【问题讨论】:

  • 您的工作表事件代码可能在不适当的时间运行。为了获得更好的帮助,您需要发布您的代码。
  • 您的代码是相关的。它将讲述您遇到此类错误的原因。我的猜测是,由于您构建代码的方式,您会遇到运行时。仅当您希望 excel 访问它无法找到或最常见的内容时才会出现运行时。
  • 两个想法:1)你可能需要在exok:之后再写一个On Error ...语句,否则下面出现的任何错误都会跳回来2)如果你使用On Error Goto 0,调试器将停止在发生错误的行。用它来识别错误的线路,让我们知道它是哪一条!

标签: vba excel


【解决方案1】:

您可能需要在 vlookup 之前重新排列数据(仅当数据按字母/数字顺序时才有效)。

或者,您可以使用查找功能或匹配,每次添加单元格时都不需要重新组织数据。

您也没有告诉哪一行显示错误(点击调试而不是结束代码)。 将 on error goto exerr 更改为 on error goto 0,这样您就可以找到代码错误行为的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多