【问题标题】:Loop folder and check if Excel file name ends with worksheet name, then copy worksheet循环文件夹并检查 Excel 文件名是否以工作表名称结尾,然后复制工作表
【发布时间】:2020-11-11 15:39:29
【问题描述】:

我需要一些帮助和想法。

我有一个文件夹,比如说这个C:\Users\ Me \Desktop\Test Dir\Files\ 在这个文件夹中,我有几个工作簿和我的主工作簿,名为 Test.xlsm

在我的主工作簿中,我有几张不同名称的工作表 AB11、AB12、BC13 等

我想构建一个代码,将表格 AB1 复制并移动到名称以 AB1 结尾(或可能包含此单词)的文件夹中的 excel 文件中。

然后循环将继续。如果下一个 Excel 文件以 AB2 结尾,则从我的主工作簿中复制并移动工作表 AB2。

有什么想法吗?到目前为止我所拥有的是:

但是,我的文件找不到,以“AB11”结尾的文件


Dim myPath As String
Dim myFileAB11 As Workbook
Dim wb As Workbook

myPath = "C:\Users\Me\Desktop\Test\Split "

filenamefilters = Array("AB11.xlsx", "AB12.xlsx", "BC13.xlsx", "BC14.xlsx")
myFileAB11 = Dir(myPath & "*AB115*.xls", vbNormal)
myFileAB12 = Dir(myPath & "*AB12*.xls", vbNormal)
myFileBC13 = Dir(myPath & "*BC13*.xls", vbNormal)
myFileBC14 = Dir(myPath & "*BC14*.xls", vbNormal)

Workbooks.Open (Dir(myPath & "*GB55.xlsx", vbNormal))

Workbooks(myFileAB11).Activate
Sheets.Add
ActiveSheet.Name = "AB11"

Workbooks.Open Filename:="C:\Users\Me\Desktop\Test\Test.xlsm"
Sheets(AB11).Copy Before = Workbooks(myFileAB11).Sheets(Sheets.Count)
ActiveSheet.Name = "AB11"



End Sub

【问题讨论】:

  • 我的想法是:将你的项目拆分成更小的部分。对每个部分进行一些研究。尝试一些东西并返回您的尝试(您的代码)并向它提出问题,包括。告诉你哪里出了问题或你卡在哪里:见No attempt was madeHow to Ask
  • 尝试搜索如何使用 Dir 以及如何将数据从一个工作簿传输到另一个工作簿,这两者都有很多欺骗目标。

标签: excel vba


【解决方案1】:

我不喜欢人们更愿意用“努力”的信息来回应,而不是来自实际解决了这些问题的人的一些实际建议。这是在两个工作簿之间移动工作表的一些有用代码。我解释了每一行的作用。

Dim SourceWorkbook As Workbook, CurrentWorkbook As Workbook 'sets up objects references for the workbook files.

Set CurrentWorkbook = ThisWorkbook 'ThisWorkbook is a keyword that references the book this code is running on
Set SourceWorkbook = Workbooks.Open("D:\work files\Warehouse inventory system\Input file.xlsx") 'this will open the file and assign the reference to it to SourceWorkbook

SourceWorkbook.Sheets("Sheet1").Copy After:=CurrentWorkbook.Sheets("Main") 'this code section opens the file, imports the sheet
SourceWorkbook.Close 'Closes the second workbook, recommended to free up resources

Sheets("Sheet1").Activate 'this makes the newly pasted sheet the active sheet
Sheets("Sheet1").Cells.Select 'this will select all cells on that sheet, it is not nessacary to activate the sheet to select the cells
Selection.Copy 'copys the selection to the clipboard
Sheets("Main").Select 'selects the sheet named Main
Cells(1, 1).Select 'selects the first cell in the sheet
ActiveSheet.Paste 'pastes in the data from the other sheet

Application.DisplayAlerts = False 'turns off alert messages before deleting to remove the "are you sure" message
Sheets("Sheet1").Delete 'deletes the sheet named "Sheet1"
Application.DisplayAlerts = True 'turns on the alert messages after the delete
Sheets.Add(After:=Sheets("Main")).name = "Barcode" 'adds a new sheet and names it Barcode
Sheets("Main").Select 'selects the Main sheet

您当然必须弄清楚如何修改此代码以使其适合您的情况。但它应该足以让你开始。

【讨论】:

  • 不要使用.Select。您可能会从阅读How to avoid using Select in Excel VBA 中受益。我们没有要求“更加努力”,我们只是要求“尝试全部”,否则只是要求其他人来完成这项工作。
  • @Scott Cannon:原因主要是因为 SO 的目的是寻找问题的答案,而不是一次又一次地问同一个问题。见meta.stackoverflow.com/a/261593/7599798。但是现在 SO 更像其他所有论坛,有人要代码,其他人的回答或多或少好,没有人会使用给定的答案来解决类似的问题。
  • 请去掉所有的ActivateSelect-statements。并对 SheetsCells 等对象进行限定。永远不要依赖Activesheet
  • @ScottCannon 问题是这不是,也不是打算成为一个教程网站。如果你需要学习编程,这里有很多资源。如果您需要一般帮助,reddit 可能是您最好的选择。如果您需要完整、快速且符合您的确切规格的东西,那么有很多人愿意为此付费。 SO 用于特定的编程相关问题。它看起来很苛刻,但并非如此,有些东西不适合 SO。 (在 OP 编辑​​之后,它的状态肯定更好。)
  • 教程和代码调试的区别在于语义。您仍在解释如何完成一项任务,您的问题是您不喜欢这个人从您认为知识库太低而提出的问题太宽泛。它的核心是一个完全主观的论点。有人问其他人将如何解决问题并没有错,有时您卡在上面的代码是在找出可用工具的限制,有时是在找出可用的工具。 Google 不能仅提供洞察力参考。
猜你喜欢
  • 2017-07-09
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多