Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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 编译错误“;参数数目错误或属性赋值无效“;将文件夹对象传递给递归子对象_Excel_Vba - Fatal编程技术网

Excel 编译错误“;参数数目错误或属性赋值无效“;将文件夹对象传递给递归子对象

Excel 编译错误“;参数数目错误或属性赋值无效“;将文件夹对象传递给递归子对象,excel,vba,Excel,Vba,这将基于递归查看子文件夹中的文件来填充工作表。调用RecurSub时遇到此错误,搜索了类似的线程,但运气不佳,试图找出我缺少的内容。据我所知,对Recurr的调用与其参数匹配。我错过了什么明显的东西吗?谢谢 Public Wb As Workbook Public Ws As Worksheet Public CLP As String '''''''''''''''''''''''''''''''''''''''''''''''''' Function GFold(Ttl, Dflt As S

这将基于递归查看子文件夹中的文件来填充工作表。调用RecurSub时遇到此错误,搜索了类似的线程,但运气不佳,试图找出我缺少的内容。据我所知,对Recurr的调用与其参数匹配。我错过了什么明显的东西吗?谢谢

Public Wb As Workbook
Public Ws As Worksheet
Public CLP As String
''''''''''''''''''''''''''''''''''''''''''''''''''
Function GFold(Ttl, Dflt As String) As String
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim FDlog As FileDialog
Dim FStr As String

Set FDlog = Application.FileDialog(msoFileDialogFolderPicker)
With FDlog
    .Title = Ttl
    .AllowMultiSelect = False
    .InitialFileName = Dflt
    If .Show <> -1 Then GoTo NextCode
        FStr = .SelectedItems(1)
    End With
NextCode:
    GFold = FStr
    Set FDlog = Nothing
End Function
''''''''''''''''''''''''''''''
Sub CheckOffDocs()
''''''''''''''''''''''''''''''
Dim MyFSO, MyFld As Object
Dim Wb As Workbook
Dim Path, CLPath As String

' • Get folder path
Path = GFold("Select Parent Folder", Application.DefaultFilePath)

' • Check folder path
If Len(Path) = 0 Then
    Exit Sub
End If

' • Create file sys obj
Set MyFSO = CreateObject("Scripting.FileSystemObject")
' • Get ahold of folder at path address
Set MyFld = MyFSO.getfolder(Path)

Set Wb = ActiveWorkbook
Set Ws = Wb.Sheets(1)

'• prompt clear checks input
If MsgBox("Clear existing inventory?", vbQuestion + vbYesNo) = vbYes Then
    For c = 1 To 2
        For r = 14 To 113
            If Len(Ws.Cells(r, (c * 3) - 2).Value) > 1 Then
                Ws.Cells(r, c * 3).ClearContents
            End If
        Next r
    Next c
End If

'• pass folder to recur
Call Recur(MyFld)

'• clean up
Set MyFld = Nothing
Set MyFSO = Nothing

' • Set default location and prompt for save as info
SvName = CLPath & "L01 Contract File Checklist.xlsm"
SvName = Application.GetSaveAsFilename(InitialFileName:=SvName, fileFilter:="Excel files (*.xlsm), *.xlsm")
' • Check valid info
If Len(SvName) > 0 And InStr(SvName, "FALSE") = 0 And SvName <> False Then
    If Left(UCase(Ws.Cells(1, 14).Value), 3) = "L01" Then Ws.Cells(1, 14).Value = "X"
    Wb.SaveAs Filename:=SvName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
Else
    MsgBox "File not saved."
End If

End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Recur(ByVal Fld As Object)
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim r, c As Integer
Dim MySub, MyFIle As Object

'• Recursively loop all folders
For Each MySub In Fld.subfolders
    Call Recur(MySub)
Next MySub

If InStr(UCase(Fld.Name), "CHECKLIST") > 0 Then
    CLP = Fld.Path & "\"
End If

For Each MyFIle In Fld.Files
    For c = 1 To 2
        For r = 14 To 113
            '• Check for valid code row and match to filename
            If Len(Ws.Cells(r, (c * 3) - 2).Value) > 1 And UCase(Left(MyFIle.Name, 3)) = UCase(Ws.Cells(r, (c * 3) - 2).Value, 3) Then
                '• Mark "x" column
                Ws.Cells(r, (c * 3)).Value = "X"
                '• Bail out of loops after match
                GoTo bail
            End If
        Next r
    Next c
bail:
Next MyFIle

End Sub
公共Wb作为工作簿
公共Ws-As工作表
公共CLP As字符串
''''''''''''''''''''''''''''''''''''''''''''''''''
函数GFold(Ttl,Dflt作为字符串)作为字符串
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim FDlog As FileDialog
作为字符串的Dim FStr
设置FDlog=Application.FileDialog(msoFileDialogFolderPicker)
用FDlog
.Title=Ttl
.AllowMultiSelect=False
.InitialFileName=Dflt
如果.Show-1,则转到下一个代码
FStr=.SelectedItems(1)
以
下一个代码:
GFold=FStr
设置FDlog=Nothing
端函数
''''''''''''''''''''''''''''''
次级核对文件()
''''''''''''''''''''''''''''''
Dim MyFSO,MyFld作为对象
将Wb设置为工作簿
Dim Path,CLPath作为字符串
“•获取文件夹路径
Path=GFold(“选择父文件夹”,Application.DefaultFilePath)
“•检查文件夹路径
如果Len(Path)=0,则
出口接头
如果结束
“•创建文件sys obj
设置MyFSO=CreateObject(“Scripting.FileSystemObject”)
“•获取路径地址处的文件夹
设置MyFld=MyFSO.getfolder(路径)
设置Wb=ActiveWorkbook
设置Ws=Wb.Sheets(1)
“•提示清除检查输入
如果MsgBox(“清除现有库存?”,vbQuestion+vbYesNo)=vbYes,则
对于c=1到2
对于r=14至113
如果Len(Ws.Cells(r,(c*3)-2.Value)>1,那么
Ws.Cells(r,c*3).ClearContents
如果结束
下一个r
下一个c
如果结束
“•传递文件夹以重复
呼叫重现(MyFld)
“•清理
设置MyFld=Nothing
设置MyFSO=Nothing
“•设置默认位置并提示保存为信息
SvName=CLPath&“L01合同文件清单.xlsm”
SvName=应用程序.GetSaveAsFilename(初始文件名:=SvName,文件筛选器:=“Excel文件(*.xlsm),*.xlsm”)
“•检查有效信息
如果Len(SvName)>0且InStr(SvName,“FALSE”)=0且SvName为FALSE,则
如果左(UCase(Ws.Cells(1,14).Value),3)=“L01”,则Ws.Cells(1,14).Value=“X”
Wb.SaveAs文件名:=SvName,文件格式:=xlOpenXMLWorkbookMacroEnabled
其他的
MsgBox“文件未保存。”
如果结束
端接头
''''''''''''''''''''''''''''''''''''''''''''''''''
子递归(ByVal Fld作为对象)
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim r,c为整数
将MySub、MyFIle设置为对象
“•递归循环所有文件夹
对于Fld.子文件夹中的每个MySub
呼叫重现(MySub)
下一个MySub
如果仪表(UCase(Fld.Name),“检查表”)>0,则
CLP=Fld.Path&“\”
如果结束
对于Fld.Files中的每个MyFIle
对于c=1到2
对于r=14至113
“•检查有效的代码行并与文件名匹配
如果Len(Ws.Cells(r,(c*3)-2.Value)>1且UCase(Left(MyFIle.Name,3))=UCase(Ws.Cells(r,(c*3)-2.Value,3),则
“•标记“x”列
Ws.Cells(r,(c*3)).Value=“X”
“•比赛后从环路中跳出
保释
如果结束
下一个r
下一个c
保释:
下一个MyFIle
端接头

注意,在VBA中,您需要为声明中的每个变量指定数据类型,否则它们就是
Variant
s

改变

Dim MySub, MyFIle As Object


请注意,在VBA中,您需要为声明中的每个变量指定数据类型:
Dim MySub,MyFIle As Object
应该是
Dim MySub As Object,MyFIle As Object
,以及类似的其他地方。查看这篇文章,这里缺少一个-UCase(ws.Cells(r,(c*3)-2).Value,3),应该是UCase(左(ws.Cells(r,(c*3)-2.Value,3))@BigBen抱歉,我没读到你的评论(我责备在电话上阅读!)我以为你写的
MySub
会是
对象,而Dim希望OP这样做。事实上,当你写的时候,把它改成那个。@BigBen解决了这个问题,如果你想把它写进一个答案,我会接受的。
Dim MySub As Object, MyFIle As Object