VBA中的worksheetfunction.match属性有困难

VBA中的worksheetfunction.match属性有困难,vba,excel,runtime-error,match,Vba,Excel,Runtime Error,Match,当我的宏到达行时,我不断收到错误“运行时错误'91':“对象变量或未设置块变量” matchrange = Workbooks("tracker test").Sheets(start_sheet).Range("F" & h).Value 其中,我试图定义将与名为range的PL_compare_列表进行比较的PLnumber。如果我试图不定义该变量,而只是将引用直接放在下面一行的匹配函数中,则会出现错误“运行时错误“1004”:无法获取WorksheetFunction类的匹配属性

当我的宏到达行时,我不断收到错误“运行时错误'91':“对象变量或未设置块变量”

matchrange = Workbooks("tracker test").Sheets(start_sheet).Range("F" & h).Value
其中,我试图定义将与名为range的PL_compare_列表进行比较的PLnumber。如果我试图不定义该变量,而只是将引用直接放在下面一行的匹配函数中,则会出现错误“运行时错误“1004”:无法获取WorksheetFunction类的匹配属性”

我想做的是让这段代码查看start_工作表上的H列,看看它是否有数据。然后,如果没有,将F列中start_工作表上的PL编号与B列中“计算表”上的PL编号进行比较,找到一行,然后打开该行a列中相应的文件名。您有什么想法

以下是我的全部代码,但我认为最相关的部分将接近底部:

Option Explicit


Sub GetFileNames()

