我会尽量保持我的查询简单,我认为我的代码不太相关。
我有一个子更改工作表上的值,其中一些更改行程工作表更改事件侦听器。所以这可能有点低效,但不应该给我带来任何问题。
这就是问题:每次我运行我的第一个宏 - 改变值 - 我的工作表表现完美。每次介于两者之间时,我都会遇到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
以下是userform的代码,它接受发票编号并将值放入我的发票模板中,在我看来,当userform处于活动状态时,我无法访问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
答案 0 :(得分:0)
您可能需要在vlookup之前重新排列数据(仅当数据按字母/数字顺序排列时才有效。)
或者,您可以使用find函数或匹配,每次向其添加单元格时都不需要重新组织数据。
你也没有告诉wich行显示错误(点击调试而不是结束代码)。 将错误goto exerr更改为错误转到0,这样你就可以找到代码错失的位置。