2015-10-19 86 views
0

我一直在處理這個代碼,其中我有一個用戶窗體,它具有列表框和組合框的混搭。到目前爲止,我已經填充了列表框,但由於某種原因,我在組合框(combobox1combobox2)中遇到了問題。不明白爲什麼我收到'下標超出範圍'

我已經成功填充combobox1的下拉列表,並且從該列表中我想通過已經通過'名稱管理器'調出的命名範圍'過濾'。命名的範圍被稱爲Range_Books

Range_Books參考BOOKS或VBA代碼Sheet7中的table48中的兩列和可變數量的行。下面的代碼是我最近嘗試完成我已經解釋但仍然失敗的迭代。

我最初試圖直接調出範圍而不使用Worksheets("Sheet7").,因爲命名範圍不在特定表單中,但我仍然不確定哪個是調出範圍的最佳方式,並且如果這是根我的問題。我已經直接呼叫範圍,沒有worksheets(" "),這是我爲什麼如此困惑。

請注意,當用戶窗體初始化時,它會打開一個輔助工作簿以填充列表框。在初始化之後,可以在爲combobox1選擇一個值之前完成各種操作,從而激活我嘗試創建的功能。此輔助工作簿保持打開狀態,直到用戶窗體關閉。我提到這一點是因爲我不確定輔助工作簿是否會導致範圍對象出現問題。自從添加了向用戶窗體打開輔助工作簿功能後,我一直在從VBA收到麻煩。

Private Sub ComboBox1_Change() 

Dim count As Integer 
Dim i As Integer 

count = Worksheets("Sheet7").Range("Range_Books").Rows.count 

For i = 0 To count 

    If Worksheets("Sheet7").Range("Range_Books").Cells(i, 1) = ComboBox1.Value Then 
     ComboBox2.AddItem (Worksheets("Sheet7").Range("Range_Books").Cells(i, 2)) 
    End If 

Next i 

End Sub 
+2

沒有0行,當你做'.cells(1,1)' – findwindow

+2

你說range_books是在不同的工作簿時,您可能需要一個更引用添加到開始每個。您可能需要在工作表(「工作表7」)之前放置'Workbooks()...「您認爲活動的工作簿可能已失去焦點。 –

+0

Scott實際上閱讀了XD – findwindow

回答

0

您需要要麼For i = 1 to count啓動,或更改範圍,以.Cells(i+1,1)...

此外,還要確保你指到正確的紙張。我認爲這是你問題的癥結所在。

如果你命名的範圍與標籤名稱的工作表「書籍」,那麼你需要改用count = Worksheets("Books").Range("Range_Books").Rows.count

如果你想使用「Sheet7」參考相反,你可以使用count = Sheet7.Range("Range_Books").Rows.count

+0

這是一個很好的捕獲,我忽視了。我確實嘗試過,它仍然給我下標超出範圍錯誤,highligting行:「計數=工作表(」Sheet7「)。範圍(」Range_Books「)。行數」 – Wajoman

+0

@BryanWatras-也許愚蠢的問題,但你的範圍'''Range_Books「'在'Sheets(」Sheet7「)工作表上,是嗎? ** OH **我想我明白你的困惑是什麼。嘗試使用'count = Worksheets(「Books」)。Range(「Range_Books」).Rows.count'。 'Sheet(「Sheet7」)''*不一定與'Sheet7.Cells(...'相同)如果您的工作表名稱是「Books」,那麼使用'Sheets(「Books」)'。如果它是第七張添加到工作簿中,然後'Sheet7.Cells(1,1)'和'Sheets(「Books」)是一樣的單元格(1,1)'。 – BruceWayne

+0

我更改了所有的工作表單實例工作表(「Sheet7」)jsut Sheet7,它的作品完美,非常感謝你! – Wajoman

0
For i = 0 To count 
... 
Cells(i, 1) 

在這一點上,I = 0。0行不存在。

變化i = 0i = 1

+5

fwiw,只要'.Cells(1,1)'不在第一行,就可以引用'.Cells(0,1)'。這與'.Cells(1,1).Offset(-1,0)''相同。如果** Range_Books **命名範圍從第2行開始,這將是一個合法的調用,但是如果它從第1行開始,那麼您正在請求一個不存在的單元格(例如,從工作表頂部移除)。 – Jeeped

+0

好的電話@Jeeped - 學到了新的東西! :) –

+0

這是一個很好的接觸,並且我忽略了一些東西。我確實嘗試了這個,它仍然給了我下標超出範圍錯誤,highligting行:「Count = Worksheets(」Sheet7「)。Range(」Range_Books「)。Rows.Count」 – Wajoman

0

使用這個

Private Sub ComboBox1_Change() 

Dim count As Integer 
Dim i As Integer 
Dim ws As WorkSheet 

Set ws = Sheets("Sheet7") 
count = ws.Range("Range_Books").Rows.count 

For i = 1 To count 

    If Worksheets("Sheet7").Range("Range_Books").Cells(i, 1) = ComboBox1.Value Then 
     ComboBox2.AddItem (Worksheets("Sheet7").Range("Range_Books").Cells(i, 2)) 
    End If 

Next i 

End Sub 
+0

這是一個很好的接觸,我忽略了一些東西,我試過這個,它仍然給我的下標超出範圍錯誤,highligting線:「Count = Worksheets(」Sheet7「)。Range(」Range_Books「).Rows.Count」 – Wajoman

+0

請檢查Sheet7中是否有Range「Range_Books」 – newguy

0

謝謝大家的幫助,非常感謝!我的最終工作代碼如下。我將工作表(「Sheet7」)的所有實例都更改爲Sheet7。我附上了Excel Objects文件夾樹的圖片,你可以看到我有Sheet7,我命名爲「Books」。我的困惑是工作表(「」)調出我分配的名稱,而不是表格的VBA分配名稱。我也添加ComboBox2.Clear這種方式每當ComboBox1更改它重置值,而不是堆疊它們。我希望這對未來有所幫助,並再次感謝幫助我的評論員!

enter image description here

Private Sub ComboBox1_Change() 

ComboBox2.Clear 

Dim count As Integer 
Dim i As Integer 

count = Sheet7.Range("Range_Books").Rows.count 

For i = 1 To count 

    If Sheet7.Range("Range_Books").Cells(i, 1) = ComboBox1.Value Then 
     ComboBox2.AddItem (Sheet7.Range("Range_Books").Cells(i, 2)) 
    End If 

Next i 

End Sub