簡體   English   中英

在工作簿之間復制工作表並覆蓋當前工作表

[英]Copy worksheet between workbooks and overwrite the current worksheet

我編寫了VBA代碼,用於打開目標工作簿,復制其中一個工作表,然后將其粘貼到當前工作簿中。

當我第二次或第三次運行它時...而不是覆蓋當前工作表,而是創建一個全新的工作表。

例如:工作表稱為“數據”,第一次是傳輸“數據”,第二次是“ data(2)”。

我還有另一個工作表,該工作表使用VLOOKUP函數查看此數據工作表的某些單元格,因此具有正確的名稱“數據”至關重要。

我曾考慮過在運行宏之前刪除當前(數據)文件,但是如果發生崩潰而丟失工作表怎么辦? 有更好的解決方案嗎?

注意:我正在從主工作簿運行宏,以獲取要從外部工作簿復制工作表。

Sub UpdateT()

    Dim wb As Workbook
    Dim aw As Workbook

    'Open 2nd Workbook
    Set aw = Application.ActiveWorkbook
    Set wb = Workbooks.Open(Filename:="C:\Users\yilmadu00\Desktop\T.xlsx")

    'Copy To Different Workbook
    wb.Sheets("data").Copy After:=aw.Sheets("Data1")

    'Close 2nd Workbook
    aw.Save
    wb.Close

    aw.Sheets("data").Visible = False
    ActiveWorkbook.Protect ("Password")

End Sub

檢查工作表是否存在的函數(貸記@ScottCrainer):

Function SheetExists(ws As String)
    SheetExists = Not IsError(Application.Evaluate(ws & "!A1"))
End Function
注意:

它的確存在問題:如果工作表上的A1包含錯誤,它將返回假陰性。

ActiveWorkbook與ThisWorkbook,工作表與工作表

您在代碼中使用了“ Activeworkbook”和“ Sheet(s)”,所以我一直在玩。

盡管您可以擁有第三本工作簿來運行代碼,但我猜您是從“ ActiveWorkbook ”中的模塊運行代碼的。 如果這是真的,那么使用“ ThisWorkbook ”代替它總是引用包含代碼(模塊)的工作簿會更正確 ,以避免在第三個工作簿上意外地運行代碼。

工作表是指工作表和統計表 ,再次,我猜想此代碼中不涉及工作表 ,因此使用“ 工作表 ”代替“ 工作表 ”會更正確)”。

Sub UpdateT()

  Const cStrPath As String = "C:\Users\yilmadu00\Desktop\T.xlsx"
  Const cStrAfter As String = "Data1"
  Const cStrName As String = "data"
  Const cStrOld As String = "data_old"

  Dim aw As Workbook '1st workbook, 'ActiveWorkbook'
  Dim wb As Workbook '2nd workbook
  Dim oWs As Sheet 'Each sheet in workbook 'aw'
  Dim blnFound As Boolean 'True if sheet(cStrName) was found

  Set aw = ActiveWorkbook 'Create a reference to the ActiveWorkbook
  Set wb = Workbooks.Open(Filename:=cStrPath) 'Open 2nd Workbook

  With aw
  '  .UnProtect ("Password")
    'Check each sheet in workbook 'aw'.
    For Each oWs In aw.Sheets
      With oWs
        'Check if there already is a sheet with the name 'cStrName'.
        If .Name = cStrName Then
          .Name = cStrOld 'Rename the sheet.
          blnFound = True 'Sheet(cStrName) was found.
          Exit For 'Immediately stop checking, there can only be one.
        End If
      End With
    Next
  End With

  With wb
    'Copy sheet from 2nd workbook ('wb') to workbook 'wa'.
    .Sheets(cStrName).Copy After:=aw.Sheets(cStrAfter)
    .Close 'Close 2nd workbook ('wb').
  End With

  With aw
    With Application
      If blnFound = True Then 'Sheet(cStrName) was found.
        .DisplayAlerts = False 'Disable showing delete message.
        aw.Sheets(cStrOld).Delete 'Delete old version of sheet.
        .DisplayAlerts = True
      End If
    End With
    .Sheets(cStrName).Visible = False 'Hide sheet named 'cStrName'
    .Protect ("Password")
    .Save 'Save workbook 'aw'.
  End With

End Sub

下次您要對工作表執行某些操作時,必須取消保護它,否則代碼將失敗。 隱藏的工作表可以毫無問題地刪除

暫無
暫無

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

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