簡體   English   中英

Excel VBA錯誤:1004選擇變量值范圍時對象'_Worksheet'的方法'范圍'失敗

[英]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

有一種更好的同步組合框的方法! 沒有編碼! 在此輸入圖像描述
兩個ComboBox都具有相同的dataSetting設置。 它們在共享LinkedCell中設置相同的值。 1. BoundColumn 2. LinkedCell 3. ListFillRange 在此輸入圖像描述 但我們更改其顯示設置以向用戶提供不同的視圖。 1. ColumnCount 2. ColumnWidths 3. ListRows 4. ListWidth 在此輸入圖像描述

您不能直接將ListFillRange設置為表。 解決方法是創建“定義名稱”並將ListFillRange設置為新名稱。

ListFillRange - >產品 - >表1

在此輸入圖像描述

所以我解決了這個問題。 造成這種情況的原因是我引用了錯誤的表格(又名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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM