Board logo

標題: [發問] 求解!!資料一對多的驗證 [打印本頁]

作者: bsy4life    時間: 2016-6-15 12:13     標題: 求解!!資料一對多的驗證

各位前輩們好!小弟努力賺取積分中
在這邊找到了如何加入帳號密碼驗證的方式
目前有表格欄位料號要跟製程驗證,帶出後面的製程工時資料
發現只能一對一的進行驗證
資料如果同時有一筆以上的料號只能跟第一筆作驗證
請前輩們指導一下如何一對多的進行驗證><
登入工號:1,密碼:1
[attach]24497[/attach]
[attach]24495[/attach]
[attach]24496[/attach]
順便請問一下
修改密碼的表單用帳號驗證的方式去將新的密碼值取代原密碼欄位
這個思維是可行嗎?
作者: Kubi    時間: 2016-6-16 14:05

回復 1# bsy4life
小弟只針對一對多方面提供淺見(work的UserForm操作模式),若符合需求則請自行改寫程式碼。
1.料號(TextBoxProductNumber)需改為下拉式,一方面除免除防呆程式碼的寫作外,亦可提升使用者操作效率。
2.於UserForm_Initialize事件中,必須先至[製程工時]的A欄來撈取唯一料號,存入料號下拉資料清單中。
3.於UserForm_Initialize事件中,還需準備料號所對應的多筆[製程]、[工時]資料存入陣列待用。
4.每當料號下拉資料產生Change事件時,製程(ComboBoxProcess)下拉內的資料,需從待用的陣列中取得並從新寫入。
5.每當製程(ComboBoxProcess)產生Change事件時,須從待用的陣列中取得資料寫入LabeExceptTimeShow及LabelProcessTimeShow。
作者: bsy4life    時間: 2016-6-17 14:29

回復 2# Kubi

    小弟只針對一對多方面提供淺見(work的UserForm操作模式),若符合需求則請自行改寫程式碼。
1.料號(TextBoxProductNumber)需改為下拉式,一方面除免除防呆程式碼的寫作外,亦可提升使用者操作效率。

那如果有一百種料號,我要拉很長耶~~順便請教一下combobox無法用滑鼠滾動是要怎麼改@@?
之後料號應該比較屬於刷條碼的部分

2.於UserForm_Initialize事件中,必須先至[製程工時]的A欄來撈取唯一料號,存入料號下拉資料清單中。
3.於UserForm_Initialize事件中,還需準備料號所對應的多筆[製程]、[工時]資料存入陣列待用。
4.每當料號下拉資料產生Change事件時,製程(ComboBoxProcess)下拉內的資料,需從待用的陣列中取得並從新寫入。
5.每當製程(ComboBoxProcess)產生Change事件時,須從待用的陣列中取得資料寫入LabeExceptTimeShow及LabelProcessTimeShow。

這部分我取完資料後,該怎麼實作陣列的部分呢?
可以簡單的為小弟示範一下嗎~?
作者: Kubi    時間: 2016-6-18 22:13

回復 3# bsy4life
請參考。
[attach]24519[/attach]
作者: GBKEE    時間: 2016-6-19 08:25

本帖最後由 GBKEE 於 2016-6-22 05:00 編輯

回復 3# bsy4life


   
順便請教一下combobox無法用滑鼠滾動是要怎麼改

不是有方向鍵可用

