2017-04-13 7 views
0

AdvanceFilterを使用しているUDFがデバッグモード(F8)で動作しますが、実行時にエラー9ノーマルモードです。あまりにも速い実行時(?)とランタイムモードではなく、一歩一歩。より精度のための私のUDFのAdvanced Filterステートメントを含む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

"エラー時にDISOを実行する"コマンドをコメントアウトできますか?次にそれを実行して、エラーを引き起こす行を確認します。 –

+0

こんにちは、エラーをトリガ 線である: ワークシート(G_sNameReferenceS).Select ワークシート(G_sNameReferenceS).Cells(1、2).Select ワークシート(G_sNameReferenceS).Cells(1、2).Valueの= varTmp これらの行は、フィルタリングのタイトルと値をコピーしますが、AdvancedFilterが適用されているものと同じではなく、別のシートにコピーされます。 – botakelymg

+0

これらのコードは、デバッグモードで動作することを思い出してください... 非常に混乱しています – botakelymg

答えて

1

UDFから選択することはできません。あなたがUDFの中で行うことができない多くのことがあります。 UDFはそのパラメーターに作用して結果を返すことになっています。ワークブック/ワークシート/ウィンドウへの副作用は許されません。

Withを使用する代わりにWith/End With構文を使用するか、範囲変数に範囲を割り当てて参照してください。

また、UDFを持つセルではない値を更新する別の方法を見つけなければなりません。 UDFではこれも許可されていません。

+0

ありがとうございます。私は別の手配をするでしょう。あなたは、私がシートやワークブックを操作する必要がある場合は、イベントプロシージャを使用する必要がありますか? – botakelymg

+0

このUDFがモジュールの中にあることに言及するのを忘れました。おそらく、AdvancedFilter関数を入れ子にしたUserformの一般的な部分に割り当てられたローカルプロシージャとして、それを転送することは許されています...それは禁止されていませんか? – botakelymg

+0

少なくとも私の理解では、UDFはスプレッドシート内のセルで使用される関数を指します。 SUM()、COUNTA()などの関数はあらかじめ定義された関数です。セル内の数式に含めることができる独自のMYSUM()関数を記述した場合、それはUDFになります。それがどういう意味なのか分からなければ、別の問題を見つけることができるかどうかもう一度見てみましょう。 –

関連する問題