2014-05-13 59 views
0

我正試圖編寫一個代碼,在用戶提示操作後將數據導出爲ex​​cel。 基本上,我已經能夠成功導出到Excel,但第二個實例我想寫入到一個新的選項卡,而不是一個新的Excel應用程序。寫入Excel對象

oExcel = CreateObject("Excel.Application") 
oExcel.Visible = True 
oBook = oExcel.Workbooks.Add 
oSheet = oBook.Worksheets(3) 
oSheet.Delete() 
oSheet = oBook.Worksheets(2) 
oSheet.Delete() 
oSheet = oBook.Worksheets(1) 
oSheet.Name = "Run " & Counter 

此時,用戶將按下按鈕,使Excel不再處於活動狀態。 因此,當我想將更多數據寫入新工作表時,除非我完全重複代碼,否則Object命令不會工作 。

我想:

Counter +=1 

'For the first instance 
If Counter = 1 Then 

     oExcel = CreateObject("Excel.Application") 
     oExcel.Visible = True 
     oBook = oExcel.Workbooks.Add 
     oSheet = oBook.Worksheets(3) 
     oSheet.Delete() 
     oSheet = oBook.Worksheets(2) 
     oSheet.Delete() 
     oSheet = oBook.Worksheets(1) 
     oSheet.Name = "Run " & Counter 

Else 
'For every instance after that the user wants to do another run 

     oExcel.ActivateObject(Excel.Application) 
     oBook = oExcel.Workbooks(1) 
     oSheet = oBook.Worksheets.Add 
     oSheet.Name = "Run " & Counter 

End If 

我一直在尋找了幾天,我變得非常沮喪。我不知道如何返回到打開的Excel中,以便繼續寫入數據...在用戶按下VB表單上的按鈕後,確認他們想要再次運行。

回答

0

要獲得對已經運行的excel實例的引用,可以使用GetObject

如:

' Test to see if a copy of Excel is already running. 
Private Sub testExcelRunning() 
    On Error Resume Next 
    ' GetObject called without the first argument returns a 
    ' reference to an instance of the application. If the 
    ' application is not already running, an error occurs. 
    Dim excelObj As Object = GetObject(, "Excel.Application") 
    If Err.Number = 0 Then 
     MsgBox("Excel is running") 
    Else 
     MsgBox("Excel is not running") 
    End If 
    Err.Clear() 
    excelObj = Nothing 
End Sub 

http://msdn.microsoft.com/en-us/library/e9waz863(v=vs.90).aspx

如果Excel尚未運行,您可以使用CreateObject啓動一個新的實例。

+0

謝謝。我必須稍微改變getObject並將書名命名爲「Book1」 - 出於某種原因,它不會自動命名書「Book1」... – jrod404

+0

設置xlApp = GetObject(「Book2」)。 – jrod404

0

我曾經寫過VBA,但我被教導擺脫了使用CreateObject的習慣。你也可以使用布爾值,但我想這只是偏好。你應該在循環之外創建excel對象,一旦賦值就在類級保持引用。然後使用循環來單獨分配下一張紙並添加值。將維保持在課程級別意味着您不需要立即擺脫對象,因爲用戶可能仍需要使用該參考。

Public Class Form1 
Dim firstRun As Boolean = True 
Dim xlApp As New Excel.Application 
Dim xlWb As Excel.Workbook 
Dim xlSheet As Excel.Worksheet 
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    'set up us some excel 
    xlApp.Visible = True 
    xlApp.SheetsInNewWorkbook = 1 
    xlWb = xlApp.Workbooks.Add 

    'imaginary loop 
    For i = 0 To 5 

     Dim msgResponse = MessageBox.Show("Do you want to loop?", "Keep Looping?", MessageBoxButtons.YesNo) 

     If msgResponse = Windows.Forms.DialogResult.No Then Exit For 

     If firstRun Then 
      xlSheet = xlWb.Sheets(1) 
      firstRun = False 
     Else 
      xlWb.Activate() 
      xlSheet = xlWb.Sheets.Add(After:=xlWb.Sheets(xlWb.Sheets.Count)) 
     End If 

     xlSheet.Name = "TEST" & i 
     xlSheet.Range("A1").Value = "Some Data" 


    Next i 

End Sub 
End Class 

一旦您確定用戶已完成工作表,您將需要確保清理引用。

+0

我認爲這更接近,但問題是我無法真正將它保留在私人課程中。如果用戶想要再次運行,那麼在再次運行它之前,我有大約50個值可以更改。再次運行會輸出相同的結果。 – jrod404

+0

我更期待從第一次運行中引用已經打開的Excel文件的方式....您的方法永遠不會離開該Excel。 – jrod404