Range("A1").Select
ActiveCell.FormulaR1C1 = _
"=REPLACE(CELL(""filename""),FIND(""["",CELL(""filename"")),LEN(CELL(""filename"")),MID(CELL(""filename""),FIND(""]"",CELL(""filename""),1)+1,255))&""_samples shipment PO_PL_Invoice_ attachment\""&TRIM(MID(CELL(""filename""),FIND(""]"",CELL(""filename""),1)+1,255))&""_PL\"""
Range("B1").Select
ActiveCell.FormulaR1C1 = _
"=left(RC[-1],len(RC[-1])-10)"

Range("A1:B1").Select
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Dim directory As String
    directory = Range("B1").Value


Dim start_sheet As String
start_sheet = ActiveSheet.Name
Sheets("Calculation Sheet").Activate

Range("D1") = Sheets(start_sheet).Range("A1").Value

Columns("B:B").Select
Application.CutCopyMode = False
Selection.ClearContents

ActiveSheet.Cells(1, 1).Select

Dim xRow As Long
Dim xDirect$, xFname$, InitialFoldr$

InitialFoldr$ = directory
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & "\"
.Title = "Please select a folder to list Files from"
.InitialFileName = InitialFoldr$
.Show
If .SelectedItems.Count <> 0 Then
xDirect$ = .SelectedItems(1) & "\"
xFname$ = Dir(xDirect$, 7)
Do While xFname$ <> ""
ActiveCell.Offset(xRow) = xFname$
xRow = xRow + 1
xFname$ = Dir
Loop
End If
End With

Dim i As Integer
Dim j As Integer
Dim filenumber As Integer
filenumber = Evaluate("CountA(A:A)")

Columns("A:A").Select
Selection.NumberFormat = "@"
j = 1
For i = 1 To filenumber
    If InStr(1, Range("A" & i), "xlsx") Then
    ActiveSheet.Range("B" & j).Value = ActiveSheet.Range("D1").Value & ActiveSheet.Range("A" & i).Value
    j = j + 1
    End If
Next i

    Columns("B:B").Select
    Selection.Copy
    Columns("A:A").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Columns("B:E").Select
    Application.CutCopyMode = False
    Selection.ClearContents

Dim xlfilenumber As Integer
Dim PL_list_length As Integer

xlfilenumber = Evaluate("CountA(A:A)")
ActiveSheet.Range("A1:A" & xlfilenumber).Select
Selection.Name = "list_of_files"

For i = 1 To xlfilenumber
    Range("B" & i).Select
        ActiveCell.FormulaR1C1 = _
        "=MID(RC[-1],FIND(""_PL"",RC[-1],FIND(""_PL\"",RC[-1],1)+4)+1,7)"
Next i

xlfilenumber = Evaluate("CountA(B:B)")
ActiveSheet.Range("A1:A" & xlfilenumber).Select
Selection.Name = "PL_compare_list"

Sheets(start_sheet).Activate
PL_list_length = Evaluate("CountA(F:F)") - 1



Dim h As Integer
Dim g As Integer
Dim filerownum As Integer
Dim matchrange As Range
Dim comparerange As Range
Dim filename As String

    For h = 6 To 9
            If IsEmpty(Range("J" & h)) Then
                matchrange = Workbooks("tracker test").Sheets(start_sheet).Range("F" & h).Value
                filerownum = Application.WorksheetFunction.Match(matchrange, Worksheets("Calculation Sheet").Range("PL_compare_list"), 0)
                    filename = Range("A" & filerownum).Value
                    Workbooks.Open filename
            End If

    Next h



Workbooks("tracker test").Sheets(start_sheet).Activate

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
  ActiveSheet.ShowAllData
End If


ActiveSheet.Cells(1, 1).Select
Application.CutCopyMode = False
Selection.ClearContents

ActiveSheet.Cells(1, 2).Select
Application.CutCopyMode = False
Selection.ClearContents

ActiveSheet.Cells(1, 3).Select
Application.CutCopyMode = False
Selection.ClearContents

End Sub
选项显式
子GetFileNames()
范围(“A1”)。选择
ActiveCell.FormulaR1C1=_
=替换(单元格(““文件名”)、查找(“[”,单元格(““文件名”)、LEN(单元格(““文件名”)、MID(单元格(““文件名”)、查找(“]”)、单元格(““文件名”)、1)+1255)和“\u样品装运采购订单发票附件”&TRIM(MID(单元格(““文件名”)、查找(“]”、单元格(““文件名”)、1)+1255”)和\u PL\”
范围(“B1”)。选择
ActiveCell.FormulaR1C1=_
=左(RC[-1],len(RC[-1])-10
范围(“A1:B1”)。选择
Application.CutCopyMode=False
选择,复制
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
将目录设置为字符串
目录=范围(“B1”)。值
将起始页变暗为字符串
start\u sheet=ActiveSheet.Name
工作表(“计算书”)。激活
范围(“D1”)=图纸(起始图纸)。范围(“A1”)。值
列(“B:B”)。选择
Application.CutCopyMode=False
选择.ClearContents
单元格(1,1)。选择
长得一样
Dim xDirect$、xFname$、InitialFoldr$
InitialFoldr$=目录
使用Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName=Application.DefaultFilePath&“\”
.Title=“请选择要从中列出文件的文件夹”
.InitialFileName=InitialFoldr$
显示
如果.SelectedItems.Count 0,则
xDirect$=.SelectedItems(1)和“\”
xFname$=Dir(xDirect$,7)
执行xFname$“”
ActiveCell.Offset(xRow)=xFname$
xRow=xRow+1
xFname$=Dir
环
如果结束
以
作为整数的Dim i
作为整数的Dim j
将文件号设置为整数
filenumber=Evaluate(“CountA(A:A)”)
列(“A:A”)。选择
Selection.NumberFormat=“@”
j=1
对于i=1到filenumber
如果仪表(1,量程(“A”&i),“xlsx”),则
ActiveSheet.Range(“B”和j).Value=ActiveSheet.Range(“D1”).Value和ActiveSheet.Range(“A”和i).Value
j=j+1
如果结束
接下来我
列(“B:B”)。选择
选择,复制
列(“A:A”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
列(“B:E”)。选择
Application.CutCopyMode=False
选择.ClearContents
Dim xlfilenumber为整数
Dim PL_列表长度为整数
xlfilenumber=Evaluate(“CountA(A:A)”)
ActiveSheet.Range(“A1:A”&xlfilenumber)。选择
Selection.Name=“列出\u文件”
对于i=1到xlfilenumber
范围(“B”和i)。选择
ActiveCell.FormulaR1C1=_
=MID(RC[-1],FIND(“\u-PL”,RC[-1],FIND(“\u-PL\”,RC[-1],1)+4)+1,7)
接下来我
xlfilenumber=Evaluate(“CountA(B:B)”)
ActiveSheet.Range(“A1:A”&xlfilenumber)。选择
Selection.Name=“PL\u比较\u列表”
工作表(开始工作表)。激活
PL_list_length=Evaluate(“CountA(F:F)”)-1
作为整数的Dim h
作为整数的Dim g
Dim filerownum作为整数
暗匹配范围作为范围
暗比较器范围
将文件名设置为字符串
对于h=6到9
如果为空(范围(“J”&h)),则
匹配范围=工作簿(“跟踪器测试”)。工作表(开始工作表)。范围(“F”&h)。值
filerownum=Application.WorksheetFunction.Match(匹配范围,工作表(“计算书”).Range(“PL\U比较列表”),0)
filename=范围(“A”&filerownum).Value
工作簿。打开文件名
如果结束
下一个h
工作簿(“跟踪器测试”)。工作表(开始工作表)。激活
如果是(ActiveSheet.AutoFilterMode和ActiveSheet.FilterMode)或ActiveSheet.FilterMode,则
ActiveSheet.ShowAllData
如果结束
单元格(1,1)。选择
Application.CutCopyMode=False
选择.ClearContents
单元格(1,2)。选择
Application.CutCopyMode=False
选择.ClearContents
单元格(1,3)。选择
Application.CutCopyMode=False
选择.ClearContents
端接头

理想的是,你应该考虑一堆其他的变化,但是要解决如何处理一个失败的匹配问题:

Dim filerownum As Variant
Dim rngSrch As Range

Set rngSrch = Worksheets("Calculation Sheet").Range("PL_compare_list")

For h = 6 To 9
        If IsEmpty(Range("J" & h)) Then
            matchrange = Workbooks("tracker test").Sheets(start_sheet).Range("F" & h).Value
            'drop the WorksheetFunction
            filerownum = Application.Match(matchrange, rngSrch, 0)
            'test for error return value
            If Not IsError(filerownum) Then
                filename = Range("A" & filerownum).Value
                Workbooks.Open filename
            End If
        End If

Next h

尝试在工作簿名称中包含文件扩展名。如果“tracker test”是包含代码的工作簿的名称,则可以改用
ThisWorkbook
。我将其更改为:matchrange=ThisWorkbook.Sheets(start_sheet).Range(“F”&h)。Value filerownum=Application.WorksheetFunction.Match(此工作簿。工作表(开始表)。范围(“F”和“h”)。值,工作表(“计算表”)。范围(“PL\U比较表”),0)但仍然没有骰子…得到相同的错误我可能没有完全遵循,但我正在尝试帮助。如果PL是数字,MatchRange是一个范围,那么将范围分配给一个数字而不是它的值分配给一个数字有意义吗?如果查找范围中的搜索值不匹配,您将得到该错误。我明白了…可能就是这样…是否有一种方法可以将它包装成某种东西,允许它将消息输入到H列单元格中,然后继续循环?如果是,那会是什么样子?只需添加到Tim应答中,当使用
Application.WorksheetFunction.function
语法调用Excel函数时,错误将生成将抛出的运行时错误(并且可以被捕获),当使用
Application.Function
语法时,将返回错误代码,并可以使用
进行测试