Board logo

標題: [發問] 20個相同功能ComboBox如何可以省工撰寫? [打印本頁]

作者: PKKO    時間: 2014-12-1 04:28     標題: 20個相同功能ComboBox如何可以省工撰寫?

本帖最後由 PKKO 於 2014-12-1 04:38 編輯

麻煩各位大大解題了!

以下程式碼為固定的,目的在於"姓"輸入後可自動帶出名子
問題一 : 若有20個相同功能之程式碼,該如何撰寫?可請大大們提供您的撰寫方式嗎?

問題二 : 此程式碼在ComboBox輸入完"我"之後,都會自動帶出後面名稱,例如"我愛你"
但是因為帶出"我愛你",因此下拉式選單變成沒得選,必須要在輸入完"我"之後,將後面預設帶出的名稱刪除
留下"我"一個字,下拉式選單才能出現資料庫開頭為"我"的所有名稱,例如出現"我愛你","我恨你","我好高"之類的
要如何避免這種窘境,輸入完任何字之後,都不會自動帶出,而可以由下拉式選單選取呢?
  1. Private Sub ComboBox1_Change()
  2.     Dim Arr
  3.     '找出相同姓名的延續
  4.     For i = 1 To Range("A65536").End(xlUp).Row
  5.         V = UserForm1.ComboBox1
  6.         L = Len(UserForm1.ComboBox1)
  7.         If Left(Range("A" & i), L) = Left(UserForm1.ComboBox1, L) Then
  8.             Name1 = Name1 & "," & Range("A" & i)
  9.         End If
  10.     Next
  11.     Name1 = Mid(Name1, 2, 10000) '去除","號
  12.     Arr = Split(Name1, ",")
  13.     UserForm1.ComboBox1.List = Arr
  14. End Sub
複製代碼

作者: PKKO    時間: 2014-12-1 11:43

[attach]19680[/attach]

補檔給各位大大,請在表單的姓名欄位輸入:我

就會變成:我愛你

導致無法下拉選單~選別的名稱

要如何才可以輸入:我

但是不會自動帶出來後面的

而是固定只會出現"我"

然後自己選下拉選單後面的名稱呢?

相對的~若是輸入兩碼也是一樣~不要自動帶入第三碼
作者: GBKEE    時間: 2014-12-1 12:56

回復 2# PKKO

是這樣嗎?
  1. Dim Arr
  2. Private Sub ComboBox17_Change()
  3.     Dim i As Long
  4.     '找出相同姓名的延續
  5.     Name1 = ComboBox17.Value
  6.     For i = 1 To Range("A65536").End(xlUp).Row
  7.         If Range("A" & i) Like ComboBox17 & "*" Then
  8.             Name1 = Name1 & "," & Range("A" & i)
  9.         End If
  10.     Next
  11.     Arr = Split(Name1, ",")
  12.     UserForm1.ComboBox17.List = Arr
  13.     UserForm1.ComboBox17 = Arr(0)
  14. End Sub
複製代碼

作者: stillfish00    時間: 2014-12-1 16:39

回復 2# PKKO
Combobox 有個 AutoWordSelect 屬性,改為 False 就不會自動帶出
作者: PKKO    時間: 2014-12-2 05:28

回復 3# GBKEE


    超版您的方法我試過了,我自己也有這樣做過,但實際上輸入完第一個字之後,還是會自動帶出後面的呢!
作者: PKKO    時間: 2014-12-2 05:29

回復 4# stillfish00


    stillfish00大大您好,您的建議很好,但小弟使用後跟原本一樣,還是會自動帶出後面的呢!
作者: PKKO    時間: 2014-12-2 05:31

至於問題一 : 若有20個相同功能之程式碼,該如何撰寫?可請大大們提供您的撰寫方式嗎?
小弟的作法是用出20個
Private Sub ComboBox1_Change()
相同程式碼xx
End Sub
然後用取代的方式,將指定選取的部分由ComboBox1取代為ComboBox2
不曉得各位大大有更好的方式嗎?
作者: stillfish00    時間: 2014-12-2 13:46

回復 6# PKKO
呃抱歉,那可能是我誤會那個屬性了,
至於問題一,置頂帖 "本版值得關注的主題將陸續增加" 裡面 22 有
主要是用物件類別來管理共同事件,你可以自己試試看
作者: PKKO    時間: 2014-12-2 14:07

回復 8# stillfish00


    ok
作者: GBKEE    時間: 2014-12-2 14:26

回復 5# PKKO
   
表單的姓名欄位輸入:我
就會變成:我愛你
導致無法下拉選單~選別的名稱
要如何才可以輸入:我
但是不會自動帶出來後面的
請問你要帶出來的是什麼?
至於問題一 : 若有20個相同功能之程式碼,該如何撰寫?

請搜尋 討論區的內文 "物件模組" 看看
作者: PKKO    時間: 2014-12-2 22:01

回復 10# GBKEE


    超版大大,我不想要有"自動帶出"的功能,只想要原始輸入值

