Excel 2013-VBA 包含 Advancedfilter 语句的 UDF 中的运行时错误 9 但在调试模式下没问题
Excel 2013-VBA runtime error 9 inside an UDF containing Advancedfilter statement but it's OK with debugging mode
我不明白为什么我使用 AdvanceFilter 的 UDF 在调试模式 (F8) 下工作,但在正常模式下执行时出现错误 9 - 下标超出范围。好像在runtime模式下执行的太快了(??),没有按部就班
我的 UDF 的代码示例更精确(gAitemCT 是用户定义的类型):
Public Function fG_PasteCTLinesOnSheetTmpFilteredDataset( _
ByRef gL_CTLine_P As gAitemCT, ByRef intNbOcc As Integer) As String
Dim sRet As String, sMsg As String
Dim iLoop As Integer
Dim iNbColMax As Integer
Dim lNbRowMax As Long
Dim sColWidth As Variant
Dim rngInput As Range, rngOutput As Range
Dim rngCriteria1 As Range
Dim varTmp As Variant
Dim iArrDime As Integer
sRet = "OK"
iLoop = 0
On Error GoTo Diso
'>> Constituer le Carré de datas <<
Worksheets(G_sNameSRCPO).Select
With Worksheets(G_sNameSRCPO)
'>>
lNbRowMax = .Cells(.Rows.Count, 5).End(xlUp).Row
iNbColMax = .Cells(1, .Columns.Count).End(xlToLeft).Column
'>>
End With
Worksheets(G_sNameSRCPO).Select
'>> Defining INput range <<
Set rngInput = Worksheets(G_sNameSRCPO).Range("A1").Resize(lNbRowMax,iNbColMax)
varTmp = salesWksheet.Range(Cells(1, 1)).Value
'> Copy Header <
'>> Setting up Criteria range(s) <<
varTmp = Worksheets(G_sNameSRCPO).Cells(1, 1).Value
Worksheets(G_sNameReferenceS).Select
Worksheets(G_sNameReferenceS).Cells(1, 2).Select
Worksheets(G_sNameReferenceS).Cells(1, 2).Value = varTmp
ThisWorkbook.Save
'**
If (gL_CTLine_P.GsfPO <> 0) Then
'>>
'curWBook.Sheets("dataReferences").Activate
Worksheets(G_sNameReferenceS).Cells(2, 2).Select
Worksheets(G_sNameReferenceS).Cells(2, 2).Value = gL_CTLine_P.GsfPO
Set rngCriteria1 = Worksheets(G_sNameReferenceS).Cells(1, 2).Resize(2, 1)
'>>
Else
End If
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'>> Setting up the OUTput range <<
Worksheets(G_sNameCTcurrentS).Select
Set rngOutput = Worksheets(G_sNameCTcurrentS).Range("A1")
'>>>>>>>>>>>>>>>>>>>>>>>>>
'>> Pasting the Result <<<
Worksheets(G_sNameSRCPO).Select
rngInput.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngOutput, CriteriaRange:=rngCriteria1
Worksheets(G_sNameCTcurrentS).Select
Veloma:
'>>
Set rngInput = Nothing
Set rngCriteria1 = Nothing
Set rngOutput = Nothing
'>>
intNbOcc = iArrDime
'>>
fG_PasteCTLinesOnSheetTmpFilteredDataset = sRet
Exit Function
'**
Diso:
Beep
Beep
sMsg = "PasteCTLinesOnSheetTmpFilteredDataset-ERR ::" & Err.Number & ":: - " & Err.Description
Debug.Print sMsg
sRet = sMsg
Resume Veloma
End Function
感谢您的帮助。
您不能从 UDF Select。在 UDF 中有很多事情是不能做的。 UDF 应该作用于它的参数和 return 结果。 workbook/worksheets/window 的任何副作用都是不允许的。
不要使用 Select,而是使用 With/End With 结构,或者将范围分配给范围变量并引用它。
您还必须想出一种不同的方法来更新不是包含 UDF 的单元格的值。这在 UDF 中也是不允许的。
我不明白为什么我使用 AdvanceFilter 的 UDF 在调试模式 (F8) 下工作,但在正常模式下执行时出现错误 9 - 下标超出范围。好像在runtime模式下执行的太快了(??),没有按部就班
我的 UDF 的代码示例更精确(gAitemCT 是用户定义的类型):
Public Function fG_PasteCTLinesOnSheetTmpFilteredDataset( _
ByRef gL_CTLine_P As gAitemCT, ByRef intNbOcc As Integer) As String
Dim sRet As String, sMsg As String
Dim iLoop As Integer
Dim iNbColMax As Integer
Dim lNbRowMax As Long
Dim sColWidth As Variant
Dim rngInput As Range, rngOutput As Range
Dim rngCriteria1 As Range
Dim varTmp As Variant
Dim iArrDime As Integer
sRet = "OK"
iLoop = 0
On Error GoTo Diso
'>> Constituer le Carré de datas <<
Worksheets(G_sNameSRCPO).Select
With Worksheets(G_sNameSRCPO)
'>>
lNbRowMax = .Cells(.Rows.Count, 5).End(xlUp).Row
iNbColMax = .Cells(1, .Columns.Count).End(xlToLeft).Column
'>>
End With
Worksheets(G_sNameSRCPO).Select
'>> Defining INput range <<
Set rngInput = Worksheets(G_sNameSRCPO).Range("A1").Resize(lNbRowMax,iNbColMax)
varTmp = salesWksheet.Range(Cells(1, 1)).Value
'> Copy Header <
'>> Setting up Criteria range(s) <<
varTmp = Worksheets(G_sNameSRCPO).Cells(1, 1).Value
Worksheets(G_sNameReferenceS).Select
Worksheets(G_sNameReferenceS).Cells(1, 2).Select
Worksheets(G_sNameReferenceS).Cells(1, 2).Value = varTmp
ThisWorkbook.Save
'**
If (gL_CTLine_P.GsfPO <> 0) Then
'>>
'curWBook.Sheets("dataReferences").Activate
Worksheets(G_sNameReferenceS).Cells(2, 2).Select
Worksheets(G_sNameReferenceS).Cells(2, 2).Value = gL_CTLine_P.GsfPO
Set rngCriteria1 = Worksheets(G_sNameReferenceS).Cells(1, 2).Resize(2, 1)
'>>
Else
End If
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'>> Setting up the OUTput range <<
Worksheets(G_sNameCTcurrentS).Select
Set rngOutput = Worksheets(G_sNameCTcurrentS).Range("A1")
'>>>>>>>>>>>>>>>>>>>>>>>>>
'>> Pasting the Result <<<
Worksheets(G_sNameSRCPO).Select
rngInput.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngOutput, CriteriaRange:=rngCriteria1
Worksheets(G_sNameCTcurrentS).Select
Veloma:
'>>
Set rngInput = Nothing
Set rngCriteria1 = Nothing
Set rngOutput = Nothing
'>>
intNbOcc = iArrDime
'>>
fG_PasteCTLinesOnSheetTmpFilteredDataset = sRet
Exit Function
'**
Diso:
Beep
Beep
sMsg = "PasteCTLinesOnSheetTmpFilteredDataset-ERR ::" & Err.Number & ":: - " & Err.Description
Debug.Print sMsg
sRet = sMsg
Resume Veloma
End Function
感谢您的帮助。
您不能从 UDF Select。在 UDF 中有很多事情是不能做的。 UDF 应该作用于它的参数和 return 结果。 workbook/worksheets/window 的任何副作用都是不允许的。
不要使用 Select,而是使用 With/End With 结构,或者将范围分配给范围变量并引用它。
您还必须想出一种不同的方法来更新不是包含 UDF 的单元格的值。这在 UDF 中也是不允许的。