【发布时间】: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,调试器将停止在发生错误的行。用它来识别错误的线路,让我们知道它是哪一条!