Board logo

標題: [發問] 想請教表單控制項的幾個疑問 [打印本頁]

作者: united7878    時間: 2015-7-15 19:54     標題: 想請教表單控制項的幾個疑問

板上的前輩們好
我在EXCEL裡的A表做了一個按鈕呼叫表單[attach]21392[/attach]
表單選取範圍為B:H,但按鈕CALL出的表單範圍卻落在A:H
如果不用按鈕直接在快速功能區點選"表單"的話
才會是我要的B:H
然而C欄為下拉式選單,該如何在表單中也出現下拉選單?

另外,在B表裡做了4個按鈕
依序為『首筆、上一筆、下一筆、末筆』
想指定B表B2的編號
首筆=A!A2,上一筆=B2-1,下一筆=B2+1,末筆=A!A欄最後一筆的編號
4個按鈕的語法要如何編寫呢?

謝謝~
作者: GBKEE    時間: 2015-7-18 12:46

本帖最後由 GBKEE 於 2015-7-18 12:48 編輯

回復 1# united7878
試試看
  1. '工作表上須有定義範圍名稱 [database]
  2. '如無 ShowDataForm,以作用中儲存格的延伸範圍作為[database]
  3. '如有 ShowDataForm 會以此[database] 作為表單的範圍
  4. Option Explicit
  5. Sub Ex_表單()
  6.    With ActiveSheet
  7.         .Names.Add "database", .Columns("B:H")
  8.         .ShowDataForm
  9.     End With
  10. End Sub
複製代碼
控制項的程式碼
  1. 'ThisWorkbook 模組的程式碼
  2. Option Explicit
  3. Private Sub Workbook_Open() '檔案開啟時自動執行的程式碼
  4.     工作表2.Ex_設定   '-> SHEETS("B")
  5. End Sub
複製代碼
  1. '工作表2 模組的程式碼 -> SHEETS("B")
  2. Option Explicit
  3. Private Sub Worksheet_Activate()  '在SHEETS("B") 為作用中的工作表時,自動執行
  4.     Ex_設定
  5. End Sub
  6. Sub EX_首()
  7.     With SpinButton1
  8.         .Min = 2
  9.         .Value = .Min  '給值會牽動 上下筆的異動
  10.     End With
  11. End Sub
  12. Sub EX_末()
  13.     With SpinButton1
  14.         .Value = .Max   '給值會牽動 上下筆的異動
  15.     End With
  16. End Sub
  17. Private Sub SpinButton1_Change() '上下筆的異動
  18.     EX
  19. End Sub
  20. Private Sub EX()
  21.     Dim Rng As Range, Ar(), i As Integer
  22.     Set Rng = Range("C3,F3, B6, D6, B8, F7, D2")  '制定員工資料卡上要輸入的儲存格
  23.     Ar = Sheets("A").Range("B" & SpinButton1).Resize(, 7).Value  'SpinButton1上的值導入陣列
  24.     Range("B2") = "'00" & SpinButton1 - 1
  25.     For i = 1 To Rng.Count
  26.         Rng.Areas(i) = Ar(1, i)   'Areas:因員工資料卡上要輸入的儲存格為不連續的範圍
  27.         'Areas 屬性 傳回 Areas 集合,此集合代表多重範圍中的所有範圍。唯讀。
  28.     Next
  29.     Range("j2").Resize(UBound(Ar, 2)) = Application.Transpose(Ar)
  30. End Sub
  31. Sub Ex_設定() 'SpinButton 控制項
  32.     Dim Rng As Range, S As Variant
  33.     With Sheets("A")
  34.         Set Rng = .Range("b1", .Range("b2").End(xlDown)) '姓名欄的資料範圍
  35.     End With
  36.     S = Application.Match(Range("c3"), Rng, 0)           '完全比對 Range("c3")的字串在姓名欄上的列號
  37.     With SpinButton1
  38.         .Max = Rng.Cells(Rng.Count).Row                  '最後的列號
  39.         .Min = 2
  40.         .Value = IIf(IsNumeric(S), S, 2)                 'Range("c3")的字串,有比對到給列號,否給 2
  41.     End With
  42. End Sub
複製代碼

