返回列表 上一主題 發帖

[發問] VBA 表單功能發問

[發問] VBA 表單功能發問

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

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


編輯資料
1.輸入序號列會帶出該筆資料的資訊
2.文字方塊未輸入序號無法輸入資料, 序號有輸入後才可以編輯資料
3.編輯完成就更新Excel Database資料
Q2.png
2023-1-1 11:17



查詢資料
1.查詢資料只能查詢不能修改資料
2.輸入序號碼就可以帶出資訊
Q3.png
2023-1-1 11:21


查詢過期
1. Excel E欄位 +90Days 超過會顯示出來清單內
Q4.png
2023-1-1 11:38


取出資料
1.輸入條碼序號會顯示該序號的下列資訊
2.輸入MH ID , 會把該序號從Database轉換到 MH Database的資料表 ,MH Database" I欄位" Now()
Q5.png
2023-1-1 11:39


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

條碼列印.rar (32.02 KB)

回復 1# v03586


    目前只有做建立資料

條碼列印 v1.zip (41.98 KB)

TOP

回復 2# singo1232001


    感謝大大的幫忙...小弟我自己也努力在看看其他有哪些功能是自己可以新增的!! 目前還卡關中

TOP

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

用表單太花時間了~~只做"新增"及"查詢"
查詢...輸入前6碼數字...自動列出相符合的清單供選擇
其它的可用目前的程式碼去拼看看~~
Xl0000359-01.rar (57.78 KB)

WG0 ... 右邊一字是 "0" 還是 "O" ?
"回溫日期" 與 建立日期有何關係???
"回溫日期" 若只有 "mmdd" ,沒年份..如何判斷過期???

TOP

回復 4# 准提部林


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

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

TOP

回復 5# v03586


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

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

另外, 建立日期為何需要加時間???

TOP

回復 6# 准提部林


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


     4.『取出資料』功能表中 , 新增取出前先輸入要取出的厚度, 再透過條碼去判斷, 取出來的厚度是否正確, 擔心拿錯條碼厚度, 在成是撰寫中, 查詢到條碼, 不知道怎麼把資料從Database資料頁, 搬到MH Database資料頁
     
Q6.png
2023-1-11 06:41

  附件是利用版大的程式在延伸
Xl0000359-01.rar (54.18 KB)

TOP

把 新增/查詢/編輯 併成一個表單:
Xl0000359-02.rar (103.84 KB)

為了檢測資料的正確性, 代碼非常複雜, 其他功能還是自行去試試//

TOP

本帖最後由 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
看得懂是應該的,懂得應用才像學生,臉皮厚點學會更謹慎積極

TOP

回復 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
看得懂是應該的,懂得應用才像學生,臉皮厚點學會更謹慎積極

TOP

        靜思自在 : 真正的愛心,是照顧好自己的這顆心。
返回列表 上一主題