主頁 > 軟體工程 > 自動過濾器不回傳任何行,因此可見范圍什么都不是,但過濾后的可見范圍不是什么

自動過濾器不回傳任何行,因此可見范圍什么都不是,但過濾后的可見范圍不是什么

2022-01-03 06:22:23 軟體工程

所以這是代碼的相關部分:

i = Feuil1.Cells.Rows.count

i = Feuil1.Cells(i, 1).End(xlUp).Row
j = Feuil1.Cells(1, 1).End(xlToRight).Column
HelpAddress = Feuil1.Cells(i, j).Address

Set Table = Feuil1.ListObjects("FiltersTable")

HelpArr = Application.WorksheetFunction.Transpose(Table.ListColumns("Rubriques").DataBodyRange)
HelpArr2 = Application.WorksheetFunction.Transpose(Table.ListColumns("Departements").DataBodyRange)
HelpArr = UniqueNoEmpty(HelpArr)
HelpArr2 = UniqueNoEmpty(HelpArr2)

For i = LBound(HelpArr2) To UBound(HelpArr2)
    HelpArr2(i) = CStr(HelpArr2(i)) & "*"
Next i

FilterArray2 = Array("*@*")

Set Wbk = Workbooks.Add
Set Ws = Wbk.Worksheets(1)
Feuil1.Activate
Feuil1.Range("A1" & ":" & Feuil1.Cells(1, j).Address).Copy
Ws.Cells(1, 1).PasteSpecial xlPasteValues

For Each Rubrique In HelpArr
    
    FilterArray = Array(Rubrique & "*")
    
    With Feuil1
        On Error Resume Next
        .ShowAllData
        On Error GoTo 0
'        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=11
        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=11, Criteria1:=FilterArray, Operator:=xlFilterValues
        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=9, Criteria1:=FilterArray2, Operator:=xlFilterValues
'        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=4, Criteria1:=FilterArray3, Operator:=xlFilterValues, Operator:=xlOr
    End With
    
    For i = LBound(HelpArr2) To UBound(HelpArr2)
        
        Feuil1.Range("A1" & ":" & HelpAddress).AutoFilter Field:=4
        Feuil1.Range("A1" & ":" & HelpAddress).AutoFilter Field:=4, Criteria1:=HelpArr2(i), Operator:=xlFilterValues
        Set FilteredRng = Feuil1.Range("A2" & ":" & HelpAddress).SpecialCells(xlCellTypeVisible)
        
        If Not FilteredRng Is Nothing Then
            FilteredRng.Copy
            Set HelpRng = Ws.Cells(Ws.Cells.Rows.count, 1).End(xlUp)
            Do While HelpRng.Value <> ""
                Set HelpRng = HelpRng.Offset(1, 0)
            Loop
            Ws.Range(HelpRng.Address).PasteSpecial xlPasteValues
        End If
        
    Next i
    
Next Rubrique

Feuil1 中的第一行是帶有過濾器的標題的行。

問題是,當 Criteria1 沒有給出任何行作為結果時,因此唯一可見的行是帶有過濾器的行,在這種情況下,可見范圍什么都沒有,但FilteredRng is Nothing結果是 False 因為由于某種原因 FilteredRng 實際上是第一行過濾器。

我無法理解這是如何發生的,因為第一行不是開始范圍的一部分。

此外,它可以防止我使用 if FilteredRng is Nothing then

現在的解決方法是if FilteredRng.rows.count = 1 and FilteredRng.row=1 then但我仍然希望能夠通過與 Nothing 進行比較來捕獲錯誤,因為過濾器行/標題行可能會在不同情況下更改行......而且我有預先構建的函式和子程式對于一般情況使用,我比較什么都沒有。

如果有人知道這里發生了什么或如何捕獲“未找到單元格”錯誤,我將不勝感激。

更新:

按照 Rory 的評論更新代碼后,代碼如下所示:

On Error Resume Next
Feuil1.ShowAllData
On Error GoTo 0

i = Feuil1.Cells.Rows.count

i = Feuil1.Cells(i, 1).End(xlUp).Row
j = Feuil1.Cells(1, 1).End(xlToRight).Column
HelpAddress = Feuil1.Cells(i, j).Address

Set Wbk = Workbooks.Add
Set Ws = Wbk.Worksheets(1)
Feuil1.Activate
Feuil1.Range("A1:" & Feuil1.Cells(1, j).Address).Copy
Ws.Cells(1, 1).PasteSpecial xlPasteValues

Set Table = Feuil1.ListObjects("FiltersTable")

HelpArr = Application.WorksheetFunction.Transpose(Table.ListColumns("Rubriques").DataBodyRange)
HelpArr2 = Application.WorksheetFunction.Transpose(Table.ListColumns("Departements").DataBodyRange)
HelpArr = UniqueNoEmpty(HelpArr)
HelpArr2 = UniqueNoEmpty(HelpArr2)

For i = LBound(HelpArr2) To UBound(HelpArr2)
    HelpArr2(i) = CStr(HelpArr2(i)) & "*"
Next i

FilterArray2 = Array("*@*")

For Each Rubrique In HelpArr
    
    FilterArray = Array(Rubrique & "*")
    
    With Feuil1
        On Error Resume Next
        .ShowAllData
        On Error GoTo 0
'        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=11
        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=11, Criteria1:=FilterArray, Operator:=xlFilterValues
        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=9, Criteria1:=FilterArray2, Operator:=xlFilterValues