作者: starry1314    時間: 2015-7-19 01:08

回復 1# united7878


    請問這表單是怎麼做的呢?
在VBA視窗看不到關於此功能的代碼
作者: GBKEE    時間: 2015-7-19 07:06

回復 3# starry1314


執行時錄製巨集看看



[attach]21413[/attach]
作者: starry1314    時間: 2015-7-19 17:38

回復 4# GBKEE


    感謝~原來要到自訂功能區 新增!找了一整晚 還以為是將模組隱藏
作者: united7878    時間: 2015-7-20 17:38

回復 2# GBKEE

感謝G大
請問如果要在表單內使用下拉式選單
是否只能設計自訂表單後再做連結?
內建開啟的database表單無法使用?

謝謝指導!!
作者: GBKEE    時間: 2015-7-20 20:12

回復 6# united7878
表單內的程式碼可以,使用內建的database(ShowDataForm)表單.
作者: united7878    時間: 2015-7-20 21:30

回復 7# GBKEE


    請教G大
在自訂表單內如何連結database(ShowDataForm)到自定義的TxetBox呢?
表單內的Button該怎樣編寫與工作表內Button一樣的作用?
[attach]21433[/attach]


謝謝~
作者: GBKEE    時間: 2015-7-22 14:07

回復 8# united7878
試試看
  1. Option Explicit
  2. Dim Ar(), Sh As Worksheet, Msg As Boolean
  3. Dim C_Button()
  4. Private Sub UserForm_Initialize()  '表單未顯示前的表單程式碼事件
  5.     Set Sh = Sheets("A")    'Database所在工作表
  6.     '****************************************************************
  7.     Ar = Array(myA, myB, myC, myD, myE, myF, myG, myH)
  8.     '顯示資料的控制項收集到陣列中
  9.     C_Button = Array(SpinButton1, CommandButton1, CommandButton2, B2)
  10.     '按鈕的控制項收集到陣列中
  11.     '*****************************************************************
  12.    
  13.     myC.AddItem "男"
  14.     myC.AddItem "女"
  15.     Msg = True                          '資料讀取,寫入中
  16.     With SpinButton1
  17.         .Min = 2                        '最小值=第2列號
  18.         .Max = Sh.Cells(Rows.Count, 1).End(xlUp).Row '最大值
  19.         If .Max = 1 Then        '沒有資料
  20.             控制項 False        '控制項不可使用
  21.         Else
  22.             資料讀取 .Value     '有資料:讀取到控制項
  23.         End If
  24.     End With
  25.     Msg = False
  26. End Sub
  27. Private Sub B1_Click()  '新增
  28.     Dim i As Integer
  29.     Msg = True    '資料讀取,寫入中
  30.     控制項 True   '控制項可使用
  31.     With SpinButton1
  32.         .Max = .Max + 1 '新增:增加一列,最大值 + 1
  33.         .Value = .Max   '值要移到最大值
  34.         Ar(0).Caption = Format(.Max - 1, "0000")    '編號
  35.         Sh.Cells(.Max, 1) = .Max - 1                '資料上的編號
  36.         Sh.Cells(.Max, 1).NumberFormatLocal = "0000" '編號的格式
  37.     End With
  38.     For i = 1 To 7
  39.         Ar(i).Value = ""          '清除控制項的值
  40.     Next
  41.     Msg = False
  42. End Sub
  43. Private Sub B2_Click()  '清除
  44.     Dim i As Integer
  45.     Msg = True
  46.     With SpinButton1
  47.         For i = 0 To 7           '清除控制項的值
  48.             If i = 0 Then
  49.                 Ar(i).Caption = ""
  50.             Else
  51.                 Ar(i).Value = ""
  52.             End If
  53.         Next
  54.         Sh.Cells(.Value, 1).Resize(, 8).Delete xlUp  '刪除工作表上(.Value)列
  55.         .Max = .Max - 1        '清除:減少一列,最大值 - 1
  56.         If .Value > .Max Then .Value = .Max '當原本值> 最大值,值=最大值
  57.         If .Max = 1 Then   '沒有資料
  58.             控制項 False   '控制項不可使用
  59.         Else
  60.             '修改刪除後的編號
  61.             With Sh.Range(Sh.Range("A" & .Value), Sh.Range("A" & .Max))
  62.                 .Cells = "=ROW()-1"         '工作表上列號-1
  63.                 .Value = .Value             '公式轉成植
  64.                 .NumberFormatLocal = "0000" '編號的格式
  65.             End With
  66.             Msg = False
  67.             資料讀取 SpinButton1
  68.         End If
  69.     End With
  70. End Sub
  71. Private Sub CommandButton1_Click() '最後一筆
  72.     With SpinButton1
  73.         .Value = .Max
  74.     End With
  75. End Sub
  76. Private Sub CommandButton2_Click() '第一筆
  77.     With SpinButton1
  78.         .Value = .Min
  79.     End With
  80. End Sub
  81. Private Sub myB_Change()
  82.     If Msg = False Then 資料寫入 SpinButton1
  83. End Sub
  84. Private Sub myC_Change()
  85.     If Msg = False Then 資料寫入 SpinButton1
  86. End Sub
  87. Private Sub myD_Change()
  88.     If Msg = False Then 資料寫入 SpinButton1
  89. End Sub
  90. Private Sub myE_Change()
  91.     If Msg = False Then 資料寫入 SpinButton1
  92. End Sub
  93. Private Sub myF_Change()
  94.     If Msg = False Then 資料寫入 SpinButton1
  95. End Sub
  96. Private Sub myG_Change()
  97.     If Msg = False Then 資料寫入 SpinButton1
  98. End Sub
  99. Private Sub myH_Change()
  100.     If Msg = False Then 資料寫入 SpinButton1
  101. End Sub
  102. Private Sub SpinButton1_Change()   '按鍵有移動
  103.         If Msg = False Then 資料讀取 SpinButton1
  104. End Sub
  105. Private Sub SpinButton1_SpinDown()   '按鍵向下移動
  106.      With SpinButton1
  107.         If .Value = .Min Then MsgBox "已是第一筆資料"
  108.      End With
  109. End Sub
  110. Private Sub SpinButton1_SpinUp()     '按鍵向上移動
  111.     With SpinButton1
  112.         If .Value = .Max Then MsgBox "已是第最後一筆資料"
  113.      End With
  114. End Sub
  115. Private Sub 控制項(B As Boolean)
  116.     Dim E As Variant
  117.     For Each E In C_Button
  118.         E.Enabled = B
  119.     Next
  120. End Sub
  121. Private Sub 資料讀取(X As Long)
  122.     Dim i As Integer
  123.     Msg = True   '資料讀取中
  124.     For i = 0 To 7
  125.         If i = 0 Then
  126.             Ar(i).Caption = Sh.Cells(X, 1).Text
  127.         Else
  128.             Ar(i).Value = Sh.Cells(X, i + 1)
  129.         End If
  130.     Next
  131.     Msg = False '資料不在讀取中
  132. End Sub
  133. Private Sub 資料寫入(X As Long)
  134.     Dim i As Integer
  135.     Msg = True   '資料寫入中
  136.     For i = 0 To 7
  137.         If i = 0 Then
  138.             With Sh.Cells(X, 1)
  139.                 .Value = SpinButton1 - 1
  140.                 .NumberFormatLocal = "0000"
  141.             End With
  142.         Else
  143.             Sh.Cells(X, i + 1) = Ar(i).Value
  144.         End If
  145.     Next
  146.     Msg = False  '資料不在寫入中
  147. End Sub
複製代碼

作者: united7878    時間: 2015-7-22 16:09

回復 9# GBKEE

再次感謝GBKEE 大,這表單模組真的太實用了
小弟收下後必虔心鑽研,並發揚光大

請教G大,實作後還有2個小疑問
就是表單設計的自動產生編號"NumberFormatLocal",數字前要加文字可行嗎?
我放了一個"R" & 在"0000"前好像無效
該如何修改?

還有,B表內的B2欄原本可以輸入編號做快查(之前是用函數參照J欄)
[attach]21446[/attach]
但改用VBA撰寫後就無法使用參照快查
這地方要怎樣修正?

謝謝!!!!!




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