VBA 當2個條件一樣時,自動尋找輸入 3 程式修改
- 帖子
- 169
- 主題
- 39
- 精華
- 0
- 積分
- 252
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- 2003
- 閱讀權限
- 20
- 註冊時間
- 2011-4-17
- 最後登錄
- 2020-7-17
 
|
VBA 當2個條件一樣時,自動尋找輸入 3 程式修改
基本使用UserForm1輸入資料沒甚麼問題,但資料轉寫到工作表上的後,在經過刪除,會無法在刪除後欄位上做UserForm1的資料的轉寫,會把資料做跳到下一列的動作,請老師們幫忙修改,謝謝!
附檔:
20181128.rar (27.3 KB)
|
|
|
|
|
|
|
- 帖子
- 163
- 主題
- 1
- 精華
- 0
- 積分
- 170
- 點名
- 0
- 作業系統
- Window 7
- 軟體版本
- Office 2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2010-9-5
- 最後登錄
- 2022-7-20
|
2#
發表於 2018-11-29 20:20
| 只看該作者
回復 1# man65boy
每當開啟檔案會透過ThisWorkbook的Open事件記錄兩個字典物件資料,此時執行輸入按鈕會正常寫入主頁工作表中。
但是當你以手動去刪除主頁中的資料,lRows&及兩個字典檔 vDIO & vDPeo 此時並沒有同步更新成你刪除後的資料,
亦即它會保存你還未刪除前的資料,這會讓lRows、vDIO、vDPeo的資料內容失真。
如再次執行輸入按鈕時會以字典檔中的舊資料來比對,如此就會產生無法預期的結果。
我並沒有去實際了解你程式運作方式,不過大方向來講應可透過下列方式予以改善:
1.將ThisWorkbook的Open事件內所有程式碼,移往UserForm1的Initialize事件程序中,同時將ThisWorkbook模組內的Open事件全部清空。
2.將Module1模組內的所有全域型公用變數移往UserForm1模組內的上端,並將之前宣告的Public改為Dim lRows&、Dim vDIO、Dim vDPeo,
因為此3個變數的生命週期只須存在此UserForm1模組中即可,完成後再將Module1模組內所宣告的公用變數全數清除。
以上淺見供參 |
|
|
|
|
|
|
- 帖子
- 169
- 主題
- 39
- 精華
- 0
- 積分
- 252
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- 2003
- 閱讀權限
- 20
- 註冊時間
- 2011-4-17
- 最後登錄
- 2020-7-17
 
|
3#
發表於 2018-11-30 09:54
| 只看該作者
回復 2# Kubi
謝謝大大的熱心回答,小弟功力尚淺,無法透徹理解,更改過後程式是無法運行的(有不正確的屬性),請老師再次幫忙,謝謝你! |
|
|
|
|
|
|
- 帖子
- 2843
- 主題
- 10
- 精華
- 0
- 積分
- 2899
- 點名
- 0
- 作業系統
- 〔略〕
- 軟體版本
- 〔略〕
- 閱讀權限
- 100
- 性別
- 男
- 來自
- 〔略〕
- 註冊時間
- 2013-5-13
- 最後登錄
- 2025-5-31
|
4#
發表於 2018-12-1 11:49
| 只看該作者
在工作表表格直接輸入及操作不是更方便???
用表單覺得反而礙手~~ |
|
|
|
|
|
|
- 帖子
- 169
- 主題
- 39
- 精華
- 0
- 積分
- 252
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- 2003
- 閱讀權限
- 20
- 註冊時間
- 2011-4-17
- 最後登錄
- 2020-7-17
 
|
5#
發表於 2018-12-3 10:17
| 只看該作者
|
|
|
|
|
|
- 帖子
- 163
- 主題
- 1
- 精華
- 0
- 積分
- 170
- 點名
- 0
- 作業系統
- Window 7
- 軟體版本
- Office 2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2010-9-5
- 最後登錄
- 2022-7-20
|
6#
發表於 2018-12-3 21:58
| 只看該作者
|
|
|
|
|
|
- 帖子
- 169
- 主題
- 39
- 精華
- 0
- 積分
- 252
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- 2003
- 閱讀權限
- 20
- 註冊時間
- 2011-4-17
- 最後登錄
- 2020-7-17
 
