我正在 VS2019 上撰寫一個 Windows 表單應用程式,它將打開一個 excel 檔案并執行嵌套回圈。
基本上,有兩個整數串列。代碼將遍歷每一行以檢查單元格 A 的值是否存在于任何串列中,然后為單元格 B 分配一個字串。
原始代碼中的串列大約有 400 個元素,但我把它剪下來貼在這里。然后有趣的事情發生了。當我運行包含 400 多個元素的原始代碼時,它會回圈該行并中途停止,然后它給我“來自 HRESULT 的例外:0x800AC472”。但是,當我運行下面的代碼時,它沒有錯誤。
所以我想如果這個龐大的清單是問題所在。我想知道你們中是否有人以前遇到過這種情況以及如何解決它。
[更新]我在串列中添加了更多元素并嘗試運行它。它確實拋出了相同的例外。我還嘗試減少元素的數量并再次運行,并且它沒有錯誤地作業。所以我想這是因為元素的數量。
Private Sub generateZone(ByVal worksheet As Object)
'Initialise Excel Object
xlsApp = New Excel.Application
'Open file
xlsWorkBook = xlsApp.Workbooks.Open("File location")
'Open worksheet(according to the spreadsheet)
xlsWorkSheet = xlsWorkBook.Worksheets("sheet1")
'Excel interaction setting
With xlsApp
.Visible = True
.Application.Visible = True
.DisplayAlerts = False
.EnableEvents = False
End With
Dim emZone1 As New List(Of Integer)(New Integer() {87371, 87390, 94614, 92000, 82898, 96500, 99124, 93260, 82496, 97858, 90323, 88083, 80770, 84186, 86318, 91922, 85987, 80635, 84079, 96691, 85578, 83108, 96081, 87642, 96703, 96692, 99193, 93039, 97003, 89374, 99252, 82305, 87907, 90966, 80517, 88471, 92395, 86109, 87112, 92849, 93853, 91136, 90512, 97143, 96105, 93966, 81136, 97218, 97816, 82525, 97714, 98175, 94940, 97262, 81750, 92075, 98905, 96199, 94072, 83841, 88243, 98375, 84142, 92818, 83527, 97446, 88632, 86542, 84768, 86283, 84910, 88986, 92802, 99145, 81487, 84729, 80010, 90896, 99418, 87545, 95937, 89904, 88073, 85255, 87285, 88442, 86325, 90223, 92048, 85160, 98768, 80283, 91273, 92077, 91043, 81409, 96042, 82536, 92726, 91980})
Dim emZone2 As New List(Of Integer)(New Integer() {86634, 92330, 95970, 95577, 87510, 89481, 94248, 93860, 81857, 82810, 93228, 80095, 94437, 84887, 88766, 92706, 92264, 88109, 91992, 82751, 94767, 95397, 96066, 91667, 94059, 89419, 82796, 82310, 86961, 85681, 93969, 81736, 81009, 97445, 80741, 92154, 84923, 86182, 91660, 90665, 81388, 87722, 94031, 94678, 84074, 80550, 82953, 81317, 95132, 92163})
'get last row
Dim lastRow As Integer
lastRow = worksheet.UsedRange.Rows.Count
'loop through every row
For i As Integer = 1 To lastRow
'get pronvice from column J
Dim province As String = worksheet.Range("J" & i).Value
If province = "Sabah" Or province = "Sarawak" Then
'check zone1
For Each zone1 As Integer In emZone1
If emZone1.Contains(worksheet.Range("L" & i).Value) Then
worksheet.Range("M" & i).Value = "Zone 1"
Else
'check zone2
For Each zone2 As Integer In emZone2
If emZone2.Contains(worksheet.Range("L" & i).Value) Then
worksheet.Range("M" & i).Value = "Zone 2"
' Exception from HRESULT: 0x800AC472 shows here
Else
'if not in both zone
worksheet.Range("M" & i).Value = "EM"
End If
Next
End If
Next
Else
'if not sabah and sarawak
worksheet.Range("M" & i).Value = "WM"
End If
Next
'releaseObject(xlsWorkSheet)
'releaseObject(xlsWorkBook)
'releaseObject(xlsApp)
End Sub
uj5u.com熱心網友回復:
不確定這是否相同,但另一個具有相同錯誤的SO 帖子已通過以下答案解決:
“在我的情況下,拋出例外是因為我的 excel 互操作工具正在顯示一個模式對話框(與過期的許可證密鑰相關聯 - 對我來說是恥辱。如果我關閉對話框(顯示在后臺)然后點擊在 Visual Studio 中‘繼續’,程式能夠連接到 xlsx 檔案并成功檢索資料。” -姆米胡拉
你確認沒有彈出視窗或任何東西出現嗎?
你的excel也有執照嗎?
如果不是這個,
我會為您的回圈添加一個限制,并嘗試查找錯誤之前是否有固定的迭代次數,如果是,則存在一些默認限制。
最后一個想法,
我已經在很多例子中看到這些互操作 excel 呼叫沒有得到正確處理,這導致許多 excel 卡在后臺運行。
檢查您的任務管理器并確保沒有發生這種情況。如果是這樣,請關閉它們并再次嘗試您的測驗。
uj5u.com熱心網友回復:
我認為您只需要在讀取值之前檢查空單元格。當單元格為空并且您嘗試將其決議為字串時,Excel 將引發例外
Dim xlsRange As Excel.Range = Nothing
' In your loop
xlsRange = DirectCast(xlsWorkSheet.Cells("J" & i), Excel.Range)
If xlsRange.Value IsNot Nothing Then
Dim province = xlsRange.Value.ToString()
End If
' /Loop
' always release it at the end
If xlsRange IsNot Nothing Then Marshal.ReleaseComObject(xlRange)
我仍然更喜歡在釋放所有 Excel 物件后將所有內容加載到物件中并對其進行操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/329993.html
標籤:擅长 网络 视觉工作室-2019
