Board logo

標題: [發問] VBA 表單功能發問 [打印本頁]

作者: v03586    時間: 2023-1-1 11:44     標題: VBA 表單功能發問

各位前輩, 小弟想建立一個表單式功能的程式設計
內含功能有   建立資料/編輯資料/查詢資料 等功能應用

建立資料
1. 機台號碼欄位只能輸入 兩個數字
2. 製程類別只能點選一個
3. 厚度只能輸入 三個數字
4. 回溫日期 四個數字 MMDD
5. ID 則是 4個文字或數字都可以
6. 按下建立條碼後資料會跑到Excel Database 對應的欄位
    A欄位=Now()
7. 按下建立條碼後會產生一個序號在Database G欄位
規則如下面圖片, 生產日= Now 的MMDD, 之後依序合併起來成為一組序號, 後兩碼流水號是避免當天會有重複條件
[attach]35708[/attach]

編輯資料
1.輸入序號列會帶出該筆資料的資訊
2.文字方塊未輸入序號無法輸入資料, 序號有輸入後才可以編輯資料
3.編輯完成就更新Excel Database資料
[attach]35709[/attach]


查詢資料
1.查詢資料只能查詢不能修改資料
2.輸入序號碼就可以帶出資訊
[attach]35710[/attach]

查詢過期
1. Excel E欄位 +90Days 超過會顯示出來清單內
[attach]35712[/attach]

取出資料
1.輸入條碼序號會顯示該序號的下列資訊
2.輸入MH ID , 會把該序號從Database轉換到 MH Database的資料表 ,MH Database" I欄位" Now()
[attach]35713[/attach]

列印條碼
1.是否能將產生出來的條碼序號轉換成條碼文字格式
2.列印長度 6CM 寬度 1CM

[attach]35714[/attach]
作者: singo1232001    時間: 2023-1-3 19:30

回復 1# v03586


    目前只有做建立資料
作者: v03586    時間: 2023-1-4 07:06

回復 2# singo1232001


    感謝大大的幫忙...小弟我自己也努力在看看其他有哪些功能是自己可以新增的!! 目前還卡關中
作者: 准提部林    時間: 2023-1-8 14:46

本帖最後由 准提部林 於 2023-1-8 14:52 編輯

用表單太花時間了~~只做"新增"及"查詢"
查詢...輸入前6碼數字...自動列出相符合的清單供選擇
其它的可用目前的程式碼去拼看看~~
[attach]35738[/attach]

WG0 ... 右邊一字是 "0" 還是 "O" ?
"回溫日期" 與 建立日期有何關係???
"回溫日期" 若只有 "mmdd" ,沒年份..如何判斷過期???
作者: v03586    時間: 2023-1-10 06:49

回復 4# 准提部林


    抱歉版大..沒敘述清楚, 感謝版大的協助
     1.右邊一字是 "0"  這部分我修改過了
     2."回溫日期" 與 建立日期有何關係???   回溫日期用途在建立產品從冷凍庫拿出後3個月內有效期限,
                                                                                所以A 產品可能在1/8第一次回溫,
                                                                                B產品在2/28使用相同冷凍品(期限尚未過)  ,
                                                                                C 產品在4/10要使用時就不能用, 已超過三個月有效期限

     3."回溫日期" 若只有 "mmdd" ,沒年份..如何判斷過期??? 當初考量不周...因為條碼產生字串太長, 條碼機無法掃...這點有曾想過...但不知道從程式可不可以篩選, 所以才留MMDD
作者: 准提部林    時間: 2023-1-10 10:33

回復 5# v03586


3."回溫日期" 若只有 "mmdd" ,沒年份..如何判斷過期??? 當初考量不周...因為條碼產生字串太長, 條碼機無法掃...這點有曾想過...但不知道從程式可不可以篩選, 所以才留MMDD

__建議:回溫日期那欄使用標準日期YYYY/MM/DD,輸入也是標準日期, 但條碼只取MMDD,
這樣就比較完整, 可判斷過期也可判斷日期是否錯誤, 例如:
1) 回溫日期小于建立日期(甚至判斷天數是否正確, 如:至少要差30天)
2) 也可判斷輸入 02/29 時, 是否當年度不是閏年的錯誤, 及大小月的月底日期, 如輸入:0431,0631,0931,1131

另外, 建立日期為何需要加時間???
作者: v03586    時間: 2023-1-11 06:43

