Board logo

標題: [發問] (謝謝恩師們,7/4完成) 關於自訂表單TextBox輸入關鍵字出現資料(附範例) [打印本頁]

作者: av8d    時間: 2012-6-26 11:32     標題: (謝謝恩師們,7/4完成) 關於自訂表單TextBox輸入關鍵字出現資料(附範例)

本帖最後由 av8d 於 2012-7-4 19:58 編輯

關於自訂表單TextBox輸入關鍵字出現資料(範例如下)
http://forum.twbts.com/viewthrea ... hlight=%C3%F6%C1%E4

在自訂表單製作一個TextBox3
若C1=100  C2=15
當TextBox3輸入"1"這個字~則會出現以上兩個選項可以點選

在自訂表單製作一個TextBox4
若D1=大房豆干  D2=大眾房屋
當TextBox4輸入"大"這個字~則會出現以上兩個選項可以點選

以此類推~謝謝各位大大的用心觀看

謝謝G大正向逆推思考的邏輯方式~超感激的!!謝謝你!!
作者: GBKEE    時間: 2012-6-26 13:43

回復 1# av8d
試試看


    [attach]11494[/attach]
作者: av8d    時間: 2012-6-26 18:48

回復 2# GBKEE


    大大的回覆真的是超級快@@ 由衷感謝~

想詢問一下~如果我希望當ComboBox選到想要的選項後TextBox自動填入該資料
我測試了很多次好像都不可以~

Sub ComboBox1_Click()
TextBox1=ComboBox1
End Sub

我好像想得太簡單了@@
作者: GBKEE    時間: 2012-6-26 20:51

回復 3# av8d
那在改一下了

[attach]11496[/attach]
作者: av8d    時間: 2012-6-26 21:42

本帖最後由 av8d 於 2012-6-26 22:37 編輯

回復 4# GBKEE


    謝謝大大~最後一次麻煩大大
請問ComboBox內的值若是重複~是否可以只顯示一筆?
作者: register313    時間: 2012-6-26 23:46

回復 5# av8d
  1. Private Sub UserForm_Initialize()
  2.     Dim d As Object, A
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     With ActiveSheet
  5.         For Each A In .Range("b2", .[b2].End(xlDown))
  6.           d(A.Value) = ""
  7.         Next A
  8.         ComboBox1.List = Application.Transpose(d.keys)
  9.         d.RemoveAll
  10.         For Each A In .Range("c2", .[c2].End(xlDown))
  11.           d(A.Value) = ""
  12.         Next A
  13.         ComboBox2.List = Application.Transpose(d.keys)
  14.     End With
  15. End Sub
複製代碼

作者: dechiuan999    時間: 2012-6-27 08:04

回復 2# GBKEE


    版主大大您好:

  在關鍵字輸入範例裡,
小弟對於下列語法
的應用不是很了解,
煩請版主大大能明示。

一、
.Replace "*" & TextBox1 & "*", "=what this", xlPart

為何用"=what this",小弟有在工作表上的輸入值地方有看到
顯示為=what this不知其用意為何?

二、
.SpecialCells(xlCellTypeFormulas, xlErrors).Name = "xxx"
此語法小弟一直不懂得如何去應用及驗證呢?
在TEXTBOX1輸入查詢時,在B欄儲存格會出現#NAME?

三、
With ComboBox1
     For Each E In [XXX]
       .AddItem E.Value
     Next
.Value = .List(0)
    End With
為何區域變數看不到
有此物件變數[XXX],
又此物件變數由何而來呢?

謝謝版主大大。
作者: GBKEE    時間: 2012-6-27 08:37

本帖最後由 GBKEE 於 2012-6-27 10:36 編輯

回復 7# dechiuan999
Replace "*" & TextBox1 & "*", "=what this", xlPart
為何用"=what this",小弟有在工作表上的輸入值地方有看到  

