<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[用VBA抽取一个文件夹中所有Excel并合并成一个Sheet]]></title><description><![CDATA[<p dir="auto">应群里要求，给大家提供相关代码。可以把文件夹中所有Excel文件里面所有Tab的数据（不包含格式）合并成一个Excel文件。</p>
<p dir="auto">注意，这里我们支持xlsx, xls, xlsb, xlsm；但如果是xlsb和xlsm，最好把这个文件夹设置成信任路径"Trusted Location"，否则会弹出是否启用宏的警告。</p>
<p dir="auto">话不多说，来上代码</p>
<pre><code>Sub Copyfrom_all_excel_files_in_folder()

Dim FoldPath As String
Dim DialogBox As FileDialog
Dim FileOpen As String
Dim cntrows As Long
Dim rng As Variant
On Error Resume Next

'这里会弹出一个对话框让我们选择文件夹'

Set DialogBox = Application.FileDialog(msoFileDialogFolderPicker)
If DialogBox.Show = -1 Then
FoldPath = DialogBox.SelectedItems(1)
End If

Application.ScreenUpdating = False
Application.DisplayAlerts = False
If FoldPath = "" Then Exit Sub
FileOpen = Dir(FoldPath &amp; "\*.xls*")
Do While FileOpen &lt;&gt; ""

'打开excel'
Set wbResults = Workbooks.Open(FoldPath &amp; "\" &amp; FileOpen, UpdateLinks:=0, ReadOnly:=True)
      
      For Each st In wbResults.Worksheets '循坏过每个Sheet'
        rng = st.UsedRange.Value
        '把rng粘贴到我们output这个worksheet
        ThisWorkbook.Worksheets("Output").Range("A1").Offset(cntrows, 0).Resize(UBound(rng, 1), UBound(rng, 2)).Value = rng
        cntrows = cntrows + UBound(rng, 1)
    Next
wbResults.Close
FileOpen = Dir
Loop


Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub


</code></pre>
]]></description><link>https://actuarygarden.com/topic/226/用vba抽取一个文件夹中所有excel并合并成一个sheet</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 21:42:17 GMT</lastBuildDate><atom:link href="https://actuarygarden.com/topic/226.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Jun 2022 05:28:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 用VBA抽取一个文件夹中所有Excel并合并成一个Sheet on Thu, 23 Jun 2022 14:58:21 GMT]]></title><description><![CDATA[<p dir="auto">应群里要求，给大家提供相关代码。可以把文件夹中所有Excel文件里面所有Tab的数据（不包含格式）合并成一个Excel文件。</p>
<p dir="auto">注意，这里我们支持xlsx, xls, xlsb, xlsm；但如果是xlsb和xlsm，最好把这个文件夹设置成信任路径"Trusted Location"，否则会弹出是否启用宏的警告。</p>
<p dir="auto">话不多说，来上代码</p>
<pre><code>Sub Copyfrom_all_excel_files_in_folder()

Dim FoldPath As String
Dim DialogBox As FileDialog
Dim FileOpen As String
Dim cntrows As Long
Dim rng As Variant
On Error Resume Next

'这里会弹出一个对话框让我们选择文件夹'

Set DialogBox = Application.FileDialog(msoFileDialogFolderPicker)
If DialogBox.Show = -1 Then
FoldPath = DialogBox.SelectedItems(1)
End If

Application.ScreenUpdating = False
Application.DisplayAlerts = False
If FoldPath = "" Then Exit Sub
FileOpen = Dir(FoldPath &amp; "\*.xls*")
Do While FileOpen &lt;&gt; ""

'打开excel'
Set wbResults = Workbooks.Open(FoldPath &amp; "\" &amp; FileOpen, UpdateLinks:=0, ReadOnly:=True)
      
      For Each st In wbResults.Worksheets '循坏过每个Sheet'
        rng = st.UsedRange.Value
        '把rng粘贴到我们output这个worksheet
        ThisWorkbook.Worksheets("Output").Range("A1").Offset(cntrows, 0).Resize(UBound(rng, 1), UBound(rng, 2)).Value = rng
        cntrows = cntrows + UBound(rng, 1)
    Next
wbResults.Close
FileOpen = Dir
Loop


Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub


</code></pre>
]]></description><link>https://actuarygarden.com/post/485</link><guid isPermaLink="true">https://actuarygarden.com/post/485</guid><dc:creator><![CDATA[Mengkelyu]]></dc:creator><pubDate>Thu, 23 Jun 2022 14:58:21 GMT</pubDate></item><item><title><![CDATA[Reply to 用VBA抽取一个文件夹中所有Excel并合并成一个Sheet on Thu, 23 Jun 2022 05:30:52 GMT]]></title><description><![CDATA[<p dir="auto"><a href="/assets/uploads/files/1655962241797-copy_to_excel.zip">Copy_to_excel.zip</a><br />
示例附上</p>
]]></description><link>https://actuarygarden.com/post/486</link><guid isPermaLink="true">https://actuarygarden.com/post/486</guid><dc:creator><![CDATA[Mengkelyu]]></dc:creator><pubDate>Thu, 23 Jun 2022 05:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to 用VBA抽取一个文件夹中所有Excel并合并成一个Sheet on Thu, 23 Jun 2022 15:03:29 GMT]]></title><description><![CDATA[<h1>Enhancement 1: 如何指定要复制的工作表名称和输出的位置</h1>
<p dir="auto">例如我们的每个Excel里面有三个工作表，我们要输出到对应本工作薄里面的三个工作表中；<br />
对应关系如下：<br />
<img src="/assets/uploads/files/1655996056868-1919e5f7-adcb-41ed-a0fc-15fbf1cf44c1-image.png" alt="1919e5f7-adcb-41ed-a0fc-15fbf1cf44c1-image.png" class="img-responsive img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1655996604795-ae71651f-d84a-4b05-be81-5cd1bac96da2-image.png" alt="ae71651f-d84a-4b05-be81-5cd1bac96da2-image.png" class="img-responsive img-markdown" /></p>
<p dir="auto">同时，需要保证Tab Name和To Tab的输入是可变的，允许增加对应关系，允许减少对应关系。</p>
]]></description><link>https://actuarygarden.com/post/487</link><guid isPermaLink="true">https://actuarygarden.com/post/487</guid><dc:creator><![CDATA[Mengkelyu]]></dc:creator><pubDate>Thu, 23 Jun 2022 15:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to 用VBA抽取一个文件夹中所有Excel并合并成一个Sheet on Thu, 23 Jun 2022 15:22:28 GMT]]></title><description><![CDATA[<p dir="auto">第一步我们要把这个读入工作表名和读出工作表名的map读入宏。可以这么写。这里是选择了Parameters这个工作表里面"A1"按住Ctrl+A选中的区域，并通过Offset向下移一格，然后用resize减少一行；这样可以去掉读入的表标题。</p>
<pre><code>Dim mapping As Variant
With ThisWorkbook.Worksheets("Parameters").Range("A1").CurrentRegion
    mapping = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Value
