Excel在工作簿的文件夹中循环

Excel在工作簿的文件夹中循环,excel,vba,Excel,Vba,我编写了一个代码,该代码指向一个带有文件名的特定工作表,并将数据复制到另一个名为DataSummary的工作表中 Sub Macro1() Dim MyFileName As String, MyPath As String Application.ScreenUpdating = False Application.DisplayAlerts = False MyPath = "C:\testfiles\" MyFileName = Dir(MyPath & "*.xls*") Do

我编写了一个代码,该代码指向一个带有文件名的特定工作表,并将数据复制到另一个名为DataSummary的工作表中

Sub Macro1()

Dim MyFileName As String, MyPath As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
MyPath = "C:\testfiles\"
MyFileName = Dir(MyPath & "*.xls*")
Do Until MyFileName = ""
Workbooks.Open Filename:=MyPath & MyFileName

Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets

        If ws.Name Like "*Ont*" Then
            ws.Activate
            LastRow1 = ActiveSheet.UsedRange.Row - 1 +     ActiveSheet.UsedRange.Rows.Count
            strAddress2 = "T2:T" & LastRow1
            wbName = ThisWorkbook.Name
            Range(strAddress2).Value = Left(wbName, InStrRev(wbName, ".") - 1)

        End If
    Next
 wbName = Left(ThisWorkbook.Name, InStr(1, ThisWorkbook.Name, ".") - 1)
 LastRow = Sheets(wbName).Range("A" & Rows.Count).End(xlUp).Row
 Sheets.Add Type:=xlWorksheet
 ActiveSheet.Name = "DataSummary2"
 For i = 2 To LastRow
 If Sheets(wbName).Cells(i, "A").Value = "ON" Then
 Sheets(wbName).Cells(i, "E").EntireRow.Copy Destination:=Sheets("DataSummary2").Range("A" & Rows.Count).End(xlUp).Offset(1)
 End If
 Next i


    MyFileName = Dir
    ActiveWorkbook.Close True
Loop

End Sub
现在这个代码在同一个工作表中使用时效果很好,我有大约100本工作手册,我想编辑这个代码,这样它就可以遍历所有的工作手册并进行必要的编辑

在此之后的下一步是将所有数据摘要工作表合并到一个工作簿中


首先,该代码应该转到文件夹,打开每个文件并转到 名称从Ont开始的工作表,然后复制工作表的名称 到第T列的同一工作表,然后创建一个新工作表 在同一工作簿中调用DataSummary并复制旧工作簿中的所有数据 列A上有值的工作表

在您的代码中,我对XD的作用感到非常困惑

wbName = Left(ThisWorkbook.Name, InStr(1, ThisWorkbook.Name, ".") - 1)
我认为您希望将工作表名称存储到变量
wbName
中,但对于变量XD来说,这是一个糟糕的名称。同样,从您的代码中破译您想要的是哪本书和哪张工作表是相当混乱的,但我在下面做了我最好的尝试

我无法轻松复制您的文件夹和文件,因此这是未经测试的。做备份

Sub Macro1()

Dim MyFileName As String, MyPath As String
Dim newBook As Workbook
Dim ws As Worksheet

'Application.ScreenUpdating = False
'Application.DisplayAlerts = False

MyPath = "C:\testfiles\"
MyFileName = Dir(MyPath & "*.xls*")

Do Until MyFileName = ""

    Set newBook = Workbooks.Open(Filename:=MyPath & MyFileName)

    'add new sheet called DataSummary2
    newBook.Sheets.Add Type:=xlWorksheet
    ActiveSheet.name = "DataSummary2"

    For Each ws In newBook.Sheets

            If ws.name Like "*Ont*" Then

                lastRow1 = ws.UsedRange.Row - 1 + ws.UsedRange.Rows.Count 'not sure what the second half is doing XD
                strAddress2 = "T2:T" & lastRow1
                Range(strAddress2).Value = ws.name 'copy name of worksheet to column T

                lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row

                'now copying to data summary
                For i = 2 To lastRow
                    If ws.Cells(i, "A").Value = "ON" Then
                    ws.Cells(i, "E").EntireRow.Copy Destination:=Sheets("DataSummary2").Range("A" & Rows.Count).End(xlUp).Offset(1)
                    End If
                Next i

            End If
    Next

    newBook.Close True
    MyFileName = Dir

Loop

End Sub
根据您的评论:


首先,该代码应该转到文件夹,打开每个文件并转到 名称从Ont开始的工作表,然后复制工作表的名称 到第T列的同一工作表,然后创建一个新工作表 在同一工作簿中调用DataSummary并复制旧工作簿中的所有数据 列A上有值的工作表