就是沒有啊  會產生一個 #NAME?錯誤值
.SpecialCells(xlCellTypeFormulas, xlErrors).Name = "xxx"
此語法小弟一直不懂得如何去應用及驗證呢?

為何區域變數看不到
有此物件變數[XXX],
又此物件變數由何而來呢?


試試看 [A1:D10].NAME="dechiuan999"
到工作表 查看定義名稱 看看    [ 物件或函數 不可以為變數 ]

回復 5# av8d
  1. Private Sub UserForm_Initialize()
  2. With ActiveSheet
  3. .Range("b:b").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  4. 'AdvancedFilter 進階篩選: 不重複資料, 資料複製到其他位置
  5. ComboBox1.List = .Cells(1, .Columns.Count).CurrentRegion.Offset(1).Value '
  6. .Cells(1, .Columns.Count).EntireColumn = ""
  7. .Range("c:c").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  8. ComboBox2.List = .Cells(1, .Columns.Count).CurrentRegion.Offset(1).Value '
  9. .Cells(1, .Columns.Count).EntireColumn = ""
  10. End With
  11. End Sub
複製代碼

作者: av8d    時間: 2012-6-27 10:00

回復 6# register313


    大大您好~如果我套用到我目前有寫了很多其他的裡面~
會出現錯誤'424'
此處需要物件

[attach]11498[/attach]
作者: GBKEE    時間: 2012-6-27 10:06

回復 9# av8d
沒有物件 那須先檢查  UserForm1 中有沒有TextBox1 看看
作者: av8d    時間: 2012-6-27 10:16

回復 10# GBKEE


    [attach]11499[/attach]
作者: av8d    時間: 2012-6-27 10:19

本帖最後由 av8d 於 2012-6-27 10:24 編輯

好像就是卡到UserForm1的地方
作者: GBKEE    時間: 2012-6-27 10:34

回復 12# av8d
附檔看看
作者: av8d    時間: 2012-6-27 13:14

回復 13# GBKEE


    大大~可以了~我看到許多大大都會使用Option Explicit
Option Explicit的意義是在程式模組中強迫每個在程式模組�堛瘍僂くㄔ眸楨�確完整的宣告和定義其名稱,範圍與型別.
Option Explicit 陳述式必須出現在模組中所有程序之前(即最頂端)
當 Option Explicit 在模組中使用時,所有的變數必須以 Dim, Private、Public、ReDim 或 Static 陳述式來明確宣告。
在模組中如果使用Option Explicit ,在程式中如未宣告變數的名稱,則在編譯階段時,會發生錯誤。
如果沒有使用 Option Explicit 陳述式,則所有未宣告的變數都是 Variant 型態,除非預設的型態另以 Deftype 陳述式所指定過。
Option Explicit 可避免打錯變數名稱或在有效範圍內設定兩個相同的變數名稱。


最主要是不是避免打錯變數名稱~但是這樣每次都必須用Dim, Private、Public、ReDim 或 Static 陳述式來明確宣告。
意思是不是說
如果我隨意設定
a=textbox1
for i =1 to 3
a=a+1
next i

這樣是否會出現錯誤~
我發現我之前所做的都沒用Option Explicit~現在要來一個一個除錯會不會還來的急嗎?
作者: GBKEE    時間: 2012-6-27 16:39

回復 14# av8d
Option Explicit  主要是可避免打錯變數名稱 ,使得程式運行中,找不出錯誤在哪裡
Textbox  是表單內控制項的關鍵字, 要避免始用 .
作者: dechiuan999    時間: 2012-6-27 17:45

回復 8# GBKEE


    版主大大您好:

謝謝您的說明
小弟已理解name
在此的用意
Sub aa()
   
    Dim mSht As Worksheet
    Dim mRng As Range, E As Range
    Set mSht = Worksheets(1)
    With mSht
        Set mRng = .Range("a1:c5")
            mRng.Name = "NewName"
            [newname].Select
        For Each E In [newname]
            MsgBox E.Address
        Next
        
    End With
End Sub


