簡體   English   中英

在Excel中使用VBA合並工作簿並重命名導入的工作表

[英]Combine Workbooks and Rename imported worksheet using VBA in Excel

我正在嘗試將特定目錄中的所有XLS文件導入一個工作簿。 我已經嘗試了幾個代碼源,而最近的源代碼是下面的代碼(無論我嘗試了什么,其余所有在關閉導入的工作簿時都會抱怨)。

我現在要做的就是從合並的單元格(C7和D7)中獲取文本,然后將新工作表重命名為該文本。 (如果有任何影響,則在單元格名稱上方會有回車符。由於源文件是由外部團隊制作的,因此我無法控制它們)。

恐怕我幾乎沒有能力進行任何形式的編碼,但是我通常可以從其他來源讀取代碼,但是我在這里遇到了麻煩。 我設法將其重命名為源文件名,但我希望從單元格文本中獲取它。

干杯!

Sub Merge2MultiSheets()
Dim wbDst As Workbook
Dim wbSrc As Workbook
Dim wsSrc As Worksheet
Dim MyPath As String
Dim strFilename As String

    Application.DisplayAlerts = False
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    MyPath = "C:\Temp\" ' change to suit
    Set wbDst = Workbooks.Add(xlWBATWorksheet)
    strFilename = Dir(MyPath & "\*.xls", vbNormal)

    If Len(strFilename) = 0 Then Exit Sub

    Do Until strFilename = ""

            Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename)

            Set wsSrc = wbSrc.Worksheets(1)

            wsSrc.Copy After:=wbDst.Worksheets(wbDst.Worksheets.Count)

            ActiveSheet.Name = wsSrc.Range("C7").Value

            wbSrc.Close False

        strFilename = Dir()

    Loop
    wbDst.Worksheets(1).Delete

    Application.DisplayAlerts = True
    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub
  • 我將更改此行:
    ActiveSheet.Name = wsSrc.Range("C7").Value
    至:
    wbDst.Worksheets(wbDst.Worksheets.Count).Name = wsSrc.Range("C7")
    這將確保您在目標工作簿中而不是在源工作簿中命名工作表,而最終使用ActiveSheet可能會命名工作表

  • 關於文件順序的注釋中的問題:
    (順便說一句-您應該編輯您的信息並將問題放在其中,評論可能會被刪除)
    該順序由操作系統保留文件的“自然”排序順序確定。 我還沒有找到可以添加到Dir()命令中以對輸入進行排序的標志。
    如果您需要按名稱順序處理它們,我建議:

    1. wbDst創建wbDst
    2. 使用Dir()循環遍歷所有文件,並將它們放在Range(A1:An)
      • 例如,將第一個文件名放在Range(“ A1”)中,將第二個文件名放在Range(“ A2”)中,依此類推
    3. Range(A1:An)排序,以便它們按所需順序排列
    4. 循環遍歷已排序的Range()以進行實際處理
    5. 完成處理后,從wbDst刪除wbDst
  • 現在,注釋掉:
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    這些是代碼中很棒的東西,但要等到一切正常為止

  • 我建議更改:
    If Len(strFilename) = 0 Then Exit Sub

    If Len(strFilename) > 0 Then
    Do Until...
    Loop
    因為,如果您最初對目錄的讀取沒有任何文件,那么在循環之后您再也不會得到清理代碼。 目前,這里並沒有真正關鍵的東西,但是您可以在將來修改代碼,或者將其用作需要關鍵清理的其他代碼的模型,這是一個好習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM