0

我对在 Excel 2010 上使用 VBA 和宏几乎是全新的。我对宏编码知之甚少,而且我一天前才开始尝试学习它。

我被要求创建一个宏,它只复制 12 个工作簿中的数据并将其粘贴到一个空白工作簿上(它们每个都有 1 个工作表,每个工作簿上的数据从单元格 A3 开始,同时延伸到 S 列(数据量在床单上有所不同))。

   NOTE: When I mean "ONLY the data," the cells that I want to be copied include the blank cells that are in between the first and last parts of the data.

1) 将数据从一个工作簿复制到另一个工作簿时,您是否必须指定要复制的单元格?或者有没有办法指定数据在工作表上的结束位置,然后复制所有数据?如果是这样,那么有人可以告诉我该怎么做吗?这样做的原因是因为宏将每周使用一次。

2)有人可以简单地帮我开发这个宏吗?帮助将不胜感激:)

   Some Extra Notes:
   - The Workbooks are named "Status by offering ID [1-12]

再次感谢!

4

1 回答 1

2

Ripster 提供了一个示例,说明您的规范中缺少信息。

Santosh 推荐了一个非常简洁的工具,但我对您的问题的阅读是您的知识还没有达到使用工具的水平。

我推断这是一个工作问题,尽管您对 VBA 的了解为零,但您的老板要求您编写此宏。这似乎是一个日益严重的问题:您可以在网上找到任何问题的答案,那么为什么还要费心培训人呢。即使您制定了完整的需求规范,我也怀疑有人会给您完整的解决方案。如果他们确实提供了一个完整的解决方案,那么它将无助于下一个需求。所以我要把你的问题分解成你可以在网上问的问题类型。

每周您会获得 12 个源工作簿,并通过整合来自源工作簿的数据来创建摘要。您是用新的摘要覆盖前一周的摘要还是要保存所有摘要?保留所有摘要不会增加太多复杂性,但您需要决定您想要什么。

如果你放弃以前的摘要,宏可以在 Summary.xlxm 中,比如说。如果您保存摘要,则宏将需要位于其自己的工作簿中,例如 Macro.xlsm,并且它将每周创建一个不同的摘要工作簿,例如 SummaryYYWW.xlsm。

如果您搜索“打开工作簿”和“创建工作簿”,您将找到有关一个工作簿中的宏如何打开其他工作簿和创建新工作簿的说明。

源工作簿在哪里?它们是否在每周覆盖的 CurrentData 文件夹中?它们是否在 Week1301、Week1302、Week1303 等文件夹中?它们是否在文件夹 NewData 中,宏是在处理后将它们移动到文件夹 Week1301、Week1302、Week1303 等?所有这些都是选项,但我建议您首先将源工作簿和摘要工作簿移入/移出便于宏使用的文件夹。

查找“ThisWorkbook”和“ActiveWorkbook”。简而言之:“ThisWorkbook”是包含宏的工作簿,“ActiveWorkbook”是最近打开的工作簿。

查找工作簿属性“路径”。例如,ThisWorkbook.Path 为您提供包含 ThisWorkbook 的文件夹的名称。查找工作簿属性“名称”。

如果源工作簿始终具有相同的名称,您可以将名称硬编码到宏中。我不推荐这个。查找函数“Dir”。

我希望以上内容已经让您开始将整个问题分解为各个组成部分。

网络上有许多不同的 VBA 教程。尝试几个,然后选择一个你喜欢的。

“Debug.Print xxx”将 xxx 的值输出到即时窗口。这在您开始时会非常有帮助。试试这个作为你的第一个宏:

Option Explicit
Sub First()

  Dim FilenameCrnt As String
  Dim WbookCrnt As Workbook

  Debug.Print ThisWorkbook.Name
  Debug.Print ThisWorkbook.Path

  FilenameCrnt = Dir$(ThisWorkbook.Path & "\*.*")

  Do While FilenameCrnt <> ""
    Debug.Print FilenameCrnt
    If FilenameCrnt = ThisWorkbook.Name Then
      With ThisWorkbook
        Debug.Print "  Used range: " & .Worksheets(1).UsedRange.Address
      End With
    Else
      If LCase(Right(FilenameCrnt, 3)) = "xls" Or _
         LCase(Right(FilenameCrnt, 4)) = "xlsm" Or _
         LCase(Right(FilenameCrnt, 4)) = "xlsx" Then
        WbookCrnt = Workbooks.Open(ThisWorkbook.Path & "\" & FilenameCrnt)
        With WbookCrnt
          Debug.Print "  Used range: " & .Worksheets(1).UsedRange.Address
        End With
        WbookCrnt.Close
        WbookCrnt = Nothing       ' Free resource
      End If
    End If
    FilenameCrnt = Dir$
  Loop

End Sub

祝你好运

于 2013-06-11T10:53:27.370 回答