在您的代码中,我对XD的作用感到非常困惑

wbName = Left(ThisWorkbook.Name, InStr(1, ThisWorkbook.Name, ".") - 1)
我认为您希望将工作表名称存储到变量
wbName
中,但对于变量XD来说,这是一个糟糕的名称。同样,从您的代码中破译您想要的是哪本书和哪张工作表是相当混乱的,但我在下面做了我最好的尝试

我无法轻松复制您的文件夹和文件,因此这是未经测试的。做备份

Sub Macro1()

Dim MyFileName As String, MyPath As String
Dim newBook As Workbook
Dim ws As Worksheet

'Application.ScreenUpdating = False
'Application.DisplayAlerts = False

MyPath = "C:\testfiles\"
MyFileName = Dir(MyPath & "*.xls*")

Do Until MyFileName = ""

    Set newBook = Workbooks.Open(Filename:=MyPath & MyFileName)

    'add new sheet called DataSummary2
    newBook.Sheets.Add Type:=xlWorksheet
    ActiveSheet.name = "DataSummary2"

    For Each ws In newBook.Sheets

            If ws.name Like "*Ont*" Then

                lastRow1 = ws.UsedRange.Row - 1 + ws.UsedRange.Rows.Count 'not sure what the second half is doing XD
                strAddress2 = "T2:T" & lastRow1
                Range(strAddress2).Value = ws.name 'copy name of worksheet to column T

                lastRow = ws.Range("A" & Rows.Count).End(xlUp).Row

                'now copying to data summary
                For i = 2 To lastRow
                    If ws.Cells(i, "A").Value = "ON" Then
                    ws.Cells(i, "E").EntireRow.Copy Destination:=Sheets("DataSummary2").Range("A" & Rows.Count).End(xlUp).Offset(1)
                    End If
                Next i

            End If
    Next

    newBook.Close True
    MyFileName = Dir

Loop

End Sub

我编辑了这段代码,还为excel文件指定了路径,这段代码打开了excel工作表,但随后出现了错误OK我更新了代码。可以在文件夹中打开文件的循环错误是应用程序定义的错误或对象定义的错误。首先,此代码应转到文件夹,打开每个文件,转到名称从Ont开始的工作表,然后将工作表的名称复制到T列的同一工作表中,然后在同一工作簿中创建一个名为DataSummary的新工作表,并复制a列上有值的旧工作表中的所有数据。。。。。。我将此工作簿更改为Activeworkbook,但它仍然不起作用。他要求的是,当您运行它时,由于错误而停止,代码中将有一行突出显示。这是@fndwindow询问的行。我编辑了此代码,并为excel文件指定了路径,该代码打开excel工作表,但随后给出了错误OK我更新了代码。可以在文件夹中打开文件的循环错误是应用程序定义的错误或对象定义的错误。首先,此代码应转到文件夹,打开每个文件,转到名称从Ont开始的工作表,然后将工作表的名称复制到T列的同一工作表中,然后在同一工作簿中创建一个名为DataSummary的新工作表,并复制a列上有值的旧工作表中的所有数据。。。。。。我将此工作簿更改为Activeworkbook,但它仍然不起作用。他要求的是,当您运行它时,由于错误而停止,代码中将有一行突出显示。这是@fndwindow要求的行。感谢您的努力,有两个工作簿,第一个工作簿有一个宏,另一个工作簿在C:\testfiles\folder中有数据。变量wbName用于包含数据的工作簿,此工作簿有许多工作表我只需要从Ont开始的工作表。变量wbName存储工作簿的名称,并将其打印到T列,直到该工作表中存在数据的最后一行。我的代码的问题是它在宏工作表而不是数据工作表中打印工作簿名称,这就是为什么我认为第一个循环中有错误。到目前为止,这是糟糕的一天。我将稍后再看,但可能要到下周才能看:/别担心,伙计,谢谢你的时间和帮助。我可能会更改整个代码,并尝试以另一种方式执行,因为我的目标是合并文件。在此之后,感谢您的努力,有两个工作簿,第一个工作簿有一个宏,另一个位于C:\testfiles\文件夹中的工作簿有数据。变量wbName用于包含数据的工作簿,此工作簿有许多工作表我只需要从Ont开始的工作表。变量wbName存储工作簿的名称,并将其打印到T列,直到该工作表中存在数据的最后一行。我的代码的问题是它在宏工作表而不是数据工作表中打印工作簿名称,这就是为什么我认为第一个循环中有错误。到目前为止,这是糟糕的一天。我将稍后再看,但可能要到下周才能看:/别担心,伙计,谢谢你的时间和帮助。我可能会更改整个代码,并尝试以另一种方式执行,因为我的目标是合并文件。此后