舉例:資料庫裡面有.連勝文,連戰,連連看

目前的程式,我輸入一個字"連",後面會自動帶出"勝文"

導致我按下拉式選單時,已無可選擇....只有連勝文可選

我只想要當我輸入"連",他就只有"連"一個字(不會自動帶出後面的字)

此時我點選下拉式選單,就可以選擇"連勝文","連戰","連連看"
作者: GBKEE    時間: 2014-12-3 06:18

回復 11# PKKO
第3#的程式碼不是這樣嗎?
  1. Dim Arr
  2. Private Sub ComboBox17_Change()
  3.     Dim i As Long
  4.     '找出相同姓名的延續
  5. .    Name1 = ComboBox17.Value   '輸入的字串
  6.     For i = 1 To Range("A65536").End(xlUp).Row
  7.         If Range("A" & i) Like ComboBox17 & "*" Then '儲存格字串的開頭與ComboBox17("輸入的字串")相同
  8.             Name1 = Name1 & "," & Range("A" & i)
  9.         End If
  10.     Next
  11.     Arr = Split(Name1, ",")
  12.     UserForm1.ComboBox17.List = Arr
  13.     UserForm1.ComboBox17 = Arr(0) ',下拉式選單 在第一個位置出現顯示你輸入的字串
  14. '點選下拉式選單,可以選擇"連勝文","連戰","連連看"
  15. End Sub
複製代碼

作者: PKKO    時間: 2014-12-3 22:40

回復 10# GBKEE


    程式已經設定好,會依據目前輸入的字數,去搜尋相關位置的資料,達成下拉式選單可以出現選取的部分
例如資料有"我愛你","我愛他","我好高"

我希望輸入"我"一個字,可以用下拉選單選取"我愛你","我愛他","我好高"  這三項的其中一項
但目前不行

原因為:輸入"我"一個字之後,下拉式選單的輸入位置會"自動帶出"後面兩個字,變成"我愛你"
導致下拉選單只剩下"我愛你"可選

有沒有辦法不要"自動帶出"的功能,不然我輸入"我"之後,要自己把後面"自動帶出"的部分刪除才能達到下拉功能
但我同時也希望我輸入"我愛"之後能出現,"我愛你","我愛他"可選,因此不能把程式設定為只抓第一個字母,
而是有輸入幾個字,就尋找幾個字的資料,重點只有一個,如何能夠"不要自動帶出後面的字"
麻煩大大了
作者: GBKEE    時間: 2014-12-4 07:25

回復 13# PKKO
3#程式碼
ComboBox17 輸入"我好"之後, 點選 ComboBox17動作後的圖示 這是你要的效果嗎?

[attach]19697[/attach]
作者: PKKO    時間: 2014-12-5 01:02

本帖最後由 PKKO 於 2014-12-5 01:08 編輯

回復 3# GBKEE


    超版大大您好,我按照您的方式,輸入"我"之後

還是會自動帶出"好高"兩個字,必須手動先將"好高"刪除

才可以變成您的圖片的樣子

是否可以不要自動帶出(因為自動帶出的~使用者必須要先刪除)

晚點再補上照片給您看
作者: GBKEE    時間: 2014-12-5 15:47

回復 15# PKKO


   
是否可以不要自動帶出(因為自動帶出的~使用者必須要先刪除)
請說明(不了解:使用者必須要先刪除)
作者: PKKO    時間: 2014-12-6 06:36

回復 16# GBKEE


    [attach]19711[/attach]

使用大大您的程式之後,確實輸入"我",只會出現"我"

但是從第二次開始,只要輸入"我",都會自動帶出"好高"(如圖片所示)

若是關閉USERFORM再打開,第一次都會正常,但第二次開始之後每一次都會自動帶出"好高"

不知為何..

而若是把自動帶出的"好高"用手動刪除,確實下拉選單是會出現"我","我好高","我好矮"

但使用者每次都要把自動帶出的文字刪除,實在頗為不便...麻煩大大了,抱歉
作者: GBKEE    時間: 2014-12-6 07:23

回復 17# PKKO
用滑鼠選,不要用鍵盤選
作者: PKKO    時間: 2014-12-6 07:45

回復 18# GBKEE


    我都是用滑鼠點的,一樣會自動帶出,如果真的沒辦法的話,我就規定只會篩選第一個字母,就不能篩選一個字以上,

但自動帶出的問題就會被解決,目前只有想到這個方式,感謝您!!
作者: GBKEE    時間: 2014-12-6 09:29

