excel - Excel 中的宏将两个工作簿中的特定范围复制/粘贴到新工作簿中(更多详细信息在里面)
问题描述
我也许可以通过例子更好地描述我想要的东西。我有两个 Excel 工作簿。我想基本上将一个复制到一个新工作簿(基本复制/粘贴所有内容),然后复制另一个工作簿的特定部分并将其粘贴到新工作簿的末尾。
因此,有两个输入工作簿和一个输出工作簿。这就是我希望宏的结构:应该有一个包含宏(按钮)的“主”工作簿,其中两个输入工作簿由它们的文件夹路径指定,并且有一个新组合的输出文件夹工作簿(请参阅最后的示例,了解我希望如何指定它)。第一个输入工作簿应该复制其中的所有内容。请注意,这应该是动态的,并且不应指定特定的单元格范围(因为单元格范围可能会有所不同)。第一个输入工作簿的示例如下所示:
一切都要被复制。我认为这不是什么大问题。棘手的部分(对我来说)是然后获取第二个输入工作簿的特定部分并将其复制/粘贴到第一个输入工作簿的末尾。我发现这很困难,因为第二个输入文件夹应该由特定的标题选择,然后应该复制该标题下的所有内容(即选择标题,然后按 CTRL+SHIFT+DOWN)。例如:
这应该以“Maturity[5,)”(以黄色突出显示)作为标题,然后选择其下的所有内容,复制它,然后将其粘贴到第一个输入工作簿末尾的匹配标题(第二行,即第 8 行,顺便说一下,这是所有工作簿的格式:第 1:6 行是空的,但应该保持这样)。
希望你还在我身边。完成此操作后,新的(组合的)工作簿应如下所示:
即使走到这一步也会非常有帮助。但是还有一个问题。通过复制整个第一个输入工作簿,有一个额外的标题(第 7 行;上图中的“L-OAS”)。此标题需要在新组合工作簿的范围内合并并居中,包括添加的第二个输入工作簿部分:
就是这样。一旦该标题已合并并在新工作簿中居中,宏应将新工作簿保存在指定的输出路径中。
要指定的输入/输出路径示例:
编辑:下面是我在做第 (1) 部分的尝试——也就是说,只是复制和粘贴第一个工作簿。
Sub Combine()
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim wsSource As Worksheet, ws As Worksheet
Application.ScreenUpdating = False
shtOutput1.Visible = xlSheetVisible
shtOutput1.Cells.Clear
Set outputRange = shtOutput1.Cells(1, 1)
Set wb1 = Workbooks.Open(Range("USDInputFile1").Value, False, True)
For Each wsSource In wb1.Worksheets
If InStr(wsSource.Cells(1, 1).Value, "Bloomberg") > 0 Then
With wsSource
wsSource.Copy shtOutput1
End With
End If
Next
wb1.Close False
Application.ScreenUpdating = True
With Workbooks.Add
shtOutput1.Copy .Worksheets(1)
Application.DisplayAlerts = False
For Each ws In .Worksheets
Next ws
Application.DisplayAlerts = True
.Close True, ThisWorkbook.Names("OutputFolder").RefersToRange.Value + Application.PathSeparator + "USD Combined Output.xlsx"
End With
shtOutput1.Cells.Clear
shtOutput1.Visible = xlSheetHidden
End Sub
“shtOutput1”是主工作簿中的工作表(宏按钮和文件路径所在的位置
“USDInputFile1”是主工作簿中的一个命名单元格,它指向第一个输入工作簿的文件路径(即“wb1”-“wb2”将是第二个输入工作簿)
解决方案
让我们退后一步,从可扩展性的角度来看这个问题。
你不想要一个按钮来组合东西,因为有很多地方会出错,而且有很多保姆你必须明智地做 VBA 并且在按下按钮的顶部是一个按钮...... ppffft 那是工作......
不,您想要的是无缝更新,其中添加到 Maturity 5 或 Maturity 10 的任何内容都会自动更新到您的输出中,让它们像 Microsoft 预期的那样自行增长而不受影响。
首先让我们看一下结构,有一些,它们有标题,但它们不是表格,它们都有一个共同的 ID 日期,因此更改最底部的标题以确保它们有意义并且在所有迭代中是统一的、唯一的和一致的每张桌子。因此,无论您拥有多少 Mat5_Total 或 Mat10_Total 等。
插入选项卡 - 表格 - 给他们正确的速记表格名称,如 tblMat10 和 tblMat5
让我们打开一个新文件并使用功能区中的数据选项卡将它们放入 - 外部数据 - 转换 - 关闭负载上的小向下箭头,您只希望数据模型中的这个不加载到电子表格所以检查仅创建连接并添加此数据到数据模型。取消选中其他所有内容,无需弄乱您的输出。
重复 3,但 Mat10 仅当您关闭负载而不是向右看并点击Merge Queries上的向下箭头时- 作为新 Query 。
现在将弹出一个新窗口 选择两个查询并在他们的日期加入它们作为 ID
现在您可以关闭并加载到工作表。
试一试,将一些新数据添加到 Mat5 或 Mat10 并刷新您新创建的链接表。
这适用于所有类型的数据,您可以使用股票、股票、CSV、ODBC 连接等各种数据连接进行试用。您所需要的只是一个格式正确的基础设施,也就是格式正确的表格!
这种方法的一个好处是,如果表不断发展,修改 Power Query 很容易。只需记住进入您的连接设置并选择打开时刷新,如果您愿意将其设置为每 5 分钟刷新一次。
7 可选奖励 - 一旦制作了这个输出表,它将与任何外部程序兼容,因为它是一个格式正确的输出表。
推荐阅读
- ios - 如何知道 iDevice 的当前方向
- javascript - 如何获得每行值总和的总列
- javascript - 用户写作时,如何将文本光标保持在右侧的 html 输入字段中?
- sql - 如何添加日期并保持其格式?
- salt-stack - SaltStack:仅包含文件的一种状态
- python - 检测元素是否在python列表中的两个相等元素之间
- javascript - 如何在 JavaScript 中将文本转换为语音音频到音频数据数组
- ruby - 在 Rspec 测试中设置控制器参数
- javascript - 如何禁用 Highcharts 纵坐标中的“k”显示?
- oracle - 从 Oracle 中的两个公用表中获取剩余行