2012-02-17 61 views
1

我想從一個工作簿複製Excel工作表到另一個沒有用戶看到任何東西,但我不斷收到錯誤'複製工作表類失敗'的錯誤。看來你不能複製一張表到另一個工作簿,除非該工作簿是可見的?Excel Vba工作表複製方法失敗

感謝您的任何幫助。

赫斯是失敗的代碼:

Private Sub CommandButton1_Click() 

Dim xlapp As Excel.Application 
Dim wkBook As Excel.Workbook 

'Connect to Excel 
Set xlapp = New Excel.Application 

'Set workbook and open workbook in directory 
Set wkBook = xlapp.Workbooks.Open(sFileName, xlUpdateLinksNever, ReadOnly:=False) 


ThisWorkbook.Sheets("Logistics").Copy Before:=wkBook.Sheets(1) 

wkBook.Close True 
xlapp.Quit 
Set xlapp = Nothing 

End Sub 
+0

這不是你的問題。您正在創建一個單獨的Excel實例,該實例無法與包含代碼的當前實例「交談」。 – brettdj 2012-02-17 12:02:19

回答

2

但我不希望用戶看到工作簿打開和關閉?如果用戶沒有看到正在複製的工作簿,是否有任何方法可以從一個工作簿複製到另一個工作簿?謝謝 - JC75

我需要將工作簿設置爲可見= false,但工作簿沒有可見屬性。如果我的應用程序窗口設置爲可見=假,我得到的同樣的錯誤原單「工作表類的複製方法失敗」 - JC75

另一種方式來實現你想要的。

'~~> From within excel 
Sub Sample() 
    Dim wb1 As Workbook, wb2 As Workbook 
    Dim ws1 As Worksheet 
    Dim sFileName As String 

    sFileName = "C:\Temp.xls" 

    Set wb1 = ActiveWorkbook 
    Set ws1 = wb1.Sheets("Logistics") 

    Set wb2 = Workbooks.Open(sFileName) 
    ActiveWindow.Visible = False 

    wb2.Sheets.Add Before:=wb2.Sheets(1) 
    ws1.Cells.Copy wb2.Sheets(1).Cells 

    'Windows(wb2.Name).Visible = True 
    wb2.Close SaveChanges:=True 

    Set wb1 = Nothing 
    Set wb2 = Nothing 
End Sub 
+0

嗨,謝謝。這是有效的,除非我必須在關閉之前再次使窗口可見,否則當您下次打開電子表格時,窗口將保持可見= false。 – JC75 2012-02-17 15:11:49

+0

@ JC75:是的,只需在我的代碼中取消註釋即可。用戶在立即關閉時看不到正在顯示的工作簿。 – 2012-02-18 01:03:11

2

如果您從Excel這樣做,你不需要Excel.Application電話和這應該工作:

Private Sub CommandButton1_Click() 

    Dim wkBook As Workbook 

    'Set workbook and open workbook in directory 
    Set wkBook = Workbooks.Open(sFileName, xlUpdateLinksNever, ReadOnly:=False) 

    ThisWorkbook.Sheets("Logistics").Copy Before:=wkBook.Sheets(1) 

    wkBook.Close True 

End Sub 

如果您需要類似於您的代碼,您需要使用當前的Excel應用程序ThisWorkbook指向正確的工作簿:

Set xlapp = ThisWorkbook.Application 

如果你需要做的,而用戶看到的變化,你可以使用:

Application.ScreenUpdating = False 
'Insert the rest of the code 
Application.ScreenUpdating = True 
+0

該代碼應該像使用Excel的*相同*實例一樣工作。但不是「這應該工作」,它應該清楚,原來的代碼不能工作,因此需要運行它以上 – brettdj 2012-02-17 12:03:38

+0

同意 - 相應地修改 – assylias 2012-02-17 12:04:31

+0

+1爲好的答案 – brettdj 2012-02-17 12:05:03

2

如果你想這樣做的背景,那麼你應該使用一個控制工作簿自動工作簿

更好再次運行它作爲一個而非

  1. 拷貝代碼到記事本
  2. 章安格源和目標工作簿的路徑,以適應
  3. 將它保存爲一個文件vbs,即「test.vbs」
  4. 點擊vbs文件在後臺

或者把執行復制在VBA一個Sub這裏面的代碼,並從與源和目標文件的控制工作簿封閉運行(建議您維度變量正確,如果您使用VBA)

Dim objExcel 
Dim Wb1 
Dim Wb2 
Dim ws 
Set objExcel = CreateObject("excel.application") 
On Error Resume Next 
Set Wb1 = objExcel.Workbooks.Open("c:\temp\source.xlsm") 
Set Wb2 = objExcel.Workbooks.Open("c:\temp\dest.xlsm") 
Set ws = Wb1.Sheets("logistics") 
If Not IsEmpty(ws) Then 
    ws.Copy Wb2.Sheets(1) 
    objExcel.DisplayAlerts = False 
    Wb2.Save 
    objExcel.DisplayAlerts = True 
    wscript.echo "success" 
Else 
    wscript.echo "copy failed" 
End If 
Wb2.Close False 
Wb1.Close False 
On Error GoTo 0 
objExcel.Quit 
Set objExcel = Nothing 
+0

+1 VBS是一個不錯的選擇。 :) – 2012-02-17 14:20:02

1

試試這個

Sub CopyAcross() 
    Workbooks("Model24.xls").Sheets("Custom").Copy Before:=Workbooks("Master.xls").Sheets(1) 
End Sub 
相關問題