Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
使用VBA将多个文件复制到单个文件中_Vba_Vbscript - Fatal编程技术网

使用VBA将多个文件复制到单个文件中

使用VBA将多个文件复制到单个文件中,vba,vbscript,Vba,Vbscript,我试图在表单应用程序中编写一个代码,在该应用程序中,我可以选择多个文件,并将所有选定文件的数据附加到另一个文件(主文件)中 下面我编写了一个函数,单击Userform按钮调用它 运行这段代码时,我遇到了自动化错误-2147221080(80040188) 在调试过程中,我发现在代码的下一行中重新赋值时出现了给定错误 设置rngData=shtData.UsedRange 有人能帮我解决这个问题吗?我是VBA新手,不知道错误的原因 Function copyfiles() Dim wbkMaste

我试图在表单应用程序中编写一个代码,在该应用程序中,我可以选择多个文件,并将所有选定文件的数据附加到另一个文件(主文件)中

下面我编写了一个函数,单击Userform按钮调用它

运行这段代码时,我遇到了自动化错误-2147221080(80040188)

在调试过程中,我发现在代码的下一行中重新赋值时出现了给定错误

设置rngData=shtData.UsedRange

有人能帮我解决这个问题吗?我是VBA新手,不知道错误的原因

Function copyfiles()
Dim wbkMaster As Workbook
Dim shtMaster As Worksheet
Dim rngMaster As Range
Dim wbkData As Workbook
Dim shtData As Worksheet
Dim rngData As Range
Dim intChoice As Integer
Dim strPath As String
Dim strPath1 As String
 Dim array1() As String
 Dim filepath As String
 Dim count As Integer
 Dim i As Integer

'to select master file

 Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
 intChoice = Application.FileDialog(msoFileDialogOpen).Show
 If intChoice <> 0 Then
 strPath = Application.FileDialog( _
 msoFileDialogOpen).SelectedItems(1)
 End If

Set wbkMaster = Workbooks.Open(strPath)
Set shtMaster = wbkMaster.Worksheets(1)



 'to select source file(s)
  Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = True

  intChoice = Application.FileDialog(msoFileDialogOpen).Show

  If intChoice <> 0 Then
  For i = 1 To Application.FileDialog(msoFileDialogOpen _
 ).SelectedItems.count
 strPath = Application.FileDialog(msoFileDialogOpen _
 ).SelectedItems(i)
 filepath = filepath & strPath & ","
 Next i
 End If

 array1 = Split(filepath, ",", -1, vbBinaryCompare)
 count = i - 1
 Set rngMaster = shtMaster.Range("A65536").End(xlUp).Offset(1, 0)
 For j = 0 To count - 1

 Set wbkData = Workbooks.Open(array1(j))
 Set shtData = wbkData.Worksheets(1)
 Set wbkMaster = Workbooks.Open(strPath)
 Set shtMaster = wbkMaster.Worksheets(1)
 Set rngData = shtData.UsedRange

 ' copy data across
 rngData.Copy rngMaster

 ' simply close data
 wbkData.Close False

 '  release objects
Set rngData = Nothing
Set shtData = Nothing
Set wbkData = Nothing

wbkMaster.Close True

Set shtMaster = Nothing

Set wbkMaster = Nothing

Next

   Set rngMaster = Nothing
End Function
函数copyfiles()
将wbkMaster设置为工作簿
将shtMaster设置为工作表
变暗rngMaster As范围
将wbkData设置为工作簿
将shtData设置为工作表
暗rngData As范围
选择整数
将strPath设置为字符串
将strPath1设置为字符串
Dim array1()作为字符串
将文件路径设置为字符串
将计数设置为整数
作为整数的Dim i
'以选择主文件
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect=False
intChoice=Application.FileDialog(msoFileDialogOpen.Show)
如果选择0,那么
strPath=Application.FileDialog(_
msoFileDialogOpen)。选择编辑项(1)
如果结束
设置wbkMaster=Workbooks.Open(strPath)
设置shtMaster=wbkMaster.工作表(1)
'以选择源文件
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect=True
intChoice=Application.FileDialog(msoFileDialogOpen.Show)
如果选择0,那么
对于i=1到Application.FileDialog(msoFileDialogOpen_
).SelectedItems.count
strPath=Application.FileDialog(msoFileDialogOpen_
).SelectedItems(i)
filepath=filepath&strPath&“
接下来我
如果结束
array1=Split(文件路径,,,-1,vbBinaryCompare)
计数=i-1
设置rngMaster=shtMaster.Range(“A65536”)。结束(xlUp)。偏移量(1,0)
如果j=0,则计数为-1
设置wbkData=工作簿。打开(数组1(j))
设置shtData=wbkData.工作表(1)
设置wbkMaster=Workbooks.Open(strPath)
设置shtMaster=wbkMaster.工作表(1)
设置rngData=shtData.UsedRange
'跨服务器复制数据
rngData,复制rngMaster
“只需关闭数据即可
wbkData.Close为False
'释放对象
设置rngData=Nothing
设置shtData=Nothing
设置wbkData=Nothing
wbkMaster,接近真值
设置shtMaster=Nothing
设置wbkMaster=Nothing
下一个
设置rngMaster=Nothing
端函数