'        .Range("A1" & ":" & HelpAddress).AutoFilter Field:=4, Criteria1:=FilterArray3, Operator:=xlFilterValues, Operator:=xlOr
    End With
    
    For i = LBound(HelpArr2) To UBound(HelpArr2)
        
        Set FilteredRng = Nothing
        Feuil1.Range("A1" & ":" & HelpAddress).AutoFilter Field:=4
        Feuil1.Range("A1" & ":" & HelpAddress).AutoFilter Field:=4, Criteria1:=HelpArr2(i), Operator:=xlFilterValues
        On Error Resume Next
        Set FilteredRng = Feuil1.Range("A2" & ":" & HelpAddress).SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        
        If Not FilteredRng Is Nothing Then
'        If FilteredRng.Rows.count = 1 And FilteredRng.Row = 1 Then
            FilteredRng.Copy
            Set HelpRng = Ws.Cells(Ws.Cells.Rows.count, 1).End(xlUp)
            Do While HelpRng.Value <> ""
                Set HelpRng = HelpRng.Offset(1, 0)
            Loop
            Ws.Range(HelpRng.Address).PasteSpecial xlPasteValues
        End If
        
    Next i
    
Next Rubrique

uj5u.com熱心網友回復:

參考自動篩選可見單元格

  • 這是一個如何解決這個問題的例子。
Option Explicit

Sub AutoFilterExample()
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    If ws.AutoFilterMode Then ws.AutoFilterMode = False ' remove previous
    
    Dim trg As Range: Set trg = ws.Range("A1").CurrentRegion ' Table Range
    Dim dtrg As Range ' Data Range (refernce before the 'AutoFilter')
    Set dtrg = trg.Resize(trg.Rows.Count - 1).Offset(1)
    
    trg.AutoFilter 1, "Yes"
    
    Dim vrg As Range ' Visible Range
    On Error Resume Next
    Set vrg = dtrg.SpecialCells(xlCellTypeVisible) ' use the data range ('dtrg')
    On Error GoTo 0
    
    ws.AutoFilterMode = False
    
    If Not vrg Is Nothing Then
        Debug.Print vrg.Address(0, 0)
    Else
        Debug.Print "Nope"
    End If
    
End Sub

uj5u.com熱心網友回復:

對于表格,標題行和資料主體(不包括標題)范圍可用作表格的屬性。

Option Explicit

Sub demo()

    Dim wsf As WorksheetFunction
    
    Dim wb As Workbook, ws As Worksheet, tbl As ListObject
    Dim wbOut As Workbook, wsOut As Worksheet, rowOut As Long
    Dim colRub As ListColumn, colDept As ListColumn
    Dim arRub, arDept, i As Long
    
    Set ws = Sheet1 ' or Feuil1
    Set wsf = Application.WorksheetFunction
    
    ' get unique rubriques and departements
    Set tbl = ws.ListObjects("FiltersTable")
    With tbl
        Set colRub = .ListColumns("Rubriques")
        arRub = UniqueNoEmpty(wsf.Transpose(colRub.DataBodyRange))
    
        Set colDept = .ListColumns("Departements")
        arDept = UniqueNoEmpty(wsf.Transpose(colDept.DataBodyRange))
    End With
    
    ' create workbook for reults
    Set wbOut = Workbooks.Add
    Set wsOut = wbOut.Worksheets(1)
    tbl.HeaderRowRange.Copy wsOut.Range("A1")
    rowOut = 1
      
    Dim rubrique, dept, rngFiltered As Range
    'Application.ScreenUpdating = False
    With tbl
        For Each rubrique In arRub
       
             ' apply rubrique filter
            .Range.AutoFilter Field:=colRub.Index, Criteria1:=rubrique & "*"
            .Range.AutoFilter Field:=9, Criteria1:="*@*"
        
            For Each dept In arDept
                
                 ' apply department filter
                .Range.AutoFilter Field:=colDept.Index, Criteria1:=dept & "*"
                    
                ' copy filtered data if any
                Set rngFiltered = Nothing
                On Error Resume Next
                Set rngFiltered = .DataBodyRange.SpecialCells(xlCellTypeVisible)
                On Error GoTo 0
                If rngFiltered Is Nothing Then
                    'Debug.Print "No data for ", rubrique, dept
                Else
                    rngFiltered.Copy
                    wsOut.Range("A" & rowOut   1).PasteSpecial xlPasteValues
                    rowOut = wsOut.Cells(wsOut.Rows.Count, 1).End(xlUp).Row
                End If
            
            Next
        Next
        .Range.AutoFilter
    End With
    
    'Application.ScreenUpdating = True
    MsgBox rowOut & " rows copied to " & wbOut.Name

End Sub

Function UniqueNoEmpty(ar)
    Dim d, e: Set d = CreateObject("Scripting.Dictionary")
    For Each e In ar
        If Len(e) > 0 Then d(CStr(e)) = 1
    Next
    UniqueNoEmpty = d.keys
End Function

uj5u.com熱心網友回復:

這個答案的功勞應該歸功于 Rory,因為正是他的評論提供了解決方案

因此,對此的答案是將范圍設定為空,應用所需的過濾器,然后使用 SpecialCells 屬性設定范圍。

        Set FilteredRng = Nothing
        Feuil1.Range("A1:" & HelpAddress).AutoFilter Field:=4
        Feuil1.Range("A1:" & HelpAddress).AutoFilter Field:=4, Criteria1:=HelpArr2(i), Operator:=xlFilterValues
        On Error Resume Next
        Set FilteredRng = Feuil1.Range("A2:" & HelpAddress).SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        
        If Not FilteredRng Is Nothing Then
            'Code here
        End If

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401424.html

標籤:擅长 vba

上一篇:VBA按顏色對excel列進行排序

下一篇:使用Python將時間戳放入Firestore時,可能會導致時間戳向后移動一天的原因是什么?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more