返回列表 上一主題 發帖

VBA 當2個條件一樣時,自動尋找輸入 3 程式修改

回復 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模組內所宣告的公用變數全數清除。

以上淺見供參

TOP

回復 3# man65boy
請參考
20181128-1.rar (23.23 KB)

TOP

回復 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兩個模組內的資料全部刪除後執行看看。

TOP

        靜思自在 : 口說一句好話,如口出蓮花;口說一句壞話如口吐毒蛇。
返回列表 上一主題