我正在嘗試將使用 Rich 資料型別(我不確定我說的是否正確)從 B2 匯出的股票代碼保存到變數中。

我用了這段代碼
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ticker As String
If Target.Address = "$A$2" Then
Ticker = Activesheet.Range("B2").Value
MsgBox Ticker
End If
End Sub
當我對 A2 進行更改時會發生這種情況。
我試圖將其轉換為文本或字串,但它不起作用。我將變數分配為 Variant 和 String,但仍然無法正常作業。錯誤是說“運行時錯誤'13'型別不匹配。但我不知道我做錯了什么。
當我除錯它時,Ticker = ""
我用谷歌搜索,我找不到答案。有可能嗎?
uj5u.com熱心網友回復:
問題:當您在 中更改豐富的資料型別時,Excel 開始在viaA2中檢索股票代碼。獲取此類資料可能需要很短的時間,并且當請求處于掛起狀態時,將顯示為。在這種狀態下,將被讀取為錯誤,因此您的代碼將在 上反彈,因為變數變暗為。這就是您收到“型別不匹配”錯誤的原因。B2=A2.[Ticker symbol]B2#FIELD!B2.ValueTicker = ActiveSheet.Range("B2").ValueString
解決方案:在您的代碼中構建一個輕微的延遲,這將使 Excel 有足夠的時間來檢索請求的資料。我們可以Do While Loop為此使用 a 。定義 2 個布林值:
- 第一個布爾檢查
IsError(ActiveSheet.Range("B2")) - 第二個布爾函式用作計時器
當這些布林值中的任何一個變為 時退出回圈False。您希望包含第二個布林值以確保您不會陷入無限回圈。如果 in 的值B2將始終保留,則可能會發生這種情況#FIELD,因為您沒有提供有效的 in 條目A2。
像下面這樣的東西應該可以作業:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ticker As String
Dim fieldError As Boolean, onTime As Boolean
Dim endTime As Date
'using Target.Text <> "" rather than Target.Value <> "", since the latter will throw an error
'if the range contains a 'rich data type'
If Not Intersect(Target, ActiveSheet.Range("A2")) Is Nothing And Target.Text <> "" Then
'set timeframe to wait for response, set to 1 second here
'we want to check: if "#FIELD!" hasn't changed into a proper value after 1 second
'then data in A2 is probably nonsense: exit loop
endTime = Now TimeValue("00:00:01")
'set Booleans
onTime = True
fieldError = True
'enter Do While Loop
Do While fieldError And onTime 'continue until
If IsError(ActiveSheet.Range("B2")) Then
Else
'B2 (no longer) an error, switch bool to False to exit loop
fieldError = False
End If
'bool to False after time out to exit loop
onTime = Now < endTime
Loop
'In case of Error, probably incorrect input in A2
On Error GoTo ErrorHandling
Ticker = ActiveSheet.Range("B2").Value
ErrorHandling:
Debug.Print "A2.Text = " & ActiveSheet.Range("A2").Text & "), " & _
"ticker = " & Ticker & ", fieldError = " & fieldError & ", onTime = " & onTime
If Err.Number <> 0 Then
'do stuff (you probably got a correct response, but it's still an error
Debug.Print "Entered ErrorHandling"
Err.Number = 0
End If
Debug.Print "------"
Else
End If
End Sub
舉例來說,您會在下面看到一個回圈運行,該回圈連續填充A2對范圍內專案的參考LIST并嘗試檢索代碼。注意即時視窗中的輸出:對于“AA”、“AAPL”和“AMZN”,我們正在退出回圈fieldError = False(找到股票代碼)。對于“NONSENSE”,我們正在退出onTime = False(沒有代碼:我們超時了)。

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/485925.html
