2015-01-26 52 views
0

我有一組ActiveX控件和潛艇裝配在一起這樣的的名稱:更改的Excel的ActiveX列表框

  1. 用戶類型到一個ActiveX文本框,
  2. TextBox_Click觸發3級潛艇執行。
  3. 第一個子更新工作表上命名範圍的值;基於該更新後的值的表是Excel使用偏移函數創建
  4. 第二子抄表範圍在3和paste.values更新爲在片材上的範圍(以消除公式)

這裏的它在哪裏崩潰。

  1. 當我設置工作表時,我創建了一個ListBox(ListBox1)。上面#2中提到的三個潛艇中的第三個測試是否在工作表中存在ActiveX「ListBox1」。如果不是,則意圖是代碼將決定ListBox的調用方式(LB1或LB2或LB2等),將名稱更改爲「ListBox1」,並將上面的#4的表格粘貼到ListBox1中。然後,ListBox1_Click命令可以觸發一組要執行的唯一代碼。

現在我只是測試名稱ListBox1和ListBox2之間的切換。

這個想法是,當用戶輸入TextBox1時,例如ListBox1會在每次擊鍵時更新。所以輸入「g」,列表顯示20個名字,從數據庫表中的第一個「g」開始。然後輸入「ge」,列表顯示20個名字,從數據庫表格中的第一個「ge」開始等等。用戶點擊一個名字,ListBox1_click做一些獨特的事情。如果用戶在TextBox2中輸入,他們會在ListBox中看到不同的數據(我想將其重命名爲ListBox2),如果他們單擊一組唯一的代碼則由ListBox2_Click執行。

#5中的問題是我第一次嘗試執行時出現錯誤「對象不支持此屬性或方法」。第二次是好的。如果我在工作表上做了其他事情並回到它,我再次得到錯誤。

這裏是#5的代碼是在模塊:我不知道我在做什麼錯

Sub PutListInListBox() 

    Dim OBJ As Object 

    On Error Resume Next 
     Set OBJ = ActiveSheet.OLEObjects("ListBox1") 
    On Error GoTo 0 

    If OBJ Is Nothing Then 
     ActiveSheet.ListBox2.Name = "ListBox1" 
    End If 

    ActiveSheet.ListBox1.Clear 
    ActiveSheet.ListBox1.List = Sheets("Search Criteria Control").Range("G1:G21").Value 

End Sub 

任何幫助表示讚賞。

我希望我明確這一點。

更新後的代碼 我有一堆的ActiveX標籤和文本框,所以我用你建議搜索特定名稱的案例的第一種形式。我一直在閱讀它,看不到我在這裏有什麼問題。輸入TB5後,LB不更新。我回到設計模式,可以看到名稱仍然是ListBox2。

任何想法?

Private Sub TextBox5_Change() 

    Call UpdateValues(TextBox5.Value) 
    Call CopyTable 

    Dim OLEOBJ As OLEObject 

    For Each OLEOBJ In ActiveSheet.OLEObjects 
     Select Case OLEOBJ.Name 
      Case "ListBox1", "ListBox2", "ListBox3" 
       OLEOBJ.Name = "ListBox1" 
       OLEOBJ.ListFillRange = Sheets("Search Criteria Control").Range("G1:G21").Address(external:=True) 
     End Select 
     Exit For 
    Next 

End Sub 
+0

你可以顯示其餘的代碼? – Davesexcel 2015-01-26 21:03:52

+0

當然,上面加了。讓我知道你是否還有更多想看的東西。感謝您對此感興趣。 – mchac 2015-01-26 21:16:58

+0

請注意,我正在測試兩個TB和兩個LB如何工作。 – mchac 2015-01-26 21:23:02

回答

0

我將專注於您的代碼#5。

首先,如果您要更改ListBox Object的名稱,最好迭代它所屬的Object Collection,因爲您不確定它的名稱。事情是這樣的:

Dim oleobj As OLEObject 
Dim sh As Worksheet: Set sh = ActiveSheet 

For Each oleobj In sh.OLEObjects 
    Select Case oleobj.Name 
    Case "LB1", "LB2", "ListBox1", "ListBox2" 'put the possible names here 
     oleobj.Name = "ListBox1" 'change it to the name you want 
    End Select 
    Exit For 'if you have more than 1 ListBox 
Next 

如果你只是想改變現有ListBox的名稱,然後跳過檢查。

For Each oleobj In sh.OLEObjects 
    oleobj.Name = "ListBox1" 
    Exit For 'if you have more than 1 ListBox 
Next 

現在,值或列表分配給它,您可以直接分配的來源範圍,使用ListFillRange Property你已經更改其名稱後。

oleobj.ListFillRange = Sheets("Search Criteria Control") _ 
    .Range("G1:G21").Address(, , , True) 'add this line within the loop 

請注意,您不需要清除上一個列表。它會自動更新。
因爲我不確定你想完全達到什麼目標,所以我會在這裏停下來。雖然HTH。

+0

好的,謝謝。我將盡快處理併發回。 – mchac 2015-01-26 23:15:56

+0

感謝您介紹select case。我以前沒有用過它。我把上面的代碼放在我的代碼中,但是我做錯了什麼。 ListBox不會更改名稱。我不確定這個板子的規則。我在「回答」中發佈我的代碼時是否有任何問題,以便您能看到我擁有的? – mchac 2015-01-27 01:03:25

+0

@mchac沒有作爲答案,但添加它在你的問題。將其他代碼替換爲您嘗試過但不工作的代碼。 – L42 2015-01-27 01:12:37