【问题标题】:Copy multiple files in a folder and lines into one masterfile将文件夹中的多个文件和行复制到一个主文件中
【发布时间】:2017-05-31 10:19:52
【问题描述】:

我是创建宏的新手。仅针对特定问题创建了其中的 5 个。

有人可以帮我修改下面的宏吗?我在互联网上找到它,我根据自己的喜好对其进行了修改。但仍有改进的余地。无论如何,除了以下内容外,它都可以正常工作。

文件夹中会有很多文件。每个文件都包含一个名为“PIVOT”的选项卡,格式相同,但数据量不同。

PIVOT 选项卡中的范围是从 A 到 AM 列。它们从第 15 行开始。我只需要那些没有写“关闭”指示的行(状态列在 AJ 列中)。我希望将所有这些行复制到彼此下的主文件中。行数变化很大 - 例如 0 到 200,具体取决于打开的项目。

其次,有人可以告诉我一本书,可以购买,这样我就可以发展我的知识吗? 感谢您的帮助!

提伯尔

子 Import_to_Master() 将 sFolder 变暗为字符串 将 sFile 作为字符串变暗 将 wbD 调暗为工作簿,将 wbS 调暗为工作簿

Application.ScreenUpdating = False
Set wbS = ThisWorkbook
sFolder = wbS.Path & "\"

sFile = Dir(sFolder)
Do While sFile <> ""

    If sFile <> wbS.Name Then
        Set wbD = Workbooks.Open(sFolder & sFile) 'open the file; add condition to

         ' >>>>>> Adapt this part
        wbD.Sheets("PIVOT").Range("A15:AM26").Copy
        wbS.Activate
        Sheets("Template").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
         ' >>>>>>
        wbD.Close savechanges:=True 'close without saving
    End If

    sFile = Dir 'next file
Loop
Application.ScreenUpdating = True

结束子

【问题讨论】:

  • 当您拥有 StackOverflow 和互联网的其余部分时,不会担心一本书。您已经使用Range("A" &amp; Rows.Count).End(xlUp) 在您的主文件中找到了最后一行,因此您可以使用上面的代码修改您的Range("A15:AM26") 以在您的各个文件中找到最后一行。
  • 好的,但是有行,不需要。我只需要那些状态未关闭的。有一个带有 9-10 选项的特定列。其中一个是“封闭的”,但我不在乎。另外,如果我添加 Range("A" & Rows.Count).End(xlUp),它会说超出范围。我认为这是因为源文件从第 14 行开始。感谢您的预订建议 :) 但如果我每天花 15-30 分钟,我会寻找可以每天教我一些东西的东西。

标签: excel vba copy


【解决方案1】:

你可能在这之后:

        ' >>>>>> Adapted part
        With wbD.Sheets("PIVOT")
            With .Range("AM14", .Cells(.Rows.count, 1).End(xlUp)) '<--| reference its column "A:AM" range from row 14 down to column "A" last not empty row
                .AutoFilter Field:=36, Criteria1:="<>closed" '<--| filter referenced range on its 36th column (i.e. column "AJ") with values different from "closed"
                If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then
                    .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy
                    Sheets("Template").Range("A" & Rows.count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    Application.CutCopyMode = False
                End If
            End With
            .AutoFilterMode = False
        End With
        ' >>>>>>

【讨论】:

  • 这个比我的好多了,用这个!
  • @TimWilkinson,感谢您的认可!。实际上AutoFilter() 比遍历单元格要快得多。
  • 您好 user3598756!我使用了你的编码,但它给出了 bakc 错误消息,说 400。你发布的一切都应该没问题,我也检查了参考资料,但无法弄清楚问题可能是什么。
  • 我很佩服你的 VBA 知识!感谢您的帮助!我怎样才能在这里为你们两个背书?
  • 在弹出的窗口中只显示“400”。
【解决方案2】:

如果您需要检查每一行的某个单元格值,请使用以下内容。这将逐行循环检查未显示“已关闭”的行。

Dim sFolder As String, sFile As String, wbD As Workbook, wbS As Workbook
Dim lastRowS As Integer, lastRowD As Integer
Application.ScreenUpdating = False
Set wbS = ThisWorkbook
sFolder = wbS.Path & "\"
sFile = Dir(sFolder

lastRowS = Sheets("Template").Range("A" & Rows.Count).End(xlUp).Row + 1

Do While sFile <> ""

If sFile <> wbS.Name Then
    Set wbD = Workbooks.Open(sFolder & sFile) 'open the file; add condition to

    lastRowD = wbD.Sheets("PIVOT").Range("A" & Rows.Count).End(xlUp).Row

    For i = 15 To lastRowD
        If Cells(i, 3) <> "Closed" Then 'change 3 to whatever column number has Closed in
            wbD.Sheets("PIVOT").Rows(i).EntireRow.Copy
            wbS.Sheets("Template").Cells(lastRowS, 1).PasteSpecial xlPasteValues
            lastRowS = lastRowS + 1
        End If
    Next i
    Application.CutCopyMode = False
     ' >>>>>>
    wbD.Close savechanges:=False 'close without saving
End If

sFile = Dir 'next file
Loop
Application.ScreenUpdating = True
End Sub

【讨论】:

  • 它很酷。唯一不能正常工作的是“封闭”部分检查器。无论 IF 功能如何,它都会返回删除先前未“关闭”的 cmets 的所有内容。在我问你之前,我已经尽一切努力让它发挥作用。 :(
  • 您好 TIm,很抱歉没有回复您。我生病了,然后我就忙于工作。但这是我在宏中使用的代码,它运行良好。另一个解决方案也不错,但我的知识水平只对这个有好处,所以如果另一个解决方案出现问题,我什至无法修改它。但感谢 user3598756 的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2018-08-06
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多