End With
</code></pre>
<p dir="auto">那么我们就把下面这个表储存到mapping这个变量里面啦<br />
<img src="/assets/uploads/files/1655997496459-b45ebe04-f81a-4425-8caf-a0a73ca6b0ac-image.png" alt="b45ebe04-f81a-4425-8caf-a0a73ca6b0ac-image.png" class="img-responsive img-markdown" /></p>
<p dir="auto">然后我们定义一个变量用来储存每个读出的数据总数，这里我们需要三组变量；因此这应该是一个有三个数字的数组。</p>
<pre><code>Dim cntrows As Variant
ReDim cntrows(UBound(mapping, 1))
</code></pre>
<p dir="auto">最后一步就是循环每个工作薄里面的每个工作表，如果这个工作表名能和Map里面的第一列任意一个匹配，那么它就会被输出到Map里面第二列对应的工作表内。</p>
<pre><code>For Each st In wbResults.Worksheets
        For i = 1 To UBound(mapping, 1)
              If st.Name = mapping(i, 1) Then
              rng = st.UsedRange.Value
              ThisWorkbook.Worksheets(mapping(i, 2)).Range("A1").Offset(cntrows(i), 0).Resize(UBound(rng, 1), UBound(rng, 2)).Value = rng
              cntrows(i) = cntrows(i) + UBound(rng, 1)
              End If
        Next i
</code></pre>
<p dir="auto">完整代码</p>
<pre><code>Sub Copyfrom_all_excel_files_in_folder()

Dim FoldPath As String
Dim DialogBox As FileDialog
Dim FileOpen As String

Dim rng As Variant
On Error Resume Next
Set DialogBox = Application.FileDialog(msoFileDialogFolderPicker)
If DialogBox.Show = -1 Then
FoldPath = DialogBox.SelectedItems(1)
End If

Application.ScreenUpdating = False
Application.DisplayAlerts = False

'read the mapping to the macro

Dim mapping As Variant
With ThisWorkbook.Worksheets("Parameters").Range("A1").CurrentRegion
    mapping = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Value
End With

Dim cntrows As Variant
ReDim cntrows(UBound(mapping, 1))

Dim i As Integer

' If the output sheet does not exist create it
For i = 1 To UBound(mapping, 2)
    If WorksheetExists(mapping(i, 2)) = False Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = mapping(i, 2)
Next i


 On Error GoTo 0
If FoldPath = "" Then Exit Sub
FileOpen = Dir(FoldPath &amp; "\*.xls*")
Do While FileOpen &lt;&gt; ""
Set wbResults = Workbooks.Open(FoldPath &amp; "\" &amp; FileOpen, UpdateLinks:=0, ReadOnly:=True)
      
      For Each st In wbResults.Worksheets
        For i = 1 To UBound(mapping, 1)
              If st.Name = mapping(i, 1) Then
              rng = st.UsedRange.Value
              ThisWorkbook.Worksheets(mapping(i, 2)).Range("A1").Offset(cntrows(i), 0).Resize(UBound(rng, 1), UBound(rng, 2)).Value = rng
              cntrows(i) = cntrows(i) + UBound(rng, 1)
              End If
        Next i
    Next
wbResults.Close
FileOpen = Dir
Loop


Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
Function WorksheetExists(ByVal shtName As String, Optional ByVal wb As Workbook) As Boolean
    Dim sht As Worksheet

    If wb Is Nothing Then Set wb = ThisWorkbook
    On Error Resume Next
    Set sht = wb.Sheets(shtName)
    On Error GoTo 0
    WorksheetExists = Not sht Is Nothing
End Function


</code></pre>
<p dir="auto"><a href="/assets/uploads/files/1655997742385-copy_to_excel-v2.zip">Copy_to_excel - V2.zip</a></p>
]]></description><link>https://actuarygarden.com/post/488</link><guid isPermaLink="true">https://actuarygarden.com/post/488</guid><dc:creator><![CDATA[Mengkelyu]]></dc:creator><pubDate>Thu, 23 Jun 2022 15:22:28 GMT</pubDate></item></channel></rss>