返回列表 上一主題 發帖

[發問] VBA 表單功能發問

本帖最後由 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

回復 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
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 天上最美是星星,人生最美是溫情。
返回列表 上一主題