【问题标题】:Creating a backup copy of Active Sheet using Excel vba使用 Excel vba 创建活动工作表的备份副本
【发布时间】:2020-08-21 08:36:39
【问题描述】:

我需要将活动工作表的备份副本创建到新工作簿中。 这样创建的新工作簿中就只有 Active Sheet(没有宏,没有 vba)

我需要它发生在“打开后”我的工作表事件中

执行以下操作:

     Private Sub Workbook_Open()
     
     ActiveWorkbook.SaveCopyAs "E:\Projects\FolderName\FileName.xlsm"
                         
     End Sub

它复制了整个工作簿,其中包含所有 vba 代码和宏,而不是我需要的。

有没有办法只复制活动工作表?

理想情况下,我希望有单元格引用(我将文件路径存储在不同的工作表中,在名为“BackupPath”的单独单元格中)。

【问题讨论】:

  • “BackupPath”是一个命名范围吗?如果不需要宏,则应将工作簿另存为 xlsx。您的命名范围是否也包含扩展名?
  • @FaneDuru “BackupPath”是一个命名范围吗? - 这是一个命名单元,我在其中存储导出文件的路径。理想情况下,我希望引用该单元格,而不是在 vba 中键入路径,正如我在帖子中所展示的那样。关于第二部分 - 我尝试另存为 xlsx - 打开保存的文件时收到错误消息 - “Excel无法打开文件,因为扩展名或格式无效”并且无法打开它......

标签: excel vba backup worksheet


【解决方案1】:

请尝试下一个代码:

Private Sub Workbook_Open()
  Dim wb As Workbook, shC As Worksheet
  Dim sh As Worksheet, i As Long, strBackup As String, arr As Variant
  
  Set shC = ThisWorkbook.ActiveSheet 'this should be clear...
  strBackup = Range(ThisWorkbook.Names("BackupPath")).Value 'extract the string from the named range
  Set wb = Workbooks.Add             'open a new workbook
   shC.Copy before:=wb.Worksheets(1) 'copy the active sheet before the existing one
   If wb.Worksheets.Count > 1 Then
        'delete all sheets, except the first
        For i = wb.Worksheets.Count To 2 Step -1
          Application.DisplayAlerts = False
            wb.Worksheets(i).Delete
          Application.DisplayAlerts = False
        Next i
   End If
   arr = Split(strBackup, ".") 'split the path on the dot "."
                               'the last array element will be extension
   arr(UBound(arr)) = "xlsx"   'change exiting extension with "xlsx"
   strBackup = Join(arr, ".")  'join the processed array and obtain the correct path
   wb.SaveAs strBackup, xlWorkbookDefault 'save the workbook
   wb.Close False                         'close it without saving
   
   MsgBox "A backup has been done, like " & strBackup
End Sub

【讨论】:

  • OMG,它工作得很好(看起来也很复杂)......谢谢
  • @Hell-1931:很高兴我能帮上忙!代码不是那么复杂......我会评论它的行,你会毫无问题地理解它,我认为/希望...... :)
  • @谢谢!!!会容易得多,我明天(早上)会一步一步地完成......完美
  • @Hell-1931: 将相关的 cmets 放在任何一行...
【解决方案2】:

这是你想要的吗?

Private Sub Workbook_Open()
Var_Path = "D:...\Wb2.xls"
File1 = ActiveWorkbook.Name
Workbooks.Open Var_Path, 0, ReadOnly:=False

File2 = ActiveWorkbook.Name
Workbooks(File1).Sheets("Feuil1").Copy Before:=Workbooks(File2).Sheets("Feuil3")
End Sub

(在这里找到:Some Forum subject

要从另一个单元格打开,您可以将 Var_Path = "D:...\Wb2.xls" 替换为 Var_Path = range("A1").text(考虑范围 A1 是您的单元格“BackupPath”)

【讨论】:

  • 对不起,但是 <..... file2="ActiveWorkbook.Name" workbooks before:='Workbooks(File2).Sheets("Feuil3"'> 我只有一张工作表(我需要创建备份副本的活动工作表)
  • 与手动复制工作表的过程完全相同,Excel会询问您要将其粘贴到哪里。在我的示例中,这是在备份文件中的工作表 3 之前 :) 所以这里的代码从活动工作簿中复制工作表 1 以将其粘贴到另一个工作簿的工作表 3 之前。
  • 好的,所以,如果我想将活动工作簿中的“Sheet1”粘贴到没有任何其他工作表的新工作簿中 - 在这种情况下,我会写: File2 = ActiveWorkbook.Name Workbooks(File1 ).Sheets("Feuil1").Copy 或只是 - Workbooks(File1).Sheets("Feuil1")?
  • File2 = ActiveWorkbook.Name Workbooks(File1).Sheets("Sheet1") 抱歉
  • 不,我认为它在这种情况下不起作用...但是您仍然可以为此使用未使用的工作表,否则,对于第一次备份,您可以选择第一个中的所有单元格工作簿然后在备份文件中选择范围 A1 并粘贴。实际上,您将空文件替换为工作表。要知道它是否是第一次备份,您只需要添加一个条件来计算备份文件中的张数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多