我想你应该试试罗恩·德布林的密码

Sub Basic_Example_1()
    Dim MyPath As String, FilesInPath As String
    Dim MyFiles() As String
    Dim SourceRcount As Long, Fnum As Long
    Dim mybook As Workbook, BaseWks As Worksheet
    Dim sourceRange As Range, destrange As Range
    Dim rnum As Long, CalcMode As Long

    'Fill in the path\folder where the files are
    MyPath = "C:\Users\Ron\test"

    'Add a slash at the end if the user forget it
    If Right(MyPath, 1) <> "\" Then
        MyPath = MyPath & "\"
    End If

    'If there are no Excel files in the folder exit the sub
    FilesInPath = Dir(MyPath & "*.xl*")
    If FilesInPath = "" Then
        MsgBox "No files found"
        Exit Sub
    End If

    'Fill the array(myFiles)with the list of Excel files in the folder
    Fnum = 0
    Do While FilesInPath <> ""
        Fnum = Fnum + 1
        ReDim Preserve MyFiles(1 To Fnum)
        MyFiles(Fnum) = FilesInPath
        FilesInPath = Dir()
    Loop

    'Change ScreenUpdating, Calculation and EnableEvents
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    'Add a new workbook with one sheet
    Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
    rnum = 1

    'Loop through all files in the array(myFiles)
    If Fnum > 0 Then
        For Fnum = LBound(MyFiles) To UBound(MyFiles)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum))
            On Error GoTo 0

            If Not mybook Is Nothing Then

                On Error Resume Next

                With mybook.Worksheets(1)
                    Set sourceRange = .Range("A1:C1")
                End With

                If Err.Number > 0 Then
                    Err.Clear
                    Set sourceRange = Nothing
                Else
                    'if SourceRange use all columns then skip this file
                    If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
                        Set sourceRange = Nothing
                    End If
                End If
                On Error GoTo 0

                If Not sourceRange Is Nothing Then

                    SourceRcount = sourceRange.Rows.Count

                    If rnum + SourceRcount >= BaseWks.Rows.Count Then
                        MsgBox "Sorry there are not enough rows in the sheet"
                        BaseWks.Columns.AutoFit
                        mybook.Close savechanges:=False
                        GoTo ExitTheSub
                    Else

                        'Copy the file name in column A
                        With sourceRange
                            BaseWks.cells(rnum, "A"). _
                                    Resize(.Rows.Count).Value = MyFiles(Fnum)
                        End With

                        'Set the destrange
                        Set destrange = BaseWks.Range("B" & rnum)

                        'we copy the values from the sourceRange to the destrange
                        With sourceRange
                            Set destrange = destrange. _
                                            Resize(.Rows.Count, .Columns.Count)
                        End With
                        destrange.Value = sourceRange.Value

                        rnum = rnum + SourceRcount
                    End If
                End If
                mybook.Close savechanges:=False
            End If

        Next Fnum
        BaseWks.Columns.AutoFit
    End If