感恩大大!
作者: av8d    時間: 2012-6-28 17:00

本帖最後由 av8d 於 2012-7-4 14:10 編輯

回復 6# register313

Private Sub UserForm_Initialize()

    Dim d As Object, A

    Set d = CreateObject("Scripting.Dictionary")

    With ActiveSheet

        For Each A In .Range("d2", .[d2].End(xlDown))

          d(A.Value) = ""

        Next A

        ComboBox1.List = Application.Transpose(d.keys)

        d.RemoveAll

        For Each A In .Range("e2", .[e2].End(xlDown))

          d(A.Value) = ""

        Next A

        ComboBox2.List = Application.Transpose(d.keys)

    End With

End Sub
---------------------------------------------------------------------
ComboBox1 = D欄
ComboBox2 = E欄

若D1=早餐  D2=午餐  D3=早餐
若E1=豬肉  E2=雞肉  E3=牛肉

當ComboBox1選到早餐的時候,ComboBox2是否能只顯示豬肉和牛肉,因為雞肉是午餐的所以過濾該筆。
作者: GBKEE    時間: 2012-6-28 17:37

本帖最後由 GBKEE 於 2012-6-28 17:48 編輯

回復 17# av8d
  1. Option Explicit
  2. Dim d As Object
  3. Private Sub UserForm_Initialize()
  4.     Dim A As Range
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     With ActiveSheet
  7.         For Each A In .Range("d2", .[d2].End(xlDown))
  8.           d(A.Value) = IIf(d(A.Value) = "", A.Offset(, 1).Value, d(A.Value) & "," & A.Offset(, 1))
  9.         Next
  10.         ComboBox1.List = d.KEYS
  11.     End With
  12. End Sub
  13. Private Sub ComboBox1_Change()
  14.     If ComboBox1.ListIndex > -1 Then
  15.         ComboBox2.List = Split(d(ComboBox1.Value), ",")
  16.         ComboBox2.Value = ComboBox2.List(0)
  17.     End If
  18. End Sub
複製代碼
[attach]11520[/attach]
作者: av8d    時間: 2012-6-28 20:39

本帖最後由 av8d 於 2012-6-28 21:06 編輯

回復 18# GBKEE


問題解決~謝謝!
作者: GBKEE    時間: 2012-6-28 21:13

回復 19# av8d
Dim d As Object 這程式碼 你放在哪裡   
如果如下宣告兩次
  1. Dim d As Object  '1 模組 的頂端 宣告變數  為此模組的私用變數  此模組中程序皆可用的變數
  2. Private Sub UserForm_Initialize()
  3.     Dim d As Object    '2 在程序中 宣告變數    '*** 這裡不要宣告了
  4.    Set d = CreateObject("Scripting.Dictionary")  
  5. '這d 是   UserForm_Initialize 程序的  並不是 模組頂端的d
複製代碼

作者: av8d    時間: 2012-6-28 22:30

本帖最後由 av8d 於 2012-6-28 22:40 編輯

回復 20# GBKEE


    由於我無法使用Option Explicit因為我大多數內容都沒+Option Explicit
導致變數我沒有一個一個去設定~一直出錯~所以我打算改到Module
然後用Call的方式呼叫~可是會出錯~在Module的寫法是否也差異?

Option Explicit
Dim d As Object
Sub UFI()
    Dim A As Range
    Set d = CreateObject("Scripting.Dictionary")
    With ActiveSheet
        For Each A In .Range("d2", .[d2].End(xlDown))
          d(A.Value) = IIf(d(A.Value) = "", A.Offset(, 1).Value, d(A.Value) & "," & A.Offset(, 1))
        Next
        ComboBox1.List = d.KEYS
    End With
End Sub
Sub CBC()
    If ComboBox1.ListIndex > -1 Then
        ComboBox2.List = Split(d(ComboBox1.Value), ",")
        ComboBox2.Value = ComboBox2.List(0)
    End If
End Sub

