返回列表 上一主題 發帖

[發問] VBA下拉式選單(已解決)

回復 9# Hsieh

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

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


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

然後利用錄製巨集的方式記錄錄製,
之所以不願意, 直接在儲存格直接引用, 如下圖:

是因為整個檔案會變很大, 也不美觀

錄好的噹案長這樣
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

不過會一直跑出錯誤訊息:


再麻煩大大, 3Q

TOP

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

TOP

回復 12# Hsieh

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

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

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

真是不好意思, 不過你剛剛說的方法
是沒問題的^^ 我也記下來啦!!
再麻煩了, 謝謝

TOP

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

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

TOP

回復 14# Hsieh


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

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

真是不好意思, 我再繼續研究一下

TOP

先看這句
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]
這純粹猜測,要了解你的思路才能給你正確方向
學海無涯_不恥下問

TOP

回復 16# Hsieh


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

TOP

        靜思自在 : 原諒別人就是善待自己。
返回列表 上一主題