Board logo

標題: [發問] VBA下拉式選單(已解決) [打印本頁]

作者: arcticfox    時間: 2011-5-16 22:56     標題: VBA下拉式選單(已解決)

本帖最後由 arcticfox 於 2011-5-19 17:27 編輯

各位大大午安@@"
這次又有一個小問題

如下圖, 我設計了一個客戶管理表, 不過我希望之後所有對話框的下拉式選單"Company"可以引用該表格的客戶欄位
[attach]6216[/attach]

意思就是說, 未來新增的客戶資料, 其中客戶的名字可以被引用到下拉式選單裡面, 如下圖
[attach]6217[/attach]
因為我只會用寫

Private Sub UserForm_Initialize()

Pro_Statu.Combo_Cus.List = Array("xxxx", "xxxx") 之類的

End Sub

不曉得是否有什麼方法可解決此問題? 再麻煩各位大大指導, 謝謝^^
作者: luhpro    時間: 2011-5-16 23:33

回復 1# arcticfox
你可以在 SelectionChange 裡加上判斷式,
只要 A 欄內容有異動就更新該下拉式選單的內容.

先用 Range(Cells(1, 1), Cells([A65535].End(xlUp).Row, 1)) 取得要丟給選單的名稱範圍,
再將其賦予給該選單即可.
作者: arcticfox    時間: 2011-5-16 23:50

好, 謝謝大大
我先試試看^^
作者: Hsieh    時間: 2011-5-16 23:52

將A欄資料定義動態範圍的名稱
ComboBox的RowSource屬性設為該名稱
作者: arcticfox    時間: 2011-5-17 10:57

回復 4# Hsieh

3Q兩位大大的指導, 不過都沒用出來T_T
版主意思是說像下面一樣, 寫法嗎
[attach]6218[/attach]

不過他不讓我設定屬性, 無效的屬性直
我直接在RowSource打 Cus_List
[attach]6219[/attach]

想請問是哪個環節搞錯呢??
作者: chin15    時間: 2011-5-17 11:23

例如:
Private Sub UserForm_Initialize()
Dim i%
i = Range("A65536").End(xlUp).Row
Me.ComboBox1.List = Sheet1.Range("A1:A" & i).Value
End Sub
作者: arcticfox    時間: 2011-5-17 11:36

哇咧~~怎麼和我想的完全不一樣=.=
我先試試看
果然用想的都比實際下去弄還簡單
電腦太笨  還是我太笨XD

3Q各位大大
作者: arcticfox    時間: 2011-5-17 13:59

本帖最後由 arcticfox 於 2011-5-17 14:34 編輯

回復 6# chin15


   一個小問題
我將大大的程式碼改寫如下:


Private Sub UserForm_Initialize()

Dim i%

i = Range("A65536").End(xlUp).Row
Pro_Statu.Combo_Cus.List = Worksheets("客戶資料管理").Range("A1:A" & i).Value

End Sub
不過總是會出現, 執行階段錯誤381 - 無法設定List屬性. 屬性陣列引索不正確

所以我重新把整段程式複製進去
並只改寫了combobox1那個部分

卻得到 : 執行階段錯誤424 - 此處需要物件

作者: Hsieh    時間: 2011-5-17 14:34

回復 5# arcticfox


    [attach]6231[/attach]
作者: arcticfox    時間: 2011-5-17 15:01

本帖最後由 arcticfox 於 2011-5-17 15:11 編輯

回復 9# Hsieh


酷!!  3Q 版大 :'(

不想再多增加版面
在一次3Q各位大大
我終於搞定哩XD
等摸熟再來慢慢試試看自己用寫的方式
:lol
作者: arcticfox    時間: 2011-5-19 14:36

回復 9# Hsieh

我想繼續延續上次版主說的解決辦法
不過要先謝謝版主, 我終於知道"名稱管理"的功用(2010)

另一個小疑問在於, 我是否可以直接在VBA的模組裡直接引用這些設定呢?
如果要引用這些設定, 應該要用什麼方式去做引用


我有試過製作了一個名為Sales
Sales=INDEX(客戶資料管理!$A$2:$D$1000, MATCH(專案紀錄!$C$2:$C$1000, 客戶資料管理!$A$2:$A$1000,0),4)

然後利用錄製巨集的方式記錄錄製,
之所以不願意, 直接在儲存格直接引用, 如下圖:
[attach]6268[/attach]
是因為整個檔案會變很大, 也不美觀

錄好的噹案長這樣
Sub 巨集1()
'
' 巨集1 巨集
'
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "=Sales"
    Range("D3").Select
End Sub

然後我把它改到我的模組裡
Sub 專案紀錄() 'Pro_Statu

Dim NewPro As Range
Dim PN As Range
Dim Cus As Range
Dim Sales_P As Range
Dim EnCus As Range

Sales_P.FormulaR1C1 = "=Sales"

   With Worksheets("專案紀錄")
    Set PN = .Columns(2).Cells.Find(Pro_Statu.Text_PN.Value, LookIn:=xlValues, Lookat:=xlWhole)
    Set Cus = .Columns(3).Cells.Find(Pro_Statu.Combo_Cus.Value, LookIn:=xlValues, Lookat:=xlWhole)
    Set EnCus = .Columns(12).Cells.Find(Pro_Statu.Text_EnCus.Value, LookIn:=xlValues, Lookat:=xlWhole)
   
   
    If Not PN Is Nothing And Not Cus Is Nothing And Not EnCus Is Nothing Then
   
     MsgBox "該客戶已開立此案!  如欲修改,請選擇紀錄維護,謝謝.", vbOKOnly + vbExclamation
            Pro_Statu.Combo_Cus.SetFocus
            Exit Sub
     Else
     
      Set NewPro = .Range("a65536").End(xlUp).Offset(0, 0)
        NewPro.Offset(1, 0) = "Going"
        NewPro.Offset(1, 1) = Pro_Statu.Text_PN
        NewPro.Offset(1, 2) = Pro_Statu.Combo_Cus
       NewPro.Offset(1, 3) = Sales_P
