2017-04-03 72 views
0

我有兩個後臺工作人員,需要將事務從第一個傳遞給另一個工作人員。在後臺工作人員之間傳遞Excel變量

這就是我試圖通過:

Dim APP As Excel.Application = New Microsoft.Office.Interop.Excel.Application() 
Dim workbook As Excel.Workbook 
Dim worksheet As Excel.Worksheet 
Dim worksheetRange As Excel.Range 
Dim status As String 


這是如何,我想通過它:

Private Sub bwExport_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwExport.DoWork 
    Dim APP As Excel.Application = New Microsoft.Office.Interop.Excel.Application() 
    Dim workbook As Excel.Workbook 
    Dim worksheet As Excel.Worksheet 
    Dim worksheetRange As Excel.Range 
    Dim status As String 

    'code stuff here 

    Dim ExportList As New List(Of Object)(5) 
    ExportList.Add(APP) 
    ExportList.Add(workbook) 
    ExportList.Add(worksheet) 
    ExportList.Add(worksheetRange) 
    ExportList.Add(status) 
    e.Result = ExportList 
End Sub 


Private Sub bwExport_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bwExport.RunWorkerCompleted 
     bwExportFinish.RunWorkerAsync(e.Result) 
End Sub 


而這就是我試圖找回它的方式:

Private Sub bwExportFinish_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwExportFinish.DoWork 
    Dim ExportList As List(Of Object) = TryCast(e.Result, List(Of Object)) 
    Dim APP As Excel.Application = TryCast(ExportList(0), Excel.Application) 
    Dim workbook As Excel.Workbook = TryCast(ExportList(1), Excel.Workbook) 
    Dim worksheet As Excel.Worksheet = TryCast(ExportList(2), Excel.Worksheet) 
    Dim worksheetRange As String = TryCast(ExportList(3), String) 
    Dim status As String = TryCast(ExportList(4), String) 

    'Save spreadsheet 
    Dim SavePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & label1.Text & " " & Status & " Status " & System.DateTime.Now.ToString("MM.dd.yyyy HH;mm;ss") & ".xlsx" 
    workbook.SaveAs(SavePath) 
    workbook.Close(False) 
End Sub 


這是我發現了錯誤:
1.線:昏暗APP作爲Excel.Application = TryCast(ExportList(0),Excel.Application( ))
給我錯誤:'Application()'類型的值不能被轉換爲'Application'
我是盲人。我剛剛發生格式錯誤。這是固定的。

2.我得到的是,在VS2015帶來了一個網頁的錯誤,上面寫着「電源不可用」,然後類型「System.Reflection.TargetInvocationException」未處理的異常出現在mscorlib.dll



有沒有人有任何想法?

+1

'路過背景之間的Excel變量Workers'這是一個潛在的很多麻煩;你確定你使用的所有'Excel'類型都是'線程安全的'嗎? – Stefan

+0

那麼,錯誤實際上解釋得很好。您的原始變量是「Excel.Application」類型,而「Excel.Application()」是相同類型的數組。因此,如果需要強制轉換,則需要將其轉換爲'Excel.Application' *。除此之外,我不相信這是@Stefan指出的正確方法。我想你應該重新考慮首先傳遞變量的必要性。 –

+0

@Stefan不,我不幸。我仍然在學習編碼,並且不確定線程​​的安全性。我剛剛做了Google,但我不確定這些Excel類型會帶來什麼。如果這不是將這些從一個背景工作者傳遞給另一個背景工作者的方法,你能否指出我正確的方向? – lolikols

回答

2

好吧,在你的代碼中有幾個錯誤,我要指出它們。

  • 正如我在評論中提及上面:

    The error actually explains it pretty well. Your original variable is of type Excel.Application, while Excel.Application() is an array of the same type. Hence, you would need to cast it as Excel.Application if casting is even required.

  • 在你的第二個BackgroundWorker的(bwExportFinish),你試圖讓你從第一的BackgroundWorker通過List(Of Object),但你使用錯誤的變量(e.Result)。怎麼樣?那麼,你存儲在e.Result第一個 BackgroundWorker不是第二個之一。現在將該列表傳遞給第二個BackgroundWorker之後,您可以使用e.Argument而不是e.Result來訪問它。

  • 另一個小錯誤是,您創建了Excel.Range類型的變量worksheetRange,然後將其轉換爲String

因此,你在第二BackgroundWorker的代碼看起來應該像下面這樣:

Private Sub bwExportFinish_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwExportFinish.DoWork 
    Dim ExportList As List(Of Object) = TryCast(e.Argument, List(Of Object)) 
    If ExportList Is Nothing Then 
     ' Casting has failed. Choose how you want to handle this. 
    End If 

    'Dim APP As Excel.Application = TryCast(ExportList(0), Excel.Application) 
    'Or you can skip the casting if you already know you passed the right object. 
    Dim APP As Excel.Application = ExportList(0) 
    Dim workbook As Excel.Workbook = ExportList(1) 
    Dim worksheet As Excel.Worksheet = ExportList(2) 
    Dim worksheetRange As Excel.Range = ExportList(3) 
    Dim status As String = ExportList(4) 

    'Save spreadsheet 
    workbook.SaveAs(SavePath) 
    workbook.Close(False) 
    APP.Quit() 
End Sub 

希望幫助:)

+0

嘿,謝謝!我做了適當的修改,但是我仍然收到一個錯誤,它在VS2015中顯示「Source Not Available」,然後在mscorlib.dll中發生了類型爲「System.Reflection.TargetInvocationException」的未處理異常。 – lolikols

+0

我想在這種情況下,我們可能需要看看在第一個BackgroundWorker下有哪些代碼可能會以某種方式改變變量。至於現在,我使用'bwExport_DoWork'代碼做了一個快速測試,並對該範圍進行了一些額外的工作,然後觸發了修改後的'bwExportFinish_DoWork'代碼,它工作得很好。 –

+0

第一個後臺工作者實際上是將信息從一個不同的工作簿複製到我在上面的代碼中聲明的信息。這是相當長的代碼,但我可以發佈它,如果你想。當我公開聲明excel時,代碼實際上工作得很完美,但我試圖在後臺工作者中聲明它,這看起來很糟糕。 – lolikols