Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Excel vba创建活动工作表的备份副本_Excel_Vba_Backup_Worksheet - Fatal编程技术网

使用Excel vba创建活动工作表的备份副本

使用Excel vba创建活动工作表的备份副本,excel,vba,backup,worksheet,Excel,Vba,Backup,Worksheet,我需要将活动工作表的备份副本创建到新工作簿中。 这样创建的新工作簿中只有活动工作表(没有宏,没有vba) 我需要它发生在“打开”我的工作表事件之后 执行以下操作: Private Sub Workbook_Open() ActiveWorkbook.SaveCopyAs "E:\Projects\FolderName\FileName.xlsm" End Sub 它复制整个工作簿,

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

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

执行以下操作:

     Private Sub Workbook_Open()
     
     ActiveWorkbook.SaveCopyAs "E:\Projects\FolderName\FileName.xlsm"
                         
     End Sub
它复制整个工作簿,其中包含所有vba代码和宏,而不是我需要的

是否有办法只复制活动工作表


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

这就是您想要的吗

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
(请在此处找到:)


要从另一个单元格打开,您可以将
Var\u Path=“D:…\Wb2.xls”
替换为
Var\u Path=range(“A1”)。text
(考虑到range A1是您的单元格“BackupPath”)

请尝试下一个代码:

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

“BackupPath”是一个命名范围吗?如果不需要宏,则应将工作簿另存为xlsx。您的命名范围是否也包含扩展名?@FaneDuru“BackupPath”是命名范围吗?-它是一个命名单元,我在其中存储导出文件的路径。理想情况下,我希望引用该单元格,而不是像我在文章中所显示的那样,在vba中键入path。关于第二部分-我尝试保存为xlsx-打开保存的文件时收到错误消息-“Excel无法打开文件,因为扩展名或格式无效”,无法打开…抱歉,但我只有一张工作表(需要创建备份副本的活动工作表)当您尝试手动复制工作表时,这与此完全相同,Excel会询问您要将其粘贴到何处。在我的示例中,这是在备份文件中的工作表3之前:)因此,这里的代码从活动工作簿复制工作表1,将其粘贴到另一个工作簿的工作表3之前。好的,那么,如果我想将活动工作簿中的“工作表1”粘贴到新工作簿中,而不使用任何其他工作表,那么,在这种情况下,我会编写:File2=ActiveWorkbook.Name Workbooks(File1).Sheets(“Feuil1”).复制或仅复制工作簿(File1).Sheets(“Feuil1”)?File2=ActiveWorkbook.Name工作簿(File1).Sheets(“Sheet1”)对不起,我认为在这种情况下它不起作用……但是你仍然可以有一张未使用的工作表,否则,对于第一次备份,你可以选择第一个工作簿中的所有单元格,然后选择备份文件中的A1区域并粘贴。事实上,你可以用工作表替换空文件。要知道这是否是第一次备份,你只需要o添加一个条件来计算备份文件中的工作表数。OMG,它工作得很好(看起来也很复杂)…谢谢you@Hell-1931年:很高兴我能帮上忙!代码没那么复杂…我会评论它的行,你会理解它的,没有问题,我想/希望…:)@谢谢!!!会容易得多,明天(我的早上)我会一步一步地完成。。。作品perfect@Hell-1931年:将相关评论放在任何一行。。。