我利用Call呼叫UFI或CBC都會出錯~卡到變數問題~
作者: Hsieh    時間: 2012-6-28 22:49

回復 21# av8d

一般模組內呼叫表單物件,必須指明物件
例如:UserForm1.ComboBox1
作者: av8d    時間: 2012-6-28 22:53

回復 22# Hsieh


    謝謝大大~
我後來刪除Option Explicit~就可以了~
因為先前我沒有把每個變數都加上Dim宣告的動作~
因為宣告種類我還不熟悉~所以就沒去宣告@@
作者: GBKEE    時間: 2012-6-29 06:58

回復 21# av8d
由於我無法使用Option Explicit因為我大多數內容都沒+Option Explicit 導致變數我沒有一個一個去設定~一直出錯~
這是不好的習慣,要立即改掉
如圖 會在新模組中自動在頂端加入  Option Explicit

[attach]11525[/attach]
作者: av8d    時間: 2012-7-4 14:10

本帖最後由 av8d 於 2012-7-4 15:19 編輯

回復 18# GBKEE

原答案最後結果是當選到D欄CB的早餐~E欄CB只顯示豬肉牛肉
但是現在D欄的的CB的早餐內E欄CB的豬肉有兩筆希望只顯示一筆~如下
   
若D1=早餐  D2=午餐  D3=早餐  D4=早餐
若E1=豬肉  E2=雞肉  E3=牛肉  E4=豬肉

E1和E4重複~只顯示一筆~該如何結合呢?
作者: GBKEE    時間: 2012-7-4 16:36

回復 25# av8d
  1. ption Explicit
  2. Dim d As Object
  3. Private Sub UserForm_Initialize()
  4.     Dim A As Range, W As String
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     With ActiveSheet
  7.         For Each A In .Range("d2", .[d2].End(xlDown))
  8.             If d(A.Value) = "" Then
  9.                 d(A.Value) = A.Offset(, 1).Value
  10.             Else
  11.                 W = "," & d(A.Value) & ","   '字典物件內容前後加上 ,
  12.                 If InStr(W, "," & A.Offset(, 1) & ",") = 0 Then d(A.Value) = d(A.Value) & "," & A.Offset(, 1)
  13.                 'InStr(w, "," & A.Offset(, 1) & ",") = 0 比對字典物件內容有無A.Offset(, 1)的字串
  14.             End If
  15.         Next
  16.         ComboBox1.List = d.KEYS
  17.     End With
  18. End Sub
複製代碼

作者: av8d    時間: 2012-7-5 09:09

本帖最後由 av8d 於 2012-7-5 13:55 編輯

回復 26# GBKEE


    遇到另一個問題~請教大大

如果我想對A欄做相同範例
但是我只想取年Year()重複則只顯示一筆

例如:
A1=2012/06/25 A2=2012/10/10 A3=2013/8/8
所以只取年則是A1=2012 A2=2012 A3=2013
重複則只顯示一筆所以ComboBox1則會出現2012和2013的選項可以選擇

我修改了一下6樓大大的程式如下
    Dim d As Object, A
    Set d = CreateObject("Scripting.Dictionary")
    With ActiveSheet
        For Each A In .Range("a2", .[a2].End(xlDown))
          d(Year(A.Value)) = ""
        Next A
        ComboBox1.List = Application.Transpose(d.KEYS)
    End With
即可完成~不知這樣是否可行!?
作者: GBKEE    時間: 2012-7-5 14:30

回復 27# av8d
即可完成~不知這樣是否可行!?
你試了嗎? 有達到你的效果就可以阿.
作者: av8d    時間: 2012-7-10 15:18

本帖最後由 av8d 於 2012-7-11 12:09 編輯

回復 28# GBKEE


    G大~謝謝你~您寫的都可以使用~
作者: c_c_lai    時間: 2012-7-28 10:37

回復 29# av8d
回復 28# GBKEE
附上我修正後之 GBKEE 大大的範例供你參考:
[attach]11891[/attach]




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