Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-使用数组值的多通配符筛选器_Excel_Vba - Fatal编程技术网

Excel VBA-使用数组值的多通配符筛选器

Excel VBA-使用数组值的多通配符筛选器,excel,vba,Excel,Vba,您好,VBA开发人员 我很难解决数组中列出的条件的多通配符过滤器。代码在“vTst=Doc\u ID\u Arr(i)”处停止,表示vTst=Empty。但是,如果检查调试器,则检查Doc_ID_Arr不是空的 Sub doc_id() 'Segment 1 ---- 'Get the worksheet called "LOB Docs" Dim sh_1 As Worksheet Set sh_1 = ThisWorkbook.Worksheets("LOB Docs") ' Declar

您好,VBA开发人员

我很难解决数组中列出的条件的多通配符过滤器。代码在“vTst=Doc\u ID\u Arr(i)”处停止,表示vTst=Empty。但是,如果检查调试器,则检查Doc_ID_Arr不是空的

Sub doc_id()
'Segment 1 ----
'Get the worksheet called "LOB Docs"
Dim sh_1 As Worksheet
Set sh_1 = ThisWorkbook.Worksheets("LOB Docs")

' Declare an array to hold all LOB Doc ID numbers
Dim Doc_ID_Arr As Variant
Dim Doc_ID_Value As String
Dim j As Long
Dim i As Long

With sh_1
lastrow_Header_Config = sh_1.Cells(Rows.count, "A").End(xlUp).Row
' Read LOB DOC ID's from Column Cell A2 to last value in Column A
ReDim Doc_ID_Arr(Application.WorksheetFunction.CountA(sh_1.Range("A2:A" & lastrow_Header_Config)) - 1) As Variant
j = 0
For i = 2 To lastrow_Header_Config
    Doc_ID_Value = sh_1.Range("A" & i).Value
    If Doc_ID_Value <> "" Then
    Doc_ID_Arr(j) = "*" & Doc_ID_Value & "*"
    j = j + 1
    End If
    Next
   End With
'  ' Debug.Print "Doc_ID_Value"
'    For i = LBound(Doc_ID_Arr) To UBound(Doc_ID_Arr)
'        Debug.Print Doc_ID_Arr(i)
'    Next i




'Segment 2 ----
   Dim sh_2 As Worksheet 'Data Sheet
   Dim sh_3 As Worksheet 'Output Sheet
   Set sh_2 = ThisWorkbook.Worksheets("GDL db") 'Data Sheet
   Set sh_3 = ThisWorkbook.Worksheets("Seed Template Output")

   Dim Dic As Object
   Dim eleData As Variant
   Dim eleCrit As Variant
   Dim ArrData As Variant
   Dim vTst As Variant

   Set Dic = CreateObject("Scripting.Dictionary")

   Dim x As Long

   For x = LBound(Doc_ID_Arr) To UBound(Doc_ID_Arr)
       vTst = Doc_ID_Arr(i)
   Next x

   With sh_2
   .AutoFilterMode = False
   ArrData = .Range("A1:A" & .Cells(.Rows.count, "A").End(xlUp).Row)
   For Each eleCrit In vTst
        For Each eleData In ArrData
            If eleData Like eleCrit Then _
            Dic(eleData) = vbNullString
        Next
   Next
    .Columns("A:A").AutoFilter Field:=1, Criteria1:=Dic.Keys, Operator:=xlFilterValues
   sh_2.UsedRange.Copy sh_3.Range("A1")
   End With