work 表單模組程式碼試試看
TextBoxProductNumber,TextBoxMachineNumber,ComboBoxProcess
皆改為 ComboBox 的控制項 其 BoundColumn 屬性 請指定=1
  1. Dim d As Object, Msg As Boolean  '這表單模組 的私用變數
  2. Private Sub UserForm_Initialize()
  3.      TextBoxWorkOrderNumber = New_TextBoxWorkOrderNumber
  4.      TextBoxProductNumber_MakeList
  5.      TextBoxMachineNumber_MakeList
  6.      Msg = True
  7. End Sub
  8. Private Sub TextBoxProductNumber_Change()
  9.    With ComboBoxProcess  ' 製程 控制項
  10.         .Clear
  11.         If TextBoxProductNumber.ListIndex > -1 Then
  12.             If d(TextBoxProductNumber.Value).Rows.Count = 1 Then
  13.                 .AddItem d(TextBoxProductNumber.Value).Cells(2)  '料號只有一個
  14.             Else
  15.                 .List = d(TextBoxProductNumber.Value).Columns(2).Value '相同料號 不只一個  的製程範圍
  16.             End If
  17.             .ListIndex = 0
  18.         End If
  19.     End With
  20.     xChicked
  21. End Sub
  22. Private Sub ComboBoxProcess_Change()
  23.     LabeExceptTimeShow.Caption = ""
  24.     LabelProcessTimeShow.Caption = ""
  25.     With ComboBoxProcess
  26.         If .ListIndex > -1 Then
  27.             ' ***  d(TextBoxProductNumber.Value) ->Range 物件***
  28.             LabeExceptTimeShow.Caption = d(TextBoxProductNumber.Value).Cells(.ListIndex + 1, "C")
  29.             LabelProcessTimeShow.Caption = d(TextBoxProductNumber.Value).Cells(.ListIndex + 1, "D")
  30.         End If
  31.     End With
  32.     xChicked
  33. End Sub
  34. Private Sub TextBoxMachineNumber_Change() '帶入機器型號的資料
  35.     With TextBoxMachineNumber
  36.         LabelMachineShow.Caption = ""
  37.         If .ListIndex > -1 Then LabelMachineShow.Caption = .List(.ListIndex, 1)
  38.     End With
  39.     xChicked
  40. End Sub
  41. Private Sub TextBoxWorkOrderNumber_Change()
  42.     xChicked
  43. End Sub

  44. Private Sub CommandButtonSend_Click()
  45. Dim Rng As Range, BtnCode As Integer
  46.     If MsgBox("新增派工  - " & TextBoxWorkOrderNumber, vbYesNo + 16 * 2, "資料送出") = vbNo Then Exit Sub
  47.     With Sheets("新增派工")
  48.         Set Rng = .Range("A1").End(xlDown)
  49.         If Rng.Row = Rows.Count Then Set Rng = .Range("A1")
  50.     End With
  51.     With Rng.Offset(1)
  52.         .Cells(1, 1) = TextBoxWorkOrderNumber.Value '工單編號
  53.         .Cells(1, 2) = TextBoxProductNumber.Value '料號
  54.         .Cells(1, 3) = ComboBoxProcess.Text  '製程
  55.         .Cells(1, 4) = TextBoxMachineNumber.Value  '機器編號
  56.         .Cells(1, 5) = LabelMachineShow.Caption  '機器型號
  57.         .Cells(1, 6) = LabeExceptTimeShow.Caption '除外工時
  58.         .Cells(1, 7) = LabelProcessTimeShow.Caption '單次工時
  59.     End With
  60.     TextBoxProductNumber.ListIndex = -1
  61.     TextBoxMachineNumber.ListIndex = -1
  62.     ComboBoxProcess.ListIndex = -1
  63.     BtnCode = CreateObject("WScript.Shell").popup("此檔案已自動存檔", 1, Caption)
  64.     ThisWorkbook.Save
  65.     TextBoxWorkOrderNumber = New_TextBoxWorkOrderNumber
  66.     BtnCode = CreateObject("WScript.Shell").popup("工單編號 " & TextBoxWorkOrderNumber, 2, Caption)
  67.     TextBoxWorkOrderNumber.SetFocus
  68. End Sub
  69. Private Sub CommandButtonExit_Click()
  70.     End
  71. End Sub
  72. Private Sub TextBoxProductNumber_MakeList()  '製程工時:料號資料
  73.     Dim Rng As Range
  74.     Set d = CreateObject("scripting.dictionary")   '字典物件
  75.     Set Rng = Sheets("製程工時").Range("A2")
  76.     Do While Rng <> ""
  77.         If d.EXISTS(Rng.Value) Then
  78.             Set d(Rng.Value) = Union(Rng.Resize(, 4), d(Rng.Value)) '料號, 製程, 除外工時,單次工時
  79.         Else
  80.             Set d(Rng.Value) = Rng.Resize(, 4)      '料號, 製程, 除外工時,單次工時
  81.         End If
  82.         Set Rng = Rng.Offset(1)
  83.     Loop
  84.     With TextBoxProductNumber
  85.         .List = d.KEYS
  86.         .ListIndex = 0
  87.     End With
  88. End Sub
  89. Private Sub TextBoxMachineNumber_MakeList()  'List 包含( 機器編號 , 型號)
  90.         With Sheets("機器型號")
  91.                 TextBoxMachineNumber.List = .Range("A2:B" & .Range("A1").End(xlDown).Row).Value
  92.         End With
  93.         TextBoxMachineNumber.ListIndex = 0
  94. End Sub
  95. Private Function New_TextBoxWorkOrderNumber() As String '新增 工單號碼  格式: XXX-1234567890
  96.     Dim New_No As Variant
  97.     With Sheets("新增派工").Range("A1").End(xlDown)
  98.             If .Row > 1 And .Cells <> "" Then
  99.                 New_No = Split(.Cells, "-")
  100.                 New_No(1) = Format(Val(New_No(1)) + 1, "0000000000")
  101.                 New_TextBoxWorkOrderNumber = New_No(0) & "-" & New_No(1)
  102.             End If
  103.     End With
  104. End Function
  105. Private Sub xChicked()  '防呆程式
  106.     Dim BtnCode As Integer, xOrder, Msg As Boolean
  107.     With CommandButtonSend
  108.         .Enabled = TextBoxProductNumber.ListIndex > -1 And ComboBoxProcess.ListIndex > -1 And TextBoxMachineNumber.ListIndex > -1
  109.         .Enabled = .Enabled And Len(Trim(TextBoxWorkOrderNumber)) = 14
  110.         If Len(Trim(TextBoxWorkOrderNumber)) = 14 Then
  111.              xOrder = Split(TextBoxWorkOrderNumber, "-")
  112.             If UBound(xOrder) = 0 Then Msg = True
  113.             If UBound(xOrder) = 1 Then
  114.                 If Len(xOrder(0)) <> 3 Then Msg = True   '前三碼
  115.                 If Len(xOrder(1)) <> 10 Then Msg = True '後十碼
  116.                 If Len(xOrder(1)) = 10 And IsNumeric(xOrder(1)) = False Then Msg = True '後十碼需為數字
  117.             End If
  118.             If Msg Then BtnCode = CreateObject("WScript.Shell").popup("工單編號 錯誤  " & TextBoxWorkOrderNumber & vbLf & "如 :xxx-1234567890", 2, Caption)
  119.             .Enabled = .Enabled And Msg = False
  120.         End If
  121.     End With
  122. End Sub
複製代碼

作者: bsy4life    時間: 2016-6-20 12:35

回復 5# GBKEE
我有試著用看看
這段是實作於WORK FORM嗎
看起來比較像是放在fcckeyin
因為他參照的目標是新增派工,新增派工是根據製程工時的資料去輸入
其實兩邊需求的語法應該是一樣,一邊通,就都可以了

後來發現有些欄位給Label做得太死
又改成textbox
想請問這段
  1. If TypeName(xAr(i)) <> "Label" Then
複製代碼
是根據label的檔案屬性,去做不一樣的輸出對嗎?
嗚嗚 我是菜鳥
作者: bsy4life    時間: 2016-6-22 08:18

回復 5# GBKEE
謝謝GBKEE大大費心勞力!!
我先把您提供的程式碼研究徹底再來執行看看
另外想請問像是這些對照、驗證,我如果放到資料庫
邏輯的構思也是如此嗎? 昨天把表單資料都放進資料庫
目前在苦惱怎麼比對,哈!

祝GBKEE大大有美好的一天~
作者: Kubi    時間: 2016-6-22 21:37

回復 3# bsy4life
補寫[送出資料]按鈕的程式碼,請參考。
http://www.FunP.Net/330811




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