|
7#
發表於 2018-12-4 11:16
| 只看該作者
回復 6# Kubi
謝謝Kubi大大的回覆,但 下戴後無法開啟,檔案損毀。。。。。 |
|
|
|
|
|
|
- 帖子
- 163
- 主題
- 1
- 精華
- 0
- 積分
- 170
- 點名
- 0
- 作業系統
- Window 7
- 軟體版本
- Office 2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2010-9-5
- 最後登錄
- 2022-7-20
|
8#
發表於 2018-12-5 21:07
| 只看該作者
回復 7# man65boy
請將底下UserForm1模組內的所有程式碼複製並貼入你的UserForm1模組內
Dim lRows&
Dim vDIO, vDPeo
Private Sub CommandButton1_Click()
Dim lRow&
If TextBox1 = "" Then
MsgBox "你必須輸入 (車輛編號)"
Exit Sub
End If
If TextBox2 = "" Then
MsgBox "你必須輸入 (司機人員)"
Exit Sub
End If
lRow = vDPeo(CStr(TextBox1 & "-" & TextBox2))
If vDIO(CStr(TextBox1 & "-" & TextBox2)) = "O" Then ' 回來了
Cells(lRow, 3) = TextBox2
Cells(lRow, 5) = Now
Cells(lRow, 6) = ComboBox1.Text
vDIO(CStr(TextBox1 & "-" & TextBox2)) = "I"
Else ' 即將外出
lRows = lRows + 1
Cells(lRows, 1) = TextBox1
Cells(lRows, 2) = TextBox2
Cells(lRows, 4) = Now
vDIO(CStr(TextBox1 & "-" & TextBox2)) = "O"
vDPeo(CStr(TextBox1 & "-" & TextBox2)) = lRows
End If
End Sub
Private Sub UserForm_Initialize()
Dim lRow&
Dim sStr$
Set vDIO = CreateObject("Scripting.Dictionary")
Set vDPeo = CreateObject("Scripting.Dictionary")
lRow = 2
While Cells(lRow, 1) <> ""
If Cells(lRow, 3) = "" Then
sStr = "O"
Else
sStr = "I"
End If
vDIO(CStr(Cells(lRow, 1) & "-" & Cells(lRow, 2))) = sStr
vDPeo(CStr(Cells(lRow, 1) & "-" & Cells(lRow, 2))) = lRow
lRow = lRow + 1
Wend
lRows = lRow - 1
ComboBox1.AddItem "NO"
ComboBox1.AddItem "Yes"
ComboBox1.ListIndex = 0
End Sub
之後再將Module1及ThisWorkbook兩個模組內的資料全部刪除後執行看看。 |
|
|
|
|
|
|
- 帖子
- 169
- 主題
- 39
- 精華
- 0
- 積分
- 252
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- 2003
- 閱讀權限
- 20
- 註冊時間
- 2011-4-17
- 最後登錄
- 2020-7-17
 
|
9#
發表於 2018-12-6 10:02
| 只看該作者
回復 8# Kubi
謝謝老師的回答,程式執行後,發現有一個問題,就是把其中一列刪除後,再利用表單執行寫入時,資料是會把之前刪除的那一列填滿,但 如果表單一直寫入,程式會把刪除後的那一列以下列位的文字覆蓋過去,懇請老師幫忙解題,謝謝老師。.
附檔:
20181206.rar (29.75 KB)
|
|
|
|
|
|
|
- 帖子
- 2843
- 主題
- 10
- 精華
- 0
- 積分
- 2899
- 點名
- 0
- 作業系統
- 〔略〕
- 軟體版本
- 〔略〕
- 閱讀權限
- 100
- 性別
- 男
- 來自
- 〔略〕
- 註冊時間
- 2013-5-13
- 最後登錄
- 2025-5-31
|
10#
發表於 2018-12-6 15:41
| 只看該作者
車輛編號 及 司機人員 的組合都固定不重覆???
試試~~
Dim vD As Object
Private Sub CommandButton1_Click()
Dim T$, T1$, T2$, R&
T1 = TextBox1: T2 = TextBox2: T = T1 & "|" & T2
If T1 = "" Then MsgBox "你必須輸入 (車輛編號) ": Exit Sub
If T2 = "" Then MsgBox "你必須輸入 (司機人員) ": Exit Sub
R = Val(vD(T))
If R = 0 Then MsgBox "車輛/司機:" & T1 & "/" & T2 & ",這組合不存在 ": Exit Sub
If R < 0 Then '出車
Cells(-R, 3).Resize(1, 4) = ""
Cells(-R, 4) = Now: ComboBox1.Text = ""
vD(T) = -R
Else '回車
If ComboBox1.Text = "" Then MsgBox "這是【回車】趟,(回車物品) 必須輸入 ": Exit Sub
Cells(R, 3) = T2: Cells(R, 5) = Now: Cells(R, 6) = ComboBox1.Text
vD(T) = -R
End If
End Sub
Private Sub UserForm_Initialize()
Dim T$, T1$, T2$, i&
Set vD = CreateObject("Scripting.Dictionary")
Arr = Range([F1], [A65536].End(xlUp))
For i = 2 To UBound(Arr)
T1 = Arr(i, 1): T2 = Arr(i, 2): T = T1 & "|" & T2
If T1 = "" Or T2 = "" Then GoTo 101
vD(T) = i
If Arr(i, 4) = "" Or Arr(i, 5) <> "" Then vD(T) = -i
101: Next i
ComboBox1.List = Array("NO", "Yes")
End Sub
111_v1.rar (30.02 KB)
|
|
|
|
|
|
|