回復 6# 准提部林


    建立日期為何需要加時間
     因為工廠24小時運作需要知道哪一個時間點生產的資料
     1. 感謝版大的建議, 當時確實很苦惱這個問題, 因為YYYY/MM/DD 沒有想到這個多 , 版大又幫我想到2月有潤月的問題
     2. 回溫日期小於建立日期(甚至判斷天數是否正確, 如:至少要差30天) , 目前生產過程中有一些例外, 所以暫時不將這個判斷在內, 除非有過期材料, 也就是回溫日+90天
     3.今天嘗試將版大的程式再套入『編輯資料』『取出資料』功能表中, 其中『編輯資料』不知道如何把OptionButton叫出來, 然後按下編輯完成後, 更新該筆資料
[attach]35739[/attach]

     4.『取出資料』功能表中 , 新增取出前先輸入要取出的厚度, 再透過條碼去判斷, 取出來的厚度是否正確, 擔心拿錯條碼厚度, 在成是撰寫中, 查詢到條碼, 不知道怎麼把資料從Database資料頁, 搬到MH Database資料頁
     [attach]35740[/attach]
  附件是利用版大的程式在延伸
[attach]35741[/attach]
作者: 准提部林    時間: 2023-1-15 18:08

把 新增/查詢/編輯 併成一個表單:
[attach]35747[/attach]

為了檢測資料的正確性, 代碼非常複雜, 其他功能還是自行去試試//
作者: Andy2483    時間: 2023-1-17 10:19

本帖最後由 Andy2483 於 2023-1-17 10:23 編輯

回復 1# v03586


    謝謝前輩發表此主題與範例
謝謝 准提部林前輩指導
後學分段學習8#範例心得如下,請前輩參考

Option Explicit
Dim Xrr(1 To 7), Yrr(1 To 7), Zrr(1 To 7), zD As Object
Dim zT$, zK$, zType$, TS$, Un%, z%, ZZ%, zMode%, zDay
Const W1 = 257, W2 = 423
'↑宣告自訂表單模組裡共用變數:(Xrr,Yrr,Zrr)是一維陣列,zD是物件
'(zT,zK,zType,TS)是字串變數,(Un,z,ZZ,zMode)是短整數變數,zDay是通用型變數
'W1是固定變數257, W2是固定變數423


Private Sub Cmd_1_Click() '新增按鈕
'↑按了 [新增]按鈕後會執行下列程序
Cmd_1.Enabled = False: Cmd_2.Enabled = False: Cmd_3.Enabled = False
'↑令這3個按鈕失效
Cmd_A1.Enabled = True: Cmd_A2.Enabled = True
'↑令這2個按鈕會有效
Erase Xrr, Yrr, Zrr
'↑清空3個一維陣列共用變數
Call 物件_UnLocked: zMode = 1
'↑執行 物件_UnLocked副程式 :令zMode這短整數是1
End Sub

Private Sub Cmd_2_Click() '查詢按鈕
'↑按了 [查詢]按鈕後會執行下列程序
Frame1.Visible = True: TextBox5.SetFocus
'↑令Frame1這表單顯示 :令游標落在 TextBox5輸入窗上
Cmd_1.Enabled = False: Cmd_2.Enabled = False: Cmd_3.Enabled = False
'↑令這3個按鈕失效
Lab_A1.Visible = True: Lab_Date.Visible = True
'↑令這兩個標籤顯示
Erase Xrr, Yrr, Zrr: Set zD = Nothing
'↑令這些容器清空
建立資料.Width = W2: Call 取得條碼清單: zMode = 3
'↑令建立資料這表單的寬變為 W2變數寬423
End Sub

Private Sub Cmd_3_Click()
If zMode <> 3 Then Exit Sub
'↑如果zMode這模組共用短變數不是 3!就結束程序
建立資料.Width = W1: Frame1.Visible = False: Cmd_3.Enabled = False
'↑令建立資料這表單的寬變為 W1變數寬257
Cmd_A1.Enabled = True: Cmd_A2.Enabled = True: TextBox1.SetFocus
'↑令2個按鈕失效 :令游標落在 TextBox1輸入窗上
Call 物件_UnLocked: zMode = 2
'↑執行 物件_UnLocked副程式 :令zMode這短整數是2
End Sub

Sub 物件_UnLocked()
Dim LK, CL
'↑宣告LK,CL是通用型變數
LK = False: CL = &HFFFFFF
'↑令LK這通用型變數是布林值 False,令CL這通用型變數是亮白色的代碼
TextBox1.Locked = LK: TextBox2.Locked = LK: TextBox3.Locked = LK: TextBox4.Locked = LK
'↑令這4個輸入窗鎖定失效(可編輯)
TextBox1.BackColor = CL: TextBox2.BackColor = CL: TextBox3.BackColor = CL: TextBox4.BackColor = CL
'↑令這4個輸入窗底色是CL變數(亮白色)
OptionButton1.Locked = LK: OptionButton2.Locked = LK: OptionButton3.Locked = LK
'↑令這3個選擇鈕鎖定失效(可編輯)
End Sub
作者: Andy2483    時間: 2023-1-17 13:04

回復 8# 准提部林


    謝謝前輩
分段學習心得註解如下,請前輩再指導

Private Sub Cmd_A1_Click() '建立條碼寫入按鈕
Dim TT$, T$, V%, VV%, R&, i&, Arr, xF As Range
'↑宣告變數:(TT,T)是字串變數,(V,VV)是短整數變數,(R,i)是長整數變數,
'Arr是通用型變數,xF是儲存格變數

Un = 0: Call 檢查輸入值
'↑令Un這短整數變數是 0 :執行 檢查輸入值 副程式
If zK = "A00000" Then MsgBox "*尚未輸入任何資料!  ": Exit Sub
'↑如果zK這字串變數是 "A00000"!就跳出提示窗~ :結束程式執行
If zK = "A22222" Then MsgBox "*編輯內容與原資料相同,未變更!  ": Exit Sub
'↑如果zK這字串變數是 "A22222"!就跳出提示窗~ :結束程式執行
If InStr(zK, "0") Then MsgBox "*資料輸入不完全或錯誤,請檢查!  ": Exit Sub
'↑如果zK這字串變數裡有包含"0"字元!就跳出提示窗~ :結束程式執行
zDay = Now: If zMode = 2 Then zDay = Lab_Date.Caption
'↑令zDay這通用型變數是現在時間 :如果zMode變數是 2!就令zDay變數是 Lab_Date標籤回傳值
TT = Format(zDay, "mmdd") & Join(Yrr, "")
'↑令TT這字串變數是 zDay變數轉換字串取月月日日4碼,連接(Yrr變數以空字元結合成的字串)
'---------------------------
If zMode = 2 Then '編輯更改--刪除原資料
'↑如果zMode變數是 2?
   Set xF = Sheets("Database").Range("G:G").Find(TextBox5.Text, Lookat:=xlWhole)
   '↑令xF這儲存格變數是以 Find()方法回傳的儲存格物件:
   '輸入窗TextBox5文字是 要搜尋的資料,搜尋範圍是 "Database"工作表G欄,條件:值全部相同
   If Not xF Is Nothing Then xF.EntireRow.Delete
   '↑如果xF變數有搜尋到!就令xF變數所在的列刪除,儲存格會往上遞補
End If
With Sheets("Database")
'↑以下是關於 "Database"工作表 的程序
     R = .Cells(Rows.Count, 1).End(3).Row
     '↑令R這長整數變數是該表A欄最後一個有內容儲存格 列號
     Arr = .Range("A1:G" & R)
     '↑令Arr是二維陣列!以該表[A1]到G欄R變數列範圍儲存格值倒入
     For i = R To 2 Step -1
     '↑設逆迴圈!!i從R變數到2,逐次減 1
         T = Arr(i, 7)
         '↑令T這字串變數是i迴圈列7欄Arr陣列值
         If Left(T, 14) = TT Then
         '↑如果T變數取左側14個字元值剛好是 TT字串變數值?
            V = Val(Mid(T, 15, 2))
            '↑令V這短整數變數是 Val()函數轉化數字回傳的值,
            'Val(T變數從第15字取2字元)

            If V > VV Then VV = V
            '↑如果V變數大於 這VV短整數變數!就令VV變數 = V變數
         End If
     Next i
     Xrr(1) = zDay: Xrr(7) = TT & Format(VV + 1, "00")
     '↑令Xrr這一維陣列1索引號陣列值是 zDay變數
     '↑令Xrr這一維陣列7索引號陣列值是 TT變數連接 VV變數+1後以兩碼回傳的字串

     .Range("A" & R + 1).Resize(1, 7) = Xrr
     '↑令該表A欄R變數+1列位置儲存格擴展向右7欄範圍儲存格值 以Xrr一維陣列值帶入
     With .Range("A1:G" & R + 1)
     '↑以下是關於該表[A1]到 G欄R變數+1列範圍儲存格的程序
        .Sort Key1:=.Item(1), Order1:=xlAscending, _
              Key2:=.Item(7), Order2:=xlAscending, Header:=xlYes
     '↑令該範圍儲存格做排序第一層以A欄順排序,第二層以G欄做順排序,有標題列
     End With
End With
MsgBox "*資料建立完成!  "
'↑跳出提示窗~~
If zMode = 2 Then Call 物件_初始狀態: zMode = 0 Else Call 清除資料: TextBox1.SetFocus
'↑如果zMode變數是 2!就執行副程式 Sub 物件_初始狀態(),令zMode變數是 0,
'否則就執行副程式 Sub 清除資料(),令鍵盤游標落在 TextBox1輸入窗上

End Sub
作者: Andy2483    時間: 2023-1-18 14:36

回復 8# 准提部林


    謝謝前輩

Option Explicit
Sub Mid特別用法_字串的指定字元數置換()
Dim Y$, Z$
Y = "ABCDEFG": Z = Y
Mid(Y, 2, 10) = "bcdefghijk"
MsgBox Y
Mid(Z, 2, 10) = "b"
MsgBox Z
End Sub
作者: v03586    時間: 2023-1-19 06:32

回復 8# 准提部林


    感謝版大的幫忙,這幾天測試了之後功能都正常, 唯獨有修改了日期的卡控(要大於今日)
   
     取出功能能請板大協助幫忙
    [attach]35756[/attach]

     ”取出資料”功能中, 輸入要取出的資料比對輸入條碼的厚度要一樣才能取出
    之後記錄取出人ID 與 使用產品 ID
    資料會從"Database"資料頁 跳到"MH Database"資料頁
    使用產品固定長度 7碼數字+"-"+SA"數字"."數字"
     ex : 1234567-SA0.1  紅色=固定格式
   




[attach]35755[/attach]
作者: 准提部林    時間: 2023-1-20 10:19

回復 12# v03586

取出//
[attach]35762[/attach]
作者: v03586    時間: 2023-1-31 06:53

回復 13# 准提部林


    感謝大大的協助, 再請問大大一下, 如果取出要把Database的資料移到MHdatabase 要加哪一段程式碼?
   意思就是兩個資料頁只會留一筆序號碼 ( 目前兩個資料頁都會存在)
作者: 准提部林    時間: 2023-1-31 11:07

回復 14# v03586

這裡不是預留了一條代碼
'xF.EntireRow.Delete '刪除原資料(自行決定)
將單引號刪去即可
作者: v03586    時間: 2023-2-3 23:15

回復 15# 准提部林


    不好意思版大!!看到了, 也修改過來了!! 感謝幫忙
    因為目前還想不到列印條碼的介面..所以只好先檢單的設定列印的方式
   目前只能先將建立好的資訊先寫一個檢單的列印格式在資料頁『條碼列印』在模組內的Module2 (欄寬/字體格式)
[attach]35766[/attach]
   但因條碼機需要將字串前後加上『*』 才讀出來
    可以請教如何在建立資料的同時也在資料欄『條碼列印』B2欄位也新增剛剛建立的條碼序號但前後要加上『*』
    e.g *02031566546*


[attach]35767[/attach]
作者: 准提部林    時間: 2023-2-4 16:12

回復 16# v03586

用微調按鈕選擇條碼~~
[attach]35772[/attach]
作者: v03586    時間: 2023-2-6 07:58

回復 17# 准提部林


    感謝版大幫忙,另請問一下請問選擇欄有預設值嗎?目前測試到第300筆資料後,無法跳到第301筆資料以後
作者: v03586    時間: 2023-2-6 13:18

回復 17# 准提部林


    找到問題了已修改,我再測試一下
作者: v03586    時間: 2023-2-12 14:26

回復 17# 准提部林

1.版大你好, 我有在新增一個WGP製程, 但在執行查詢的時候有跳出一個錯誤, 『陣列引索超出範圍』, 我有再程式碼多加"WGP" 但還是錯誤, 請問需要修改在哪邊呢?
  1. Private Sub CommandButton2_Click()
  2. Dim T$, xF As Range, V%
  3. Call 清除_查詢值: xChk = 0
  4. T = TextBox5.Text
  5. If T = "" Then MsgBox "*條碼序號未輸入! ": Exit Sub
  6. If Len(T) <> 16 Then MsgBox "*條碼序號輸入不完整或超過16個字元! ": Exit Sub
  7. Set xF = Sheets("Database").Range("G:G").Find(T, Lookat:=xlWhole)
  8. If xF Is Nothing Then MsgBox "*找不到目標! ": Exit Sub
  9. Set xF = xF(1, -5)
  10. V = InStr("+H0D", xF(1, 3)) - 1
  11. Lab_A1 = Array("", "WGH", "WG0", "WGD", "WGP")(V)
  12. Lab_A2 = xF(1, 4)
  13. Lab_A3 = xF(1, 5)
  14. xChk = 1
  15. End Sub
複製代碼
2. 版大先前在前面幾篇的回覆中有提到如果需要計算過期日期, 需要再輸入時加上年份, 但目前看起來輸入值是文字, 這樣能再Database中H欄位計算D+90的過期日嗎?
[attach]35832[/attach]
作者: 准提部林    時間: 2023-2-12 15:02

回復 20# v03586


V = InStr("+H0DP", xF(1, 3)) - 1 這也要加"P"


D = CDate(format(20230130, "00-00-00")) '即可轉成日期
if D - Date < 90 then msgbox "已過期"




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