UserForm中的自动筛选范围会导致过早的函数无错地退出

Excel 15.0.4833.1001
Win 7 Pro 64位


更新:

我有一个邻近的原因:被筛选的数据范围也是我的UserForm上的列表框的RowSource 。 我修改了函数将所有的数据复制到一个临时表, 然后做所有的操作,现在它工作正常。


我有一个GetFileredDataRange函数采用providerName ,适当筛选rawDataRange ,并将筛选的结果复制到新的工作表。


function:

  Public Function GetFilteredDataRange(ByVal providerName As String) As Range '/ returns range containing filtered data Const PROVIDER_COLUMN As Long = 2 Dim rawFinalrow As Long rawFinalrow = wsInputs.Cells(1, 1).End(xlDown).Row Dim rawFinalColumn As Long rawFinalColumn = wsInputs.Cells(1, 1).End(xlToRight).Column Dim rawDataRange As Range Set rawDataRange = wsInputs.Range(wsInputs.Cells(1, 1), wsInputs.Cells(rawFinalrow, rawFinalColumn)) If wsInputs.AutoFilterMode And wsInputs.FilterMode Then wsInputs.ShowAllData If providerName <> "All" Then '/========================================================== '/============== Unexpected behaviour here (#1) ============ '/========================================================== On Error GoTo cleanFail '/ causing unexpected exit when called from userform rawDataRange.AutoFilter Field:=PROVIDER_COLUMN, Criteria1:=providerName On Error GoTo 0 End If wsFilteredInputs.Cells.ClearContents wsInputs.Cells(1, 1).CurrentRegion.Copy wsFilteredInputs.Cells(1, 1).PasteSpecial xlPasteValues If wsInputs.AutoFilterMode Then wsInputs.Cells.AutoFilter Set GetFilteredDataRange = wsFilteredInputs.Cells(1, 1).CurrentRegion Exit Function cleanFail: Debug.Print "Error Triggered" Stop End Function 

从直接窗口调用这个函数时,这个function是完美的:

 GetFilteredDataRange "Aegon" 

但是,如果我从UserForm调用此函数,如下所示:

 Private Sub ProviderSelectBox_Click() '/ (#2) Dim selectedName As String selectedName = "Aegon" '/ set manually for now while testing functionality Dim filteredDataRange As Range Set filteredDataRange = GetFilteredDataRange(selectedName) AccountSelectBox.RowSource = filteredDataRange.Address End Sub 

然后奇怪的行为发生。 特别:

代码将按预期方式运行到问题行(#1)。
然后,范围将被自动筛选, 代码执行将跳回到用户窗体中的调用过程(#2)。
它会再次运行,重复相同的行为或最终的错误,因为这一行:

  If wsInputs.AutoFilterMode And wsInputs.FilterMode Then wsInputs.ShowAllData 

第一次后不会触发。 所以它会尝试自动Autofilter已经过滤的范围。

对于什么导致这种奇怪的过早退出 – 无错误行为和/或如何避免它的思考?


猜测:

在用户窗体closures或停用之前,不要放弃活动窗口焦点。


Interesting Posts