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或停用之前,不要放弃活动窗口焦点。