2017-04-13 28 views
0

我不明白爲什麼我的使用AdvanceFilter的UDF在調試模式(F8)下工作但提供了錯誤9 - 下標超出範圍時執行在正常模式下。就像在運行模式下執行(??)太快一樣,不是一步一步的。我UDF爲了更精確的包含Advancedfilter語句的UDF中的Excel 2013-VBA運行時錯誤9但在調試模式下正常

代碼示例(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 

感謝您的任何幫助。

+0

你能否註釋掉你的「On error goto DISO」命令?然後運行它並查看哪條線路導致錯誤。 –

+0

您好, 觸發錯誤的行是: 工作表(G_sNameReferenceS)。選擇 工作表(G_sNameReferenceS).Cells(1,2)。選擇 工作表(G_sNameReferenceS).Cells(1,2)。價值= varTmp 這些行將過濾的標題和值複製到另一個表上,而不是在應用了AdvancedFilter的同一頁上。 – botakelymg

+0

我記得這些代碼在調試模式下運行... 非常令人不安 – botakelymg

回答

1

您無法從UDF中選擇。 UDF內部有很多你不能做的事情。 UDF應該對其參數起作用並返回結果。不允許對工作簿/工作表/窗口產生任何副作用。

而不是使用選擇,使用With/End With結構,或將範圍指定給範圍變量並引用它。

您還必須找出更新值不是其中的單元格的值的不同方法。這在UDF中也是不允許的。

+0

非常感謝。我會做另一種安排。你的意思是,如果我需要操作表格和工作簿,我必須使用事件過程,不是嗎? – botakelymg

+0

我忘了提及這個UDF在模塊內部。也許,它可以將它作爲嵌套AdvancedFilter函數的用戶窗體的常規部分中分配的本地過程傳輸......或者它也不被禁止? – botakelymg

+0

至少在我的理解中,UDF指的是在電子表格的單元格中使用的函數。 SUM(),COUNTA()等函數是預定義的函數。如果您編寫自己的MYSUM()函數,該函數可能是單元格中公式的一部分,那麼這將是UDF。如果這不是你的意思,我會再看看是否可以找到一個不同的問題。 –

相關問題