簡要關注:我注意到我必須在這里使用CType進行轉換,盡管Cells已經回傳一個Range。我做錯了什么呢?Cells是只讀的,不接受任何引數。好吧,我曾經被證明是這樣的。
如果我是這樣做的
xlRange = myWorksheet.Cells(Line 1US, 2US)
錯誤是
Option Strict On不允許從'Object'到'Range'的隱式轉換
。
我想說的是--如果是因為這個原因的話--我把Option Infer Off留了下來,這樣我就迫使自己總是寫下型別。
源代碼應該在一定時間內將測量值寫入Excel表格中。
示例:
A B C
1 07.09. 2021 08:00 25,0。
2 12:00 30, 0
3 16:00 35, 0
4 08.09。 2021 08:00 26,0。
5 12:00 28, 0
6 16:00 26, 0
類范圍內的變數:
Private Time_of_the_program_start As Date
Private Duration_of_the_runtime As TimeSpan
Private xlApp As Excel.Application
Private myWorkbook As Excel.Workbook
Private running As Boolean = False
Private行 As UInt16 = 0US
Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")。
running在一個按鈕程序中被設定為True。
Private Function read_and_write_data(ByVal file_path As String) As Boolean Boolean
xlApp = New Excel.Application With {
.Visible = True With ?
}
myWorkbook = xlApp.Workbooks.Add()
Dim myWorksheet As Excel.Worksheet = CType(myWorkbook.Sheets("Tabelle1"), Excel.Worksheet)
Dim xlRange As Excel.Range
Dim Temperatur As Single
While running
Duration_of_the_runtime = Date.Now - Time_of_the_program_start
If Duration_of_the_runtime.Days = 365 Then Exit While
Me.Invoke(Sub() Label_Duration.Text =
Duration_of_the_runtime.Days.ToString(Deu).PadLeft(3, "0 "c) & " :" &
Duration_of_the_runtime.Hours.ToString(Deu).PadLeft(2, "0 "c) & ":"/span> &
Duration_of_the_runtime.Minutes.ToString(Deu).PadLeft(2, "0 "c)
'System.Threading.Thread.Sleep(10000)。
'myWorksheet.Cells(Line, column)
'---------------------------------------
'Spalte A: Datum
'---------------------------------------
xlRange = CType(myWorksheet.Cells(Line 1US, 1US, Excel.Range)
xlRange.Value = Date.Now.ToString("d"/span>, Deu)
'---------------------------------------。
'Spalte B: Uhrzeiten'Spalte C: Messwerte'。
'---------------------------------------。
Temperatur = Get_Temperature_from_Pt100()
xlRange = CType(myWorksheet.Cells(Line 1US, 2US, Excel.Range)
xlRange.Value = Date.Now.ToString("t"/span>, Deu)
xlRange = CType(myWorksheet.Cells(Line 1US, 3US), Excel.Range)
xlRange.Value = Temperatur
'--------------------------------------------------------------。
Temperatur = Get_Temperature_from_Pt100()
xlRange = CType(myWorksheet.Cells(Line 2US, 2US, Excel.Range)
xlRange.Value = Date.Now.ToString("t"/span>, Deu)
xlRange = CType(myWorksheet.Cells(Line 2US, 3US), Excel.Range)
xlRange.Value = Temperatur
'--------------------------------------------------------------。
Temperatur = Get_Temperature_from_Pt100()
xlRange = CType(myWorksheet.Cells(Line 3US, 2US, Excel.Range)
xlRange.Value = Date.Now.ToString("t"/span>, Deu)
xlRange = CType(myWorksheet.Cells(Line 3US, 3US), Excel.Range)
xlRange.Value = Temperatur
'---------------------------------------。
'inkrementieren[/span]>。
'--------------------------------------- '---------------------------------------
行 =3US
結束 同時
myWorksheet.SaveAs(file_path, Excel.XlFileFormat.xlWorkbookDefault)
myWorkbook.Close()
xlApp.Quit()
If myWorksheet IsNot Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorksheet)
If myWorkbook IsNot Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorkbook)
If xlApp IsNot Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
myWorkbook = Nothing[/span
Return True
End Function[/span
順便問一下:是否有更優雅的解決方案?
Me.Invoke(Sub() Label_Duration.Text =
Duration_of_the_runtime.Days.ToString(Deu).PadLeft(3, "0 "c) & " :" &
Duration_of_the_runtime.Hours.ToString(Deu).PadLeft(2, "0 "c) & ":"/span> &
Duration_of_the_runtime.Minutes.ToString(Deu).PadLeft(2, "0 "c)
uj5u.com熱心網友回復:
對于你的主要問題,不,你沒有做錯什么,這只是Excel自動化界面的行為方式。 具體來說,集合型別都是經典的VBA Collection(或功能等同),這意味著索引訪問回傳一個Object,而不是強型別的東西。
正如您所注意到的,如果您試圖在Option Strict On背景關系中處理這個問題,您將不得不對結果進行鑄造。 我自己的互操作代碼中有大量的集合項訪問,其中不乏諸如 DirectCast(.Rows(2), Excel.Range)...
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/308308.html
標籤:
上一篇:如果我在asp:Timer中設定間隔時間小于1秒,會發生什么?
下一篇:動態創建的代碼塊沒有啟動
