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 中也是不允许的。