回復 19# PKKO
表單加一TextBox控制項 試試看
  1. Option Explicit
  2. Private Sub TextBox1_Change()
  3.     Dim i As Long, Name1, Arr
  4.     For i = 1 To Range("A65536").End(xlUp).Row
  5.         If Range("A" & i) Like Trim(TextBox1) & "*" And Trim(TextBox1) <> "" Then
  6.             Name1 = Name1 & "," & Range("A" & i)
  7.         End If
  8.     Next
  9.     Arr = Split(Mid(Name1, 2), ",")
  10.     With ComboBox17
  11.         If UBound(Arr) <> -1 Then
  12.             .List = Arr
  13.             .Value = Arr(0)
  14.         Else
  15.             .Clear
  16.         End If
  17.     End With
  18. End Sub
  19. Private Sub ComboBox17_Change()
  20.     ComboBox17.DropDown
  21. End Sub
複製代碼

作者: PKKO    時間: 2014-12-6 12:43

回復 20# GBKEE


    感謝超版大大,但如此的話,會太複雜,因為我有非常多個都需要下拉式選單

每一個下拉式選單都要搭配一個textbox 可能暫不考慮

還是先捨去逐字篩選的功能,而選擇只能用第一個字篩選好了
作者: GBKEE    時間: 2014-12-6 13:50

本帖最後由 GBKEE 於 2014-12-6 13:53 編輯

回復 21# PKKO

[attach]19713[/attach]
  1. Option Explicit
  2. Dim UserComboBox() As New Class1
  3. Private Sub UserForm_Initialize() '表單初始化的事件
  4.     Dim e As Control, i As Integer
  5.     For Each e In Me.Controls
  6.         If InStr(e.Name, "ComboBox") Then
  7.             ReDim Preserve UserComboBox(0 To i)
  8.             Set UserComboBox(i).xlComBox = e
  9.             i = i + 1
  10.         End If
  11.     Next
  12. End Sub
  13. Private Sub CommandButton1_Click()
  14.     Unload Me   '關閉表單
  15. End Sub
複製代碼
[ Class1 ] (物件類別模組)的程式碼
  1. Option Explicit
  2. Public WithEvents xlComBox As MSForms.ComboBox
  3. Private Sub xlComBox_DropButtonClick()  '按下ComboBox下拉箭頭按鈕
  4.     Dim i As Long, S As String, Name1 As String, Arr As Variant
  5.     If xlComBox.ListIndex > -1 Then Exit Sub
  6.     'ComboBox的值,不在ComboBox.List的清單中選取的: ComBox.ListIndex=-1
  7.     S = UCase(Trim(UserForm1.TextBox1))
  8.     For i = 1 To Range("A65536").End(xlUp).Row
  9.         If UCase(Range("A" & i)) Like S & "*" And S <> "" Then
  10.             Name1 = Name1 & "," & Range("A" & i)
  11.         End If
  12.     Next
  13.     Arr = Split(Mid(Name1, 2), ",")
  14.     With xlComBox
  15.         If UBound(Arr) > -1 Then
  16.             .List = Arr
  17.             .Value = Arr(0)
  18.         Else
  19.             .Clear
  20.         End If
  21.         .DropDown
  22.     End With
  23. End Sub
複製代碼

作者: PKKO    時間: 2014-12-6 13:58

回復 22# GBKEE

哇,小弟沒看過這個東西,研究一下先,感謝大大!
作者: stillfish00    時間: 2014-12-8 11:04

本帖最後由 stillfish00 於 2014-12-8 11:12 編輯

回復 23# PKKO
新增物件類別模組 clsComboBox
  1. Private WithEvents mComboBox As MSForms.ComboBox

  2. Public Sub InitialControl(ByRef oControl)
  3.   Set mComboBox = oControl
  4. End Sub

  5. Private Sub mComboBox_Change()
  6.   mComboBox.Clear
  7. End Sub

  8. Private Sub mComboBox_DropButtonClick()
  9.   Dim ar, i As Long, j As Long
  10.   ar = Application.Transpose(Range([A1], [A1].End(xlDown)))
  11.   For i = 1 To UBound(ar)
  12.     If ar(i) Like mComboBox.Text & "*" Then
  13.       j = j + 1
  14.       ar(j) = ar(i)
  15.     End If
  16.   Next
  17.   
  18.   If j > 0 Then
  19.     ReDim Preserve ar(1 To j)
  20.     mComboBox.List = ar
  21.   End If
  22. End Sub
複製代碼
UserForm:
  1. Private gcolComboBoxs As Collection

  2. Private Sub UserForm_Initialize()
  3.   Dim oComboBox As clsComboBox, x
  4.   
  5.   Set gcolComboBoxs = New Collection
  6.   
  7.   For Each x In Me.Controls
  8.     If StrComp(TypeName(x), "ComboBox", vbTextCompare) = 0 Then
  9.       Set oComboBox = New clsComboBox
  10.       oComboBox.InitialControl x
  11.       gcolComboBoxs.Add oComboBox
  12.     End If
  13.   Next
  14. End Sub
複製代碼

作者: PKKO    時間: 2015-1-3 20:39

回復 22# GBKEE

感謝超版大大的用心
小弟也想到了一個方法可以解決這個問題
使用DropButtonClick就不會有這個問題了
已可成功解決,非常感謝超版大大




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)