麻辣家族討論版版's Archiver

昱得資訊

baiecesi 發表於 2012-8-16 01:08

EXCEL 表單內下拉式選單與儲存格連結

各位大大您好:
小弟想於VBA表單中加入一下拉式選單.
而原本的EXCEL儲存格已經有下拉式選單了.
是用了資料驗證及判斷式等一堆式子構成的.
有沒有方法直接將表單下拉式選單內容直接等於
現有的下拉式儲存格內的下拉內容
而不需要重新重抓源頭資料的語法呢?

如果當初EXCEL有定義名稱的話我曉得如何做..
但當初我都沒定義QQ..太多下拉式選單>"<
感謝各位大大幫忙賜教

baiecesi 發表於 2012-8-16 13:33

[attach]12142[/attach]
範例檔如上..因為當初選單沒設名稱定義
類似範例中一樣..範例中我只列出幾個..
實際上當初製作時做了好幾十個這種資料驗證中加入判別式的語法
若要一一改成定義名稱讓VBA表單下拉會花很長一段時間..而且有可能亂掉
所以想要請教的是是否有直接將用語法使表單中下拉內容=儲存格下拉內容(如有判斷式一同複製過去)
感謝各位大大不吝指教>"<

Hsieh 發表於 2012-8-16 15:37

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=42450&ptid=7488]2#[/url] [i]baiecesi[/i] [/b]
表單的排列與儲存格輸入的排列方式不同,將無法做對應動作
就算你定義完名稱還是要一一的填入
而且因為儲存格驗證是連動性的
你還必須將表單的下拉值輸入到對應的儲存格內才行
要考慮表單與工作表之間的互動關係,重新安排你的表單

baiecesi 發表於 2012-8-16 15:56

恩..感謝Hsieh大..大概了解您的意思了..
也就是說表單裡控制項要與儲存格做下拉連動
來源仍然得重輸.

我在想是不是因為EXCEL內設計的下拉與
VBA的下拉原本是兩個分開的開發原理
所以即使結合後目前仍無法將其視為同一物件原理來達到同步的效果
突然想到可能是因為這樣,不知對不對>"<

那小弟突然衍生出一個問題
於EXCEL中 儲存格內會隨著儲存格移動同步改變對應儲存格(如果不加上$的話)
我擔心若我將上述的東西重新輸入表單後
若之後儲存格位置變動了
VBA有無方法一起同步改變對應的儲存格
比如說:EXCEL中我將B1移至E2
VBA能夠自動將Sheet1.cells(1,2)變成Sheet1.cells(2,5)嗎@@?

GBKEE 發表於 2012-8-16 16:15

[i=s] 本帖最後由 GBKEE 於 2012-8-16 16:17 編輯 [/i]

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=42467&ptid=7488]4#[/url] [i]baiecesi[/i] [/b]
依你附檔的表單所寫的程式碼 試試看 應是這方面的作法[code]Dim Ar()
Private Sub UserForm_Initialize()
'Initialize 事件  發生在一個物件載入後,但尚未顯示的時候。
    ComboBox3.List = Array("Type1", "Type2", "Type3")   'B(總值) 的選項
    'B(總值) 的選項 可指向工作表的位置
    ReDim Ar(UBound(ComboBox3.List))           '重置陣列元素數
    '------因子選項  可指向工作表的位置
    Ar(0) = Array(1.15, 1.25)                  'B(總值) 選項1 的因子選項
    Ar(1) = Array(2.5, 5)                      'B(總值) 選項2 的因子選項
    '------選項3 的因子選項 請自修改
  '  Ar(2) = Array(2.5, 5)                      'B(總值) 選項3 的因子選項
    TextBox1.TabIndex = 1                      '重新設定表單上控制項的 TabIndex 順序
    ComboBox3.TabIndex = 2
    ComboBox1.TabIndex = 3
End Sub

Private Sub ComboBox3_Change()
    ComboBox1.Clear
    Label5.Caption = ""
    If ComboBox3.ListIndex > -1 Then ComboBox1.List = Ar(ComboBox3.ListIndex)
   
End Sub
Private Sub CommandButton1_Click()
    Dim xT(1 To 3) As Double
    If ComboBox3.ListIndex = -1 Or ComboBox3.ListIndex = -1 Then
        Label5.Caption = "ComboBox1.Text * ComboBox3.Text"
    Else
        Select Case ComboBox3.ListIndex       '
            Case 0                            'Type1
                xT(1) = 7.58
                xT(2) = 0.8
            Case 1                            'Type2
                xT(1) = 7.9661
                xT(2) = 0.8
            Case 2                            'Type3
                xT(1) = 8.1238
                xT(2) = 0.7243
        End Select
        xT(3) = Application.Evaluate("Exp(" & xT(1) & "+" & xT(2) & "* Ln(" & Val(TextBox1) & "))") / 1000
        Label5.Caption = Round((550 / 500) * xT(3) * Val(ComboBox1), 2)
    End If
End Sub
Private Sub CommandButton2_Click()
    End
End Sub
[/code]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供