End Sub
Sub doc_id()
“第1部分----
'获取名为“LOB文档”的工作表
将sh_1设置为工作表
Set sh_1=此工作簿。工作表(“LOB文档”)
'声明一个数组以保存所有LOB文档ID号
Dim Doc\u ID\u Arr作为变型
Dim Doc_ID_值作为字符串
Dim j尽可能长
我想我会坚持多久
与SHU 1
lastrow_Header_Config=sh_1.Cells(Rows.count,“A”).End(xlUp).Row
'将列单元格A2中的LOB文档ID读取到列A中的最后一个值
ReDim Doc_ID_Arr(Application.WorksheetFunction.CountA(sh_1.Range(“A2:A”&lastrow_Header_Config))-1)作为变量
j=0
对于i=2到最后一行\头\配置
Doc_ID_Value=sh_1.范围(“A”&i).值
如果文档ID值为“”,则
Doc_ID_Arr(j)=“*”&Doc_ID_值&“*”
j=j+1
如果结束
下一个
以
“”调试。打印“文档ID值”
'对于i=LBound(Doc_ID_Arr)到UBound(Doc_ID_Arr)
'Debug.Print Doc\u ID\u Arr(i)
“接下来我
“第2部分----
尺寸sh_2作为工作表的数据表
将sh_3标注为工作表的输出表
Set sh_2=ThisWorkbook.Worksheets(“GDL db”)数据表
Set sh_3=thishworkbook.Worksheets(“种子模板输出”)
作为对象的Dic
将数据作为变量
Dim eleCrit作为变体
将数据作为变量
变暗vTst作为变型
设置Dic=CreateObject(“Scripting.Dictionary”)
暗x等长
对于x=LBound(Doc\u ID\u Arr)到UBound(Doc\u ID\u Arr)
vTst=文件编号(i)
下一个x
与SHU 2
.AutoFilterMode=False
ArrData=.Range(“A1:A”和.Cells(.Rows.count,“A”).End(xlUp.Row)
对于vTst中的每个eleCrit
对于ArrData中的每个eleData
如果eleData像eleCrit那么_
Dic(eleData)=vbNullString
下一个
下一个
.Columns(“A:A”)。自动筛选字段:=1,准则1:=Dic.Keys,运算符:=xlFilterValues
sh_2.UsedRange.Copy sh_3.Range(“A1”)
以
端接头

我正在尝试为段1中创建的文档ID Arr中的每个值(单个)或所有值(整体)筛选sh_2 A列。目标是将每个ID的每个过滤器输出放在sh_3上,而不覆盖以前放置的值/行

使用您以前发布的示例工作簿,这对我很有用:

Sub document_link_extract()

    'Define data source
    Dim GDL_Data As Worksheet 'Datasheet holding Docs links
    Dim LOB_Doc As Worksheet 'Docs to filter for
    Dim Doc_Output_sh As Worksheet 'Seed Template - curated document list
    Dim Doc_ID_List() As String, v, rngIds As Range
    Dim arrVals, arrSearch, dict, rwV As Long, rwS As Long, srch

    Set GDL_Data = ThisWorkbook.Sheets("Sheet2") 'DataSheet
    Set LOB_Doc = ThisWorkbook.Sheets("Sheet1") 'Filter Criteria Sheet
    Set Output_sht = ThisWorkbook.Sheets("Sheet3") 'Output for' Look 1/2 - URL Check & PDF Extract

    Output_sht.UsedRange.Clear

    'get array of search terms
    With LOB_Doc
        arrSearch = .Range(.Range("A2"), .Cells(.Rows.Count, 1).End(xlUp)).Value
    End With

    'get array of data column values
    With GDL_Data
        arrVals = .Range(.Range("A2"), .Cells(.Rows.Count, 1).End(xlUp)).Value
    End With

    Set dict = CreateObject("scripting.dictionary")

    'loop over each search term
    For rwS = 1 To UBound(arrSearch, 1)
        srch = "*" & arrSearch(rwS, 1) & "*" '<< search term with wildcards
        'loop over each value
        For rwV = 1 To UBound(arrVals, 1)
            v = arrVals(rwV, 1)
            'if value matches search term then add to dictionary
            If v Like srch Then dict(v) = True
        Next rwV
    Next rwS

    GDL_Data.AutoFilterMode = False 'if there is any filter, remove it

    'filter using the dictionary keys array
    GDL_Data.UsedRange.AutoFilter 1, dict.keys, xlFilterValues
    GDL_Data.UsedRange.Copy Output_sht.Range("A1")

    GDL_Data.AutoFilterMode = False

End Sub
子文档链接提取()
'定义数据源
Dim GDL_数据作为工作表的数据表,包含文档链接
将LOB_文档作为工作表文档进行筛选
Dim文档输出作为工作表种子模板-策划的文档列表
Dim Doc_ID_List()作为字符串,v、rngIds作为范围
调宽排列、排列搜索、dict、rwV等长排列、rwS等长排列、srch
设置GDL_Data=ThisWorkbook.Sheets(“Sheet2”)数据表
设置LOB_Doc=ThisWorkbook.Sheets(“Sheet1”)'筛选条件表
设置输出\u sht=ThisWorkbook.Sheets(“Sheet3”)“输出为”Look 1/2-URL检查和PDF提取
输出\u sht.UsedRange.Clear
'获取搜索词数组
带LOB_Doc
arrSearch=.Range(.Range(“A2”),.Cells(.Rows.Count,1).End(xlUp)).Value
以
'获取数据列值数组
使用GDL_数据
arrVals=.Range(.Range(“A2”),.Cells(.Rows.Count,1).End(xlUp)).Value
以
Set dict=CreateObject(“scripting.dictionary”)
'在每个搜索词上循环
对于rwS=1至UBound(arrSearch,1)

srch=“*”&arrSearch(rwS,1)和“*”使用您以前发布的示例工作簿,这对我很有用:

Sub document_link_extract()

    'Define data source
    Dim GDL_Data As Worksheet 'Datasheet holding Docs links
    Dim LOB_Doc As Worksheet 'Docs to filter for
    Dim Doc_Output_sh As Worksheet 'Seed Template - curated document list
    Dim Doc_ID_List() As String, v, rngIds As Range
    Dim arrVals, arrSearch, dict, rwV As Long, rwS As Long, srch

    Set GDL_Data = ThisWorkbook.Sheets("Sheet2") 'DataSheet
    Set LOB_Doc = ThisWorkbook.Sheets("Sheet1") 'Filter Criteria Sheet
    Set Output_sht = ThisWorkbook.Sheets("Sheet3") 'Output for' Look 1/2 - URL Check & PDF Extract

    Output_sht.UsedRange.Clear

    'get array of search terms
    With LOB_Doc
        arrSearch = .Range(.Range("A2"), .Cells(.Rows.Count, 1).End(xlUp)).Value
    End With

    'get array of data column values
    With GDL_Data
        arrVals = .Range(.Range("A2"), .Cells(.Rows.Count, 1).End(xlUp)).Value
    End With

    Set dict = CreateObject("scripting.dictionary")

    'loop over each search term
    For rwS = 1 To UBound(arrSearch, 1)
        srch = "*" & arrSearch(rwS, 1) & "*" '<< search term with wildcards
        'loop over each value
        For rwV = 1 To UBound(arrVals, 1)
            v = arrVals(rwV, 1)
            'if value matches search term then add to dictionary
            If v Like srch Then dict(v) = True
        Next rwV
    Next rwS

    GDL_Data.AutoFilterMode = False 'if there is any filter, remove it

    'filter using the dictionary keys array
    GDL_Data.UsedRange.AutoFilter 1, dict.keys, xlFilterValues
    GDL_Data.UsedRange.Copy Output_sht.Range("A1")

    GDL_Data.AutoFilterMode = False

End Sub
子文档链接提取()
'定义数据源
Dim GDL_数据作为工作表的数据表,包含文档链接
将LOB_文档作为工作表文档进行筛选
Dim文档输出作为工作表种子模板-策划的文档列表
Dim Doc_ID_List()作为字符串,v、rngIds作为范围
调宽排列、排列搜索、dict、rwV等长排列、rwS等长排列、srch
设置GDL_Data=ThisWorkbook.Sheets(“Sheet2”)数据表
设置LOB_Doc=ThisWorkbook.Sheets(“Sheet1”)'筛选条件表
设置输出\u sht=ThisWorkbook.Sheets(“Sheet3”)“输出为”Look 1/2-URL检查和PDF提取
输出\u sht.UsedRange.Clear
'获取搜索词数组
带LOB_Doc
arrSearch=.Range(.Range(“A2”),.Cells(.Rows.Count,1).End(xlUp)).Value
以
'获取数据列值数组
使用GDL_数据
arrVals=.Range(.Range(“A2”),.Cells(.Rows.Count,1).End(xlUp)).Value
以
Set dict=CreateObject(“scripting.dictionary”)
'在每个搜索词上循环
对于rwS=1至UBound(arrSearch,1)

srch=“*”和arrSearch(rwS,1)和“*”注释。缩进已关闭,模糊了代码的逻辑流。请查看此项以修复它。为什么在这个循环中使用
i
:x=LBound(Doc\u ID\u Arr)到UBound(Doc\u ID\u Arr)vTst=Doc\u ID\u Arr(i)Next x
。你为什么还需要一个循环?你好Ben,我不确定是否需要一个循环来将我的条件数组值输入到vTst。因为,保存文档ID的数组是变量,而VTst也是变量。这不是填充数组的方式。而且
Doc\u ID\u Arr
已经是一个数组了,为什么要创建一个新的呢?你好,Ben,感谢您对初始代码的反馈。蒂姆·威廉姆斯已经解决了这个问题。非常感谢Tim W.Note。缩进已关闭,模糊了代码的逻辑流。请查看此项以修复它。为什么在这个循环中使用
i
:x=LBound(Doc\u ID\u Arr)到UBound(Doc\u ID\u Arr)vTst=Doc\u ID\u Arr(i)Next x
。你为什么还需要一个循环?你好Ben,我不确定是否需要一个循环来将我的条件数组值输入到vTst。因为,保存文档ID的数组是变量,而VTst也是变量。这不是填充数组的方式。而且
Doc\u ID\u Arr
已经是一个数组了,你为什么要创建一个新的数组呢?你好,本,谢谢你的反馈