2017-03-13 41 views
0

我有一个工作表从“workbook.protected”复制到新的问题。宏执行如下操作:首先取消保护所需工作表,然后创建新工作簿,将工作表复制到新工作簿,将新工作簿中的所有单元格重新保存为.values,并保存&关闭工作簿,最后保护父工作簿。 问题在于,由于某些原因,新工作簿不包含值,而是对父工作簿的引用。你能否就这个问题征求意见? 我使用的代码如下:VBA Copy Sheet.PROTECTED到新的工作簿ISSUE

Global path As String 
Global filename As String 

Sub SaveSheet() 
Application.ScreenUpdating = False 
Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
On Error Resume Next 
Set sh1 = ThisWorkbook.Worksheets("sheet1") 
Set sh2 = ThisWorkbook.Worksheets("sheet2") 
sh1.Unprotect Password:="password" 
sh2.Unprotect Password:="password" 
Dim a As String 

path = "\\path\" 
filename = "file1234" 

Set wb = Workbooks.Add 

ThisWorkbook.Activate 
Sheets("sheet1").Copy Before:=wb.Sheets(1) 
ThisWorkbook.Activate 
Sheets("sheet2").Copy Before:=wb.Sheets(1) 


With wb 
Application.DisplayAlerts = False 
wb.Activate 
Sheets(5).Delete 
Sheets(4).Delete 
Sheets(3).Delete 
Sheets("sheet1").Select 
Range("A1:N1000") = Range("A1:N1000").Value 
Sheets("sheet2").Select 
Range("A1:BW1000") = Range("A1:BW1000").Value 


Application.DisplayAlerts = True 
End With 

ChDir path 

With wb 
If Len(Dir(path, vbDirectory)) = 0 Then 
MkDir path 
.SaveAs path & filename & ".xlsb", FileFormat:=50 
Else 
.SaveAs path & filename & ".xlsb", FileFormat:=50 
End If 
.Save 
.Close 
End With 
    With sh1 
     .Cells.Locked = False 
     .Cells.SpecialCells(xlCellTypeFormulas).Locked = True 
     .Protect Password:="password" 
    End With 
    With sh2 
     .Cells.Locked = False 
     .Cells.SpecialCells(xlCellTypeFormulas).Locked = True 
     .Protect Password:="password" 
    End With 
End Sub 
+1

哪来的 “.....代码” :) –

+0

这:) Nathan_Sav – Lincoln

+0

范围( “A1:N1000”)=范围( “A1:N1000”)的价值 - 这是一个非常有趣的。公式的消失方式。它工作吗?在其他消息中,“Select”和“Activate”可能有所不同。 – Winterknell

回答

0

此过程使用数组来保存源工作表,名称为&的密码。它着重于解除工作表的保护,添加新的工作簿并复制目标工作表(值和格式),只需添加其他部分(即保护,保存等),这些部分在您的代码中似乎没问题。

'Have these declaration at begining of the module 
Option Explicit 
Option Base 1 

Sub Wsh_CopyTo_NewWbk() 
Dim aWsh As Variant 
aWsh = [{"Sheet1","Wsh1";"Sheet2","Wsh2"}] 
Dim aWshSrc(2) As Worksheet 
Dim wbk As Workbook, wsh As Worksheet 
Dim vItm As Variant, b As Byte 

    Rem Set Worksheet Array 
    With ThisWorkbook 
     For b = 1 To UBound(aWsh) 
      .Worksheets(aWsh(b, 1)).Unprotect Password:=aWsh(b, 2) 
      Set aWshSrc(b) = .Worksheets(aWsh(b, 1)) 
    Next: End With 

    Rem Add New Workbook 
    Set wbk = Workbooks.Add 
    With wbk 
     Rem Delete All Worksheets but One 
     Application.DisplayAlerts = False 
     For Each wsh In .Worksheets 
      With wsh 
       If .Index = 1 Then .Name = "!DELETE" Else .Delete 
     End With: Next 
     Application.DisplayAlerts = True 

     Rem Copy Worksheets 
     For Each vItm In aWshSrc 
      vItm.Copy After:=Sheets(.Sheets.Count) 
      Set wsh = .Sheets(.Sheets.Count) 
      wsh.UsedRange.Value = wsh.UsedRange.Value2 
     Next 

     Rem Delete Reamining Worksheet 
     Application.DisplayAlerts = False 
     .Worksheets("!DELETE").Delete 
     Application.DisplayAlerts = True 

    End With 
End Sub 
0

使用Copy不指定参数时,将纸张复制到剪贴板,然后Pastespecial

像这样的事情

ThisWorkbook.Activate 
Sheets("sheet1").Copy 
wb.Sheets(1).PasteSpecial 

PasteSpecial需要一个参数Link,默认为false。所以不需要指定它。如果它是错误的,它不应该保留对原始工作表的任何引用

+0

由于某些原因,第一张纸张复印OK。但是,当下一个复制的Excel再次创建一个新的工作簿...不知道为什么 – Lincoln