ExitTheSub:
    'Restore ScreenUpdating, Calculation and EnableEvents
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Function RDB_Last(choice As Integer, rng As Range)
'Ron de Bruin, 5 May 2008
' 1 = last row
' 2 = last column
' 3 = last cell
    Dim lrw As Long
    Dim lcol As Integer

    Select Case choice

    Case 1:
        On Error Resume Next
        RDB_Last = rng.Find(What:="*", _
                            after:=rng.cells(1), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Row
        On Error GoTo 0

    Case 2:
        On Error Resume Next
        RDB_Last = rng.Find(What:="*", _
                            after:=rng.cells(1), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByColumns, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Column
        On Error GoTo 0

    Case 3:
        On Error Resume Next
        lrw = rng.Find(What:="*", _
                       after:=rng.cells(1), _
                       Lookat:=xlPart, _
                       LookIn:=xlFormulas, _
                       SearchOrder:=xlByRows, _
                       SearchDirection:=xlPrevious, _
                       MatchCase:=False).Row
        On Error GoTo 0

        On Error Resume Next
        lcol = rng.Find(What:="*", _
                        after:=rng.cells(1), _
                        Lookat:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0

        On Error Resume Next
        RDB_Last = rng.Parent.cells(lrw, lcol).Address(False, False)
        If Err.Number > 0 Then
            RDB_Last = rng.cells(1).Address(False, False)
            Err.Clear
        End If
        On Error GoTo 0

    End Select
Sub-Basic_示例_1()
将MyPath设置为字符串,将FileInPath设置为字符串
将MyFiles()设置为字符串
暗源计数等于长,Fnum等于长
将mybook设置为工作簿,将BaseWks设置为工作表
变暗源范围作为范围,减小范围作为范围
尺寸与长度相同,计算模式与长度相同
'填写文件所在的路径\文件夹
MyPath=“C:\Users\Ron\test”
'如果用户忘记了,请在末尾添加斜杠
如果正确(MyPath,1)“\”则
MyPath=MyPath&“\”
如果结束
'如果文件夹中没有Excel文件,请退出子文件夹
FilesInPath=Dir(MyPath&“*.xl*”)
如果FilesInPath=“”,则
MsgBox“未找到任何文件”
出口接头
如果结束
'用文件夹中的Excel文件列表填充数组(myFiles)
Fnum=0
在文件输入路径“”时执行此操作
Fnum=Fnum+1
ReDim保留我的文件(1到Fnum)
MyFiles(Fnum)=FilesInPath
FilesInPath=Dir()
环
'更改屏幕更新、计算和启用事件
应用
CalcMode=.Calculation
.Calculation=xlCalculationManual
.ScreenUpdate=False
.EnableEvents=False
以
'添加带有一张工作表的新工作簿
Set BaseWks=工作簿。添加(XLWBATWORKEM)。工作表(1)
rnum=1
'循环遍历数组中的所有文件(myFiles)
如果Fnum>0,则
对于Fnum=LBound(MyFiles)到UBound(MyFiles)
设置mybook=Nothing
出错时继续下一步
设置mybook=Workbooks.Open(MyPath&MyFiles(Fnum))
错误转到0
如果不是的话,我的书什么都不是
出错时继续下一步
使用mybook.工作表(1)
设置sourceRange=.Range(“A1:C1”)
以
如果错误编号>0,则
呃,明白了
设置sourceRange=Nothing
其他的
'如果SourceRange使用所有列,则跳过此文件
如果sourceRange.Columns.Count>=BaseWks.Columns.Count,则
设置sourceRange=Nothing
如果结束
如果结束
错误转到0
如果不是sourceRange,则为Nothing
SourceRcount=sourceRange.Rows.Count
如果rnum+SourceRcount>=BaseWks.Rows.Count,则
MsgBox“很抱歉,工作表中的行数不足”
BaseWks.Columns.AutoFit
mybook.Close savechanges:=False
下地狱
其他的
'复制A列中的文件名
使用sourceRange
基底细胞(rnum,“A”)_
调整大小(.Rows.Count).Value=MyFiles(Fnum)
以
'设置destrange
设置destrange=BaseWks.Range(“B”和rnum)
'我们将值从sourceRange复制到DestrRange
使用sourceRange
设置减小范围=减小范围_
调整大小(.Rows.Count、.Columns.Count)
以
destrange.Value=sourceRange.Value
rnum=rnum+源计数
如果结束
如果结束
mybook.Close savechanges:=False
如果结束
下一个Fnum
BaseWks.Columns.AutoFit
如果结束
退出主题:
“恢复屏幕更新,Calcul