[英]Excel VBA_ Method Range failed for Object Worksheet (Runtime Error 1004)
[英]Excel VBA Error: 1004 Method 'Range' of object '_Worksheet' Failed when Selecting the Range of a Variables Value
我的問題:當嘗試Set Table = cSheet.Range(brand_edit)
(brand_edit是一個帶有表名值的變量)時,我得到運行時錯誤'1004':對象'_WorkSheet'的方法'Range'失敗。
我認為這是因為我試圖找到變量值的范圍,我想不出辦法解決這個問題。
更多信息:
我正在創建一個userform ,允許用戶從excel中的數據表中獲取Item ID,並使用Item ID引導的行中的數據填充表/項列表。
我已經設置了一個組合框,從數據表中抓取我的目錄(品牌)(我把它變成了一個表並將表用作RowSource)。 然后我設置另一個組合框,顯示所選品牌的項目ID。 當您選擇一個特定的ID時,我試圖讓它從表中該項ID ID引出的行中獲取數據。
每個品牌都有一個與之相關的表格我使用一些時髦的替換來使其與表格命名方案相匹配。 我使用這些表作為靈活范圍(這些表將隨着時間的推移而變化,因此我需要考慮到這一點)。 項目ID引導行,每行包含有關項目的信息(成本,描述等)
如果有更好的方法來做這些事情,我願意接受各種想法。
這些是我試圖解決這個問題的一些問題:這個問題向我介紹了這個代碼,我試着考慮到我的用例並且我得到了錯誤。 Excel VBA - 在表中選擇,獲取和設置數據
Public brand_edit As String
Private Sub cmbItemID_Change()
Dim cBook As Workbook
Dim cSheet As Worksheet
Dim ItemID As String
Dim Brand_Table As String
Dim test As String
Dim i As Long
Dim Table As ListObject
Set cBook = ActiveWorkbook
Set cSheet = cBook.Sheets("Gen. Info")
ItemID = cmbItemID.Value
Brand_Table = brand_edit
MsgBox Brand_Table
Set Table = cSheet.Range(brand_edit).Select
For i = 1 To Table.ListRows.Count
If Table.ListColumns(1).DataBodyRange.Rows(i) = ItemID Then
MsgBox ItemID
End If
Next
MsgBox test
End Sub
Public Sub cmbItemID_DropButtonClick()
'funky replacing
Dim brand As String
brand = cmbBrand.Value
brand_edit = Replace(brand, " ", "_")
brand_edit = Replace(brand_edit, """", "")
brand_edit = Replace(brand_edit, "-", "")
brand_edit = Replace(brand_edit, "__", "_")
brand_edit = LCase(brand_edit)
cmbItemID.RowSource = brand_edit
End Sub
所以我解決了這個問題。 造成這種情況的原因是我引用了錯誤的表格(又名Gen.Info)。 我如何修復它是這樣的:
Set dSheet = cBook.Sheets("DATA")
Set Table = dSheet.Range(brand_edit)
當然,一旦出現一個問題,就會出現另一個問題。 所以我目前正在努力解決這個問題。
這篇文章經過多次閱讀后(昨晚發布之前的幾個晚上,然后是今天早上幾次)我終於得到了它所說的內容並幫助我解決了這個問題。 運行代碼時,VBA方法'對象范圍'_Worksheet突然失敗了嗎?
希望這更有用。
將getRowSource放在公共模塊中。 測試和擴展會更容易。
Public Function getRowSource(brand As String) As String
brand = Replace(brand, " ", "_")
brand = Replace(brand, """", "")
brand = Replace(brand, "-", "")
brand = Replace(brand, "__", "_")
brand = LCase(brand)
getRowSource = brand
End Function
通過這種方式,您可以在立即窗口中測試行源邏輯
如果cmbItemID的RowSource是您要引用的表,那么cmbItemID的ListIndex就是您要引用的行。
Dim itemIndex As Long, brand_edit As String
brand_edit = getRowSource(cmbBrand.Value)
itemIndex = cmbItemID.ListIndex
With cSheet.ListObjects(brand_edit)
TextBoxListPrice.Value = DataBodyRange(itemIndex, 1)
TextBoxListCost.Value = DataBodyRange(itemIndex, 2)
TextBoxNotes.Value = DataBodyRange(itemIndex, 3)
TextBoxSpecs.Value = DataBodyRange(itemIndex, 4)
TextBoxDescription.Value = DataBodyRange(itemIndex, 5)
End With
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.