'        NewPro.Offset(1, 4) = Qprice
'        NewPro.Offset(1, 5) = Sprice
        NewPro.Offset(1, 6) = Date
        NewPro.Offset(1, 7) = Date
        NewPro.Offset(1, 8) = Pro_Statu.Text_Model
        NewPro.Offset(1, 9) = Pro_Statu.Combo_App
        NewPro.Offset(1, 10) = Pro_Statu.Text_Qty
        NewPro.Offset(1, 11) = Pro_Statu.Text_EnCus
        NewPro.Offset(1, 12) = Pro_Statu.Combo_Cntry
        NewPro.Offset(1, 13) = Pro_Statu.Text_Cap
        NewPro.Offset(1, 14) = Pro_Statu.Text_Rev
        NewPro.Offset(1, 15) = Pro_Statu.Text_Com
     
    End If

    End With

不過會一直跑出錯誤訊息:
[attach]6269[/attach]

再麻煩大大, 3Q
作者: Hsieh    時間: 2011-5-19 14:53

動態定義範圍的名稱,最大的好處就在於可以因應資料量成長
請注意圖檔中定義名稱的公式
定義好名稱後,在VBA只需引用該名稱就能指定到該範圍
RowSource屬性必須在屬性表內設定
LIST屬性可於表單初始化的同時,將下拉清單的LIST屬性設為該名稱就能使用
  1. Private Sub UserForm_Initialize()
  2. ComboBox1.List = [x].Value
  3. End Sub
複製代碼

作者: arcticfox    時間: 2011-5-19 15:32

回復 12# Hsieh

了解
不過如果是其他用法呢
如:
Sales=INDEX(客戶資料管理!$A$2:$D$1000, MATCH(專案紀錄!$C$2:$C$1000, 客戶資料管理!$A$2:$A$1000,0),4)
我設定了當我選擇了客戶這個選項, 旁邊的業務欄位會自動找尋前一一個表格的內容, 並將其相對應的資料填入此表格中, 詳細如上一個回覆

只是我不管如何引用
如將Sales.Value
都是不行的

不過剛剛大大有提到rowsource的屬性 只能在該屬性內變動
所以我才有此一問
如果我在動態表格內設定了其他的公式
依照大大的講法應該是可以被引用在VBA裡
但是每次的錯誤就是: 未定義變數名稱之類的
讓我有點困擾^^"

真是不好意思, 不過你剛剛說的方法
是沒問題的^^ 我也記下來啦!!
再麻煩了, 謝謝
作者: Hsieh    時間: 2011-5-19 16:03

本帖最後由 Hsieh 於 2011-5-19 17:09 編輯

你的Sales所定義出來的會是甚麼?
INDEX
會傳回根據欄列號碼索引所選取之表格或陣列中一個元素的值
他是一個值,並不是一個陣列或是儲存格參照
當然無法當成LIST
不過應可設成RowSource
你的問題似乎不是在於如何設定下拉清單
而是變數給值的問題
你的客戶選擇後要對應Sales
MATCH(專案紀錄!$C$2:$C$1000, 客戶資料管理!$A$2:$A$1000,0)這是要得到甚麼資料?
我想你應該從定義名稱公式去檢查
作者: arcticfox    時間: 2011-5-19 16:54

回復 14# Hsieh


哈哈  抱歉 抱歉我一直沒說清楚
這不是下拉式選單, 只是因為看到版大用了這招
突然發現, 那個功能也可以定義別的東西
所以就突發奇想, 那如果我把原先要定義的公式也用一個名稱先定義
所以才會有剛剛那個公式
而該公式主要的目的是
為節省輸入所花費的時間
在前一張表格內我有建立了客戶的基本資料與所負責的業務
所以我會希望之後如果有選擇了客戶,  在輸入新開專案的資料同時, 就會自動把負責的業務一同帶入

如果只是單純定義, 然後直接套成公式使用測試後是OK的
不過問題是要寫進VBA裡面, 就不行哩,  我還特別用了FormulaR1C1
還是不行(不過用錄製巨集的方式看該檔案, 裡面確實也是用formulaR1C1)
所以不懂為啥改寫後, 就不行

真是不好意思, 我再繼續研究一下
作者: Hsieh    時間: 2011-5-19 17:09

先看這句
Sales_P.FormulaR1C1 = "=Sales"
在這句之前你有將Sales_P給值嗎?
FormulaR1C1 屬性是儲存格的公式
這儲存格變數必須先SET
Set Sales_P=儲存格
Sales_P.FormulaR1C1 = "=Sales"
這樣才會成立,不然Sales_P是Nothing
我猜你是要把Sales_P指定成名稱Sales
那麼就用Set Sales_P=[Sales]
這純粹猜測,要了解你的思路才能給你正確方向
作者: arcticfox    時間: 2011-5-19 17:18

回復 16# Hsieh


你是神XD
原來如此
對!! 他就是一直nothing
3Q 坂大
這樣我明白哩




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