Board logo

標題: [發問] 輸入資料比對資料表 轉換到別的資料表 [打印本頁]

作者: v03586    時間: 2016-10-7 14:31     標題: 輸入資料比對資料表 轉換到別的資料表

我有設計一個盤點程式
目前入庫功能都寫好了
但是有些出庫功能比較特殊, 資料表資料轉去別的資料表
想請求大大幫忙
操作介面為『每日盤點』資料表
程式邏輯就是IN / OUT ,  皆是判斷 Lot , 只要Lot 符合就將整筆資料轉移過去
1. 當資料放入冰箱時, 資料會存在『Database-冰箱』資料表, 當取出冰箱時, 資料會跑到『Database-回溫區』資料表
    『Database-冰箱』資料表的那筆資料必須刪除, 然後跑去『Database-回溫區』資料表
     如果輸入的Lot當中在『Database-冰箱』資料表內, 沒有輸入的Lot , 就新增『Database-回溫區』資料表內 ( 意思是 從別的地方放入, 不是從冰箱放入 )
    目前Intput 都撰寫OK, 唯獨 我卡在怎麼刪除...我的程式碼如下, 請求大大指教我錯在哪裡

2. 功能2 , 在圖片中”取出回溫區”這個按鈕按下, 會去比對『Database-回溫區』資料表中的Lot
只要符合就將整筆資料刪除

3.功能3, 取出氮氣櫃一樣比對『Database-入氮氣櫃』資料表中的Lot資料, 只要符合就將資料轉移至『Database-出氮氣櫃』資料表中
  1. Sub OutFilm()
  2.    Dim PromptsC(1 To 1) As String
  3.    Dim PromptsE(1 To 1) As String
  4.    Dim Inputs(1 To 1) As String
  5.    Dim i As Integer
  6.    Dim j As Integer
  7.    Dim Lot_Rng As Range
  8.    Dim NotFound As Boolean
  9.    Const D = 4
  10.    PromptsC(1) = "膠紙LOT"
  11.    PromptsE(1) = "Film Lot"
  12.    For j = 1 To 1
  13.      Inputs(j) = ""
  14.    Next j
  15.    For j = 1 To 1
  16.     Do
  17.        Inputs(j) = InputBox("請掃描" & PromptsC(j) & "[Please Scan " & PromptsE(j) & "]", _
  18.                             "請掃描" & PromptsC(j) & "[Please Scan " & PromptsE(j) & "]", "")
  19.        If Len(Inputs(j)) < 1 Then
  20.            If MsgBox("你的輸入有誤,是否重新輸入" & PromptsC(j) & "?" & vbCrLf & _
  21.                      "點擊""是""重新輸入,""否""退出當次輸入。" & vbCrLf & _
  22.                      "You are not enter " & PromptsE(j) & " ,Click ""是(Y)""Re-enter or ""否(N)""End enter", _
  23.                      vbYesNo Or vbQuestion, _
  24.                      "無輸入" & PromptsC(j) & " [You are not enter " & PromptsE(j) & "]") = vbNo Then Exit Sub
  25.        End If
  26.     Loop While Inputs(j) = ""
  27.    Next j
  28.    i = 2
  29.    NotFound = True
  30.    Do
  31.       If Inputs(1) = Worksheets("Database-冰箱").Cells(i, D) Then
  32.          Set Lot_Rng = Worksheets("Database-冰箱").Cells(i, D)
  33.          Worksheets("Database-冰箱").Rows(Inputs(1)).Delete
  34.          NotFound = False
  35.          Exit Do
  36.       End If
  37.       i = i + 1
  38.    Loop While Worksheets("Database-冰箱").Cells(i, A) <> ""
  39.    If NotFound Then MsgBox "找不到資料 < Can't not found data>"
  40. End Sub
複製代碼
[attach]25475[/attach]
[attach]25474[/attach]
作者: v03586    時間: 2016-10-9 16:06

回復 1# v03586


    感謝GBKEE 板大的提醒, 順帶修正了其他錯誤
[attach]25502[/attach]
   另外如下有 5 個問題, 求解
  Q1. 放入冰箱後資料會存在『Database-冰箱』資料表
          可否幫麻加入計算「I」欄位的距離過期天數, 依照「G」欄位到期日計算
          再由“快過期的”在「J」欄位, 顯示優先拿取的順序
          Q1-1. 輸入放入冰箱功能, 請問是否可以輸入完資料後自動依照「C50」欄位主要排序, 再由「J50」欄位次要排序嗎??

[attach]25503[/attach]

  Q2. 放入回溫區後資料會存在『Database-回溫區』資料表
          可否幫麻加入計算「J」欄位的距離過期天數, 依照「F」欄位與距離目前日期計算
          再由“快過期的”在「K」欄位, 顯示優先拿取的順序
          Q2-1. 輸入回溫區功能, 請問是否可以輸入完資料後自動依照「C50」欄位主要排序, 再由「J50」欄位次要排序嗎??
          Q2-2. 輸入回溫區功能比較特別, 輸入LOT時, 可否從『Database-冰箱』資料表, 判斷
                      如果有輸入一樣的LOT, 則從『Database-冰箱』資料表將重覆資料刪除??
          Q2-3. 另外「F」欄位是否能內建格式YYYY/MM/DD HH:MM ??

[attach]25505[/attach]
Q3. 放入氮氣櫃後資料會存在『Database-入氮氣櫃』資料表
          可否幫麻加入計算「J」欄位的距離過期天數, 依照「F」欄位與距離目前日期計算
          再由“快過期的”在「K」欄位, 顯示優先拿取的順序
          Q2-1. 輸入氮氣櫃功能, 請問是否可以輸入完資料後自動依照「C50」欄位主要排序, 再由「J50」欄位次要排序嗎??
          Q2-2. 另外「F」欄位是否能內建格式YYYY/MM/DD HH:MM ??


Q4. 查詢先進先出功能
       使用者選擇要查詢的資料表”下拉式選單”, 輸入料號後,按下﹝查詢﹞按鈕,  Listbox 顯示該料號的『前三筆順序』『LOT』『層架位置』

[attach]25504[/attach]

Q5. 『取出回溫區』、『取出氮氣櫃』資料表的拿取順序是否會再次重新排序???
   EX: 原本程式判斷優先順位1 被拿走了 ( 資料也意味著消失了 ) , 那是否資料表內會再重新判斷產生順序呢??

如下是修改後的檔案

[attach]25506[/attach]
作者: GBKEE    時間: 2016-10-10 09:31

本帖最後由 GBKEE 於 2016-10-10 10:50 編輯

回復 2# v03586
請問 氮氣必先入氮氣櫃, 其它物件必先入冰箱. 取出(氮氣,冰箱物件),是否都必先入入回溫區

你所需的程式為 1:冰箱                A:存物件(新增資料)                B:取物件入回溫區(資料轉移到回溫區)
                    2:氮氣櫃              A:存氮氣(新增資料)                B:取氮氣,入回溫區(資料轉移到回溫區)
                    3: 出回溫區(刪除資料)
以上程序可否有一 [工號],[層架編號],[Film P/N],[Lot],[回溫後使用期限],[膠紙製造日],[膠紙到期日]的資料表,
做為這些程式的選項整合,用表單(UserForm)來執行


膠紙製造日,膠紙到期日 的資料格式為何用文字而不用日期格式.
距離過期天數: DATE-膠紙到期日 ,排序可用 [膠紙到期日]欄 遞增
作者: v03586    時間: 2016-10-10 13:30

回復 3# GBKEE


    1. 放入冰箱=(完整都未使用) , 拿出來一定會經過回溫區
    2. 回溫區取出去使用後, 一定會放入氮氣櫃
    3. 氮氣櫃會放入回溫區的情況只有氮氣櫃位置不夠(撇開這點不談) , 基本上流程 : 冰箱->回溫區 ; 回溫區->未使用完畢入氮氣櫃 ; 氮氣櫃->未使用完畢入氮氣櫃

所需的程式為
                     1:冰箱                A:存物件(新增資料)                B:取物件入回溫區(資料轉移到回溫區)
                    2:氮氣櫃             A:存氮氣(新增資料)                B:取氮氣櫃,(刪除資料)
                    3: 出回溫區(刪除資料)

-----------
以上程序可否有一 [工號],[層架編號],[Film P/N],[Lot],[回溫後使用期限],[膠紙製造日],[膠紙到期日]的資料表,
做為這些程式的選項整合,用表單(UserForm)來執行

-----------
ANS: 以上程序都有寫程式以input box表示迴圈, 考慮大量收料 [工號],[層架編號],[Film P/N],為固定格式, 接下來[Lot],後面都跑回圈
每個程式[冰箱][回溫區][氮氣櫃] 都有對應的儲存資料表, 因為不會使用UserForm跑回圈, 所以用input box來執行此程式...



膠紙製造日,膠紙到期日 的資料格式為何用文字而不用日期格式.
ANS: 這是刷物品上的條碼...沒想到是文字格式, 能否強制轉換呢?
Format([資料表!F50:G], "yyyy/mm/dd")

作者: GBKEE    時間: 2016-10-11 20:48

本帖最後由 GBKEE 於 2016-10-16 13:57 編輯

回復 4# v03586
' Q4.查詢先進先出功能 '使用者選擇要查詢的資料表”下拉式選單”, 輸入料號後,按下﹝查詢﹞按鈕,
       'Listbox 顯示該料號的『前三筆順序』『LOT』『層架位置』
附檔的查詢表單模組的程式
  1. Dim Sh As Worksheet
  2. Private Sub UserForm_Initialize()
  3.     ComboBox1.AddItem "冰箱"
  4.     ComboBox1.AddItem "回溫區"
  5.     ComboBox1.AddItem "氮氣櫃"
  6. End Sub
  7. Private Sub CommandButton1_Click()
  8.     Unload Me
  9. End Sub
  10. Private Sub ComboBox1_Change()
  11.     Dim E As Worksheet
  12.     If ComboBox1.ListIndex > -1 Then
  13.         Set Sh = Sheets("Database-" & ComboBox1)
  14.          '**如有錯誤改用下列程式碼 : 工作表名稱的差異
  15.         'For Each E In Sheets
  16.         '    If InStr(E.Name, ComboBox1) Then
  17.         '        Set Sh = E
  18.         '        Exit For
  19.         '    End If
  20.         'Next
  21.         Ex_Ans Sh    '呼叫程序 傳遞參數
  22.         If Trim(TextBox2) <> "" Then TextBox2_Change
  23.     End If
  24. End Sub
  25. Private Sub TextBox2_Change()
  26.     Dim i As Integer, D As Object, Ar
  27.     Set D = CreateObject("SCRIPTING.DICTIONARY")
  28.     If Trim(TextBox2) <> "" And ComboBox1.ListIndex > -1 Then
  29.         i = 2
  30.         '料號是 Film P/NF ? ->Sh.Cells(i, "C")
  31.         Do While Sh.Cells(i, "a") <> ""
  32.             If Len(Sh.Cells(i, "a")) > 1 And UCase(Sh.Cells(i, "C")) = UCase(Trim(TextBox2)) Then
  33.                 '**Len(Sh.Cells(i, "a")) > 1  因各工作表 前49筆資料 "-" 為何??
  34.                 If Not D.exists(Trim(TextBox2)) Then
  35.                     D(Trim(TextBox2)) = Array(Array(Sh.Cells(i, "B").Text, Sh.Cells(i, "C").Text, Sh.Cells(i, "D").Text))
  36.                 Else
  37.                     Ar = D(Trim(TextBox2))
  38.                     ReDim Preserve Ar(0 To UBound(Ar) + 1)
  39.                     Ar(UBound(Ar)) = Array(Sh.Cells(i, "B").Text, Sh.Cells(i, "C").Text, Sh.Cells(i, "D").Text)
  40.                      D(Trim(TextBox2)) = Ar
  41.                 End If
  42.             End If
  43.             i = i + 1
  44.         Loop
  45.         With TextBox1  '附檔的查詢表單是 TextBox 控制項
  46.             .Text = ""
  47.            .Multi= True
  48.             .Multi屬性 指定控制項是否接受並顯示多行文字。
  49.         End With
  50.           '*********'附檔如有是 ListBox1 控制項
  51.         'With ListBox1
  52.         '    .ColumnCount = 3
  53.         '    .ColumnWidths = "30,50,50"
  54.         '    .Clear
  55.         'End With
  56.         '*********************************
  57.         If D.Count > 0 And D.exists(Trim(TextBox2)) Then
  58.             'ReDim Ar(0)                               '**附檔如有是 ListBox1 控制項
  59.             For i = 0 To UBound(D(Trim(TextBox2)))
  60.             '    ReDim Preserve Ar(0 To i)      '**'附檔如有是 ListBox1 控制項
  61.                 TextBox1 = TextBox1 & IIf(TextBox1 <> "", vbCrLf, "") & Join(D(Trim(TextBox2))(i), ",")
  62.             '    Ar(i) = D(Trim(TextBox2))(i)  '''附檔如有是 ListBox1 控制項
  63.                 If i = 2 Then Exit For  '顯示三筆
  64.             Next
  65.             '********'''附檔如有是 ListBox1 控制項
  66.             'If UBound(Ar) > 0 Then
  67.             '    ListBox1.List = Application.Transpose(Application.Transpose(Ar)) ''附檔如有是 ListBox1 控制項
  68.             'Else
  69.             '    Ar = Ar(0)
  70.             '    With ListBox1
  71.             '        .AddItem
  72.             '        For i = 0 To UBound(Ar)
  73.             '            .List(.ListCount - 1, i) = Ar(i)
  74.             '        Next
  75.             '    End With
  76.             'End If
  77.         End If
  78.     End If
  79. End Sub
複製代碼
Q2-3. 另外「F」欄位是否能內建格式YYYY/MM/DD HH:MM ??
  在工作上寫上 Now 會自動生成YYYY/MM/DD HH:MM 的格式

這程式碼請至於一般模組,可供其它程式使用
  1. Option Explicit
  2. Sub Ex_Ans(Sh As Worksheet)
  3.     Dim St As String, i(1 To 3) As Integer, D As Object, e As Variant, Rng As Range
  4.     'Set Sh = 查詢.Sh
  5.     With Sh
  6.     'With ActiveSheet   ' 可指定為『Database-冰箱』或『Database-回溫區』或『Database-入氮氣櫃』
  7.     '.Activate
  8.         St = "膠紙到期日"
  9.         i(1) = Application.WorksheetFunction.Match(St, Rows(1), 0) '**傳回膠紙到期日的欄位
  10.         
  11.         
  12.                 .Columns(i(1)).TextToColumns Destination:=.Cells(1, i(1)), DataType:=xlDelimited, _
  13.         FieldInfo:=Array(1, 5), TrailingMinusNumbers:=True  '***(文字格式, 轉換為日期)
  14.         
  15.         '   Q1. 放入冰箱後資料會存在『Database-冰箱』資料表
  16.         '       可否幫麻加入計算「I」欄位的距離過期天數, 依照「G」欄位到期日計算
  17.         '        再由“快過期的”在「J」欄位, 顯示優先拿取的順序
  18.   
  19.         ' Q2. 放入回溫區後資料會存在『Database-回溫區』資料表
  20.         '  可否幫麻加入計算「J」欄位的距離過期天數, 依照「F」欄位與距離目前日期計算
  21.         '  再由“快過期的”在「K」欄位, 顯示優先拿取的順序
  22.         
  23.         ' Q3. 放入氮氣櫃後資料會存在『Database-入氮氣櫃』資料表
  24.         '  可否幫麻加入計算「J」欄位的距離過期天數, 依照「F」欄位與距離目前日期計算
  25.         '  再由“快過期的”在「K」欄位, 顯示優先拿取的順序

  26.         
  27.         St = "距離過期天數"
  28.         i(2) = Application.WorksheetFunction.Match(St, Rows(1), 0) '**傳回距離過期天數的欄位
  29.      
  30.         With .Columns(i(2)).Range("a2:a" & .Range("a" & Rows.Count).End(xlUp).Row)  '
  31.         i(3) = i(2) - i(1)
  32.             
  33.              '.FormulaR1C1 = "=IF(ISNUMBER(RC[-2]),RC[-2]-TODAY(), """")"
  34.              .FormulaR1C1 = "=IF(ISNUMBER(RC[-" & i(3) & "]),RC[-" & i(3) & "]-TODAY(), """")"
  35.             
  36.              '**'距離過期天數的欄位寫上公式
  37.             
  38.             .NumberFormatLocal = "G/通用格式"
  39.             .Value = .Value    '**公式轉為值
  40.             Set D = CreateObject("scripting.dictionary") '**字典物件
  41.             For Each e In .Cells
  42.                 If e <> "" Then            '有值的儲存格
  43.                     D(e.Value) = ""        ' e.Value 為字典物件的key
  44.                     If Rng Is Nothing Then
  45.                         Set Rng = e
  46.                     Else
  47.                         Set Rng = Union(Rng, e)  'Union 方法   傳回兩個或多個範圍的合併範圍。
  48.                     End If
  49.                 End If
  50.             Next
  51.             For Each e In Rng
  52.                 For i(1) = 1 To D.Count
  53.                     If e = Application.Small(D.keys, i(1)) Then
  54.                         'e為字典物件key值的第幾 [i(1)] 小的值
  55.                         e.Offset(, 1) = i(1)   '優先拿取順序
  56.                         Exit For
  57.                     End If
  58.                 Next
  59.             Next
  60.         End With
  61.    End With
  62.    
  63.     '排序
  64.     'Q1-1. 輸入放入冰箱功能, 請問是否可以輸入完資料後自動依照「C50」欄位主要排序, 再由「J50」欄位次要排序嗎??

  65.    With Rng.EntireRow
  66.         'Q2-1. 輸入回溫區功能, 請問是否可以輸入完資料後自動依照「C50」欄位主要排序, 再由「J50」欄位次要排序
  67.        '**  key1:=.Cells(1, i(2)), Order1:=1 優先拿取順序為主排序鍵
  68.         .Sort key2:=.Cells(1, "c"), Order1:=1, key1:=.Cells(1, i(2)), Order1:=1, header:=xlNo
  69.         
  70.         'Q5. 『取出回溫區』、『取出氮氣櫃』資料表的拿取順序是否會再次重新排序???
  71.         ' **指裡  資料表內會重新排序
  72.    End With
  73. End Sub
複製代碼

作者: v03586    時間: 2016-10-12 04:35

回復 5# GBKEE


      料號是 Film P/N ?
       YES
    因各工作表 前49筆資料 "-" 為何??
   其實是N/A值 , 沒有LOT只是為了怕盤點, 資料與實際數量有誤差, 可以在PCS欄位偷偷調帳用! 所預設的伏筆!!

1. 附檔的查詢表單模組的程式
貼入後出現如下錯誤, 任何選擇項目都會跳出錯誤
[attach]25525[/attach]

2.這程式碼請至於一般模組,可供其它程式使用
請問這是放在Module1 裡面嗎? 還是要拆去各個分頁內的程式碼中呢??
作者: GBKEE    時間: 2016-10-12 06:16

本帖最後由 GBKEE 於 2016-10-12 07:41 編輯

回復 6# v03586

5# 查詢表單模組的程式碼有更新

Sub Ex_Ans(Sh As Worksheet) 放在Module1 (一般模組) 沒錯的

i(1) = Application.WorksheetFunction.Match(St, Rows(1), 0) '**傳回膠紙到期日的欄位
在2003版沒有錯誤的
請改用試試看  i(1) = Sh.Rows(1).Find(St, LookIn:=xlValues, LookAt:=xlWhole).Column '**傳回膠紙到期日的欄位

Q2-2. 輸入回溫區功能比較特別, 輸入LOT時, 可否從『Database-冰箱』資料表, 判斷
                      如果有輸入一樣的LOT, 則從『Database-冰箱』資料表將重覆資料刪除??
  1. Sub 取出回溫區()
  2.    Dim Rng As Range
  3.    '以上程式碼簡略
  4.    ''Inputs(j) = InputBox(" 您現在將要把膠紙從『 回溫區取出 』 " & vbCrLf
  5.    '以上程式碼簡略
  6.    'i = 2
  7.    'NotFound = True
  8.      '  Do
  9.     '    If Inputs(1) = Worksheets("Database-冰箱").Cells(i, "D") Then
  10.     '    *********'『 回溫區取出 』 是在 回溫區 而不是 冰箱  !!!  *****
  11.    
  12.     '        Set Lot_Rng = Worksheets("Database-冰箱").Cells(i, "D")
  13.     '        Worksheets("Database-冰箱").Rows(i).Delete
  14.     '        NotFound = False
  15.     '       Exit Do
  16.     '     End If
  17.     '     i = i + 1
  18.     '  Loop While Worksheets("Database-冰箱").Cells(i, "A") <> ""
  19.    
  20.    '    *********'『 回溫區取出 』 是在 回溫區 而不是 冰箱  !!!  *****
  21.    'Set Rng = Worksheets("Database-冰箱").Range("d:d").Find(Inputs(1), LookIn:=xlValues, LookAt:=xlWhole)
  22.    Set Rng = Worksheets("Database-回溫區").Range("d:d").Find(Inputs(1), LookIn:=xlValues, LookAt:=xlWhole)
  23.    If Not Rng Is Nothing Then
  24.         Rng.EntireRow.Delete
  25.         
  26.         'Q2-2. 輸入回溫區功能比較特別, 輸入LOT時, 可否從『Database-冰箱』資料表, 判斷
  27.         '              如果有輸入一樣的LOT, 則從『Database-冰箱』資料表將重覆資料刪除??
  28.         Set Rng = Worksheets("Database-冰箱").Range("d:d").Find(Inputs(1), LookIn:=xlValues, LookAt:=xlWhole)
  29.         If Not Rng Is Nothing Then Rng.EntireRow.Delete
  30.         
  31.    Else
  32.        MsgBox "找不到資料 < Can't not found data>"
  33.     End If
  34.     End Sub
複製代碼

作者: v03586    時間: 2016-10-12 12:32

本帖最後由 v03586 於 2016-10-12 12:36 編輯

回復 7# GBKEE


    Sorry , 板大...我有點被搞亂了, 不知道怎麼貼上去程式內了....
    我設計的邏輯是
Input → 冰箱(存在『Database-冰箱』資料表) , Output 冰箱 會直接跑去回溫區(『Database-回溫區』)的 Input
                                                          ( Lot 是身分證 , 所以不會有重覆情況發生 , 如果有重覆也一併刪除 )
Input  → 回溫區 ( 會回到回溫區等於氮氣櫃沒位置放了, 才會放到這 ) ,Output 回溫區 會直接把資料刪除 , 等於拿出去給機器用了
Input  → 氮氣櫃 ( 機台上用不完放回去這邊 ) ,Output 氮氣櫃 會直接把資料刪除 , 等於拿出去給機器用了


冰箱取出=直接入回溫區(input) , 會再多設一個 回溫區input 是因為怕位置不夠放 , 暫放回溫區 , 才設一個回溫區 Input
回溫區取出=把東西拿出去用 僅將資料刪除 , 併重新排序 『取出優先順序(先進先出)』
氮氣櫃取出=把東西拿出去用 僅將資料刪除 , 併重新排序 『取出優先順序(先進先出)』

放入(新增)與取出(刪除) 都要排序先進先出 ( 資料表中的 < 取出優先順序 > 讓使用者知道第一個要拿取的LOT是什麼
作者: v03586    時間: 2016-10-13 04:51

回復 7# GBKEE


    版大你好!!

    更改了 查詢的功能後 ,點選查詢功能, 輸入完料號(Film P/N) , 出現如下的錯誤訊息 ,
   [attach]25529[/attach]

    另外取出回溫區是將資料刪除 = 拿出去使用 , 並非重冰箱的資料庫刪除 , 我利用圖文再次說明一下
   其邏輯跟#8樓敘述一樣
  [attach]25530[/attach]


[attach]25531[/attach]
作者: v03586    時間: 2016-10-14 12:50

回復 7# GBKEE


    最近再測...不管放入或取出 , 資料優先拿取順序不會在新增, 且距離過期日也不會計算
    不知道哪邊出了問題, 可否協助檢察哪邊錯了呢??
[attach]25539[/attach]
作者: v03586    時間: 2016-10-16 02:46

本帖最後由 v03586 於 2016-10-16 02:51 編輯

回復 7# GBKEE


    感謝大大上面的程式碼...小弟茅塞頓開後....修改程式有出現 #8~#10樓的問題了!!!
    另已經將拉錯的Textbox 改為Listbox 了!!!
    如今有一個問題 想再請教版大  , 請求協助 !!
    不知道為何 , 查詢如圖片中的料號 , 會出現圖中的錯誤
    [attach]25552[/attach]

    還有一個問題  因為『Database-回溫區』與『Database-氮氣櫃』的計算過期時間 應由 “ F欄位「 回溫後使用期限」“ 去優先計算 ( 目前都以 “H 欄位“ )
       僅有『Database-回溫區』與『Database-氮氣櫃』是以“H 欄位“
   因為想再查詢區顯示 距離過期天數, 無奈儲存格冰箱是在“ I 欄位“ 『回溫』 與『氮氣櫃』 皆在“ J 欄位“  , 如此一來 小弟犯難 不知如何修改了
   請求協助
[attach]25554[/attach]
   
   最後一個功能可有可無....就是『Database-回溫區』、『Database-回溫區』與『Database-氮氣櫃
     排序之後不知道可否依照Film PN 去排優先取出順序???  當然還是要依照快過期的先拿
   EX:  
                PN           拿取順序
      40-111111       1
      40-111111       2
      40-111111       3
      40-222222       1
      40-222222       2
      40-222222       3

[attach]25553[/attach]
作者: GBKEE    時間: 2016-10-16 14:00

本帖最後由 GBKEE 於 2016-10-17 07:22 編輯

回復 11# v03586

附檔 看看有意見再提出

[attach]25561[/attach]
可修改如下 :可是只有一筆資料時它是直著放,不會橫放
  1. ReDim Ar(0 To UBound(D(Trim(TextBox2))))
  2.                 For i = 0 To UBound(D(Trim(TextBox2)))
  3.                     Ar(i) = D(Trim(TextBox2))(i)  '''附檔如有是 ListBox1 控制項
  4.                     If i = 2 Then Exit For  '顯示三筆
  5.                 Next
  6.                 ListBox1.List = Application.Transpose(Application.Transpose(Ar)) ''附檔如有是 ListBox1 控制項
複製代碼
方法一
  1. If D.Count > 0 And D.exists(Trim(TextBox2)) Then
  2.             If UBound(D(Trim(TextBox2))) = 0 Then
  3.                 Ar = D(Trim(TextBox2))(0)
  4.                 With ListBox1
  5.                     .AddItem
  6.                    For i = 0 To UBound(Ar)
  7.                         .List(.ListCount - 1, i) = Ar(i)
  8.                     Next
  9.                 End With
  10.             Else
  11.                 ReDim Ar(0 To 2)
  12.                 For i = 0 To UBound(D(Trim(TextBox2)))
  13.                     Ar(i) = D(Trim(TextBox2))(i)  '''附檔如有是 ListBox1 控制項
  14.                     If i = 2 Then Exit For  '顯示三筆
  15.                 Next
  16.                 ListBox1.List = Application.Transpose(Application.Transpose(Ar)) ''附檔如有是 ListBox1 控制項
  17.               End If
  18.         End If
複製代碼
方法二
  1. If D.Count > 0 And D.exists(Trim(TextBox2)) Then
  2.             'ReDim Ar(0 To UBound(D(Trim(TextBox2))))
  3.             If UBound(D(Trim(TextBox2))) = 0 Then
  4.                 'Ar = D(Trim(TextBox2))
  5.                 With Range("A" & Rows.Count).Resize(, UBound(D(Trim(TextBox2))(0)) + 1)
  6.                     .Value = D(Trim(TextBox2))(0)
  7.                     ListBox1.List = .Value
  8.                     .Cells.Clear
  9.                 End With
  10.             Else
  11.                 ReDim Ar(0 To 2)
  12.                 For i = 0 To UBound(D(Trim(TextBox2)))
  13.                     Ar(i) = D(Trim(TextBox2))(i)  '''附檔如有是 ListBox1 控制項
  14.                     If i = 2 Then Exit For  '顯示三筆
  15.                 Next
  16.                 ListBox1.List = Application.Transpose(Application.Transpose(Ar)) ''附檔如有是 ListBox1 控制項
  17.             End If
  18.         End If
複製代碼

作者: v03586    時間: 2016-10-19 03:27

本帖最後由 v03586 於 2016-10-19 03:32 編輯

回復 12# GBKEE


   感謝版大, 這幾天測試後, 有幾個小問題, 煩請版大協助
   1.  輸入格式部分修正
       工號, 因編碼關係 工號可以不要卡固定字元嗎? 有時會是4個數字組成 , 有時一個英文字母+3位數字, 有時兩個英文字母+2位數字
      不變的是都是四碼
      層架編號格式
     修正為 四碼 因應編碼關係, 可否也不要卡固定3位數字嗎??
     LOT 格式
      因為供應商關係每組LOT確定不會重覆, 但是LOT格式不一樣, 可否這邊就不卡格式呢??

2. 計算過期規則不一樣
    如下圖 , 冰箱的計算過期方式 是由 G欄位膠紙到期日”去判斷距離現在還有多少天到期 ( 冰箱功能沒問題 )
    [attach]25574[/attach]
    但是, 下圖 回溫區氮氣櫃的計算方式不同, 是由F欄位回溫後使用期限』,判斷距離現在還有多少天到期(回溫區, 與氮氣櫃 錯誤)
    冰箱資料表回溫區資料表氮氣櫃資料表 三張資料表格式僅差一欄『回溫後使用期限
[attach]25575[/attach]

3. 查詢先進先出功能
    查詢冰箱中的距離過期天數, 程式跑成優先拿取順序了 ( 因為資料表只有冰箱格式與其他兩張資料表沒有一樣 ) 如下圖
   至於回溫區與氮氣櫃目前顯示的都是正確的, 只是如Q2問題, 計算位置修改好 就解決問題了
    [attach]25576[/attach]

   部分查詢料號會無法帶出資料 , 如下圖

   [attach]25577[/attach]
作者: GBKEE    時間: 2016-10-19 06:56

回復 13# v03586

不限制格式 Msg = St <> ""
回溫區與氮氣櫃的計算方式不同, 是由F欄位『回溫後使用期限』,判斷距離現在還有多少天到期
可改如下
  1. Sub Ex_Ans()
  2.     Dim St As String, I(1 To 3) As Integer, d As Object, E As Variant, Rng As Range, Ar(), Arr()
  3.     With Sh
  4.         St = "膠紙製造日"
  5.         I(1) = Sh.Rows(1).Find(St, LookIn:=xlValues, LookAt:=xlWhole).Column
  6.         .Columns(I(1)).TextToColumns Destination:=.Cells(1, I(1)), DataType:=xlDelimited, _
  7.             FieldInfo:=Array(1, 5), TrailingMinusNumbers:=True  '***(文字格式, 轉換為日期)
  8.         
  9.         ' **傳回膠紙到期日的欄位  或  回溫後使用期限 的欄位
  10.         If InStr(Sh.Name, "冰箱") Then St = "膠紙到期日" Else St = "回溫後使用期限"
  11.         I(1) = Sh.Rows(1).Find(St, LookIn:=xlValues, LookAt:=xlWhole).Column '**傳回膠紙到期日的欄位
  12.         If St = "回溫後使用期限" Then
  13.             Application.Calculation = xlManual      '活頁簿的計算: 手動
  14.             With .Columns(I(1)).SpecialCells(xlCellTypeConstants)
  15.                 .Cells = .Value                                  '** 文字格式的數字 轉為數值
  16.             End With
  17.             Sh.Calculate               '**Calculate 方法  計算所有開啟的活頁簿、活頁簿中的特定工作表或工作表中指定範圍的儲存格.
  18.             Application.Calculation = xlAutomatic  '活頁簿的計算: 自動
  19.         End If
  20.         If InStr(Sh.Name, "冰箱") Then
  21.             .Columns(I(1)).TextToColumns Destination:=.Cells(1, I(1)), DataType:=xlDelimited, _
  22.             FieldInfo:=Array(1, 5), TrailingMinusNumbers:=True  '***(文字格式, 轉換為日期)
  23.         End If
  24.         St = "距離過期天數"
  25.         I(2) = Sh.Rows(1).Find(St, LookIn:=xlValues, LookAt:=xlWhole).Column
  26.         If .Range("a" & Rows.Count).End(xlUp).Row = 1 Then Exit Sub
複製代碼
3. 查詢先進先出功能 部分查詢料號會無法帶出資料 在11# 有回覆 方法一,方法二
這裡修改
  1. Private Sub ComboBox2_Change()
  2.     Dim Rng As Range, Ar, I As Integer
  3.     With ListBox1
  4.         .Clear
  5.         If ComboBox2.ListIndex = -1 Then Exit Sub
  6.         Ar = Dt(ComboBox2.Value)
  7.         If UBound(Ar) = 0 Then
  8.             .AddItem
  9.             For I = 0 To UBound(Ar(0))
  10.                 .List(0, I) = Ar(0)(I)
  11.             Next
  12.         Else
  13.             .List = Application.Transpose(Application.Transpose(Ar))
  14.         End If
  15.     End With
  16. End Sub
複製代碼

作者: v03586    時間: 2016-10-19 07:19

本帖最後由 v03586 於 2016-10-19 07:33 編輯

回復 14# GBKEE


    感謝版大!!! 終於解決了!!!

但問題3當中, 查詢先進先出, 冰箱, 距離過期天數一樣還是顯示『優先拿取順序』, 資料表-冰箱『J欄位』 正確應該顯示『I欄位』
  因為資料表回溫區與氮氣櫃, 正確要顯示『J欄位』

另外目前距離過期天數跑出小數點好幾位, 可否顯示小數點後一位就好呢??

不限制格式
請問是這樣修改即可嗎???
  1. Private Sub TextBox4_Change()
  2.     Dim St As String, Msg As Boolean, I As Integer, Ar

  3.     Msg = St <> ""
  4. End Sub
複製代碼

作者: GBKEE    時間: 2016-10-19 08:51

回復 15# v03586
  1. Private Sub TextBox4_Change()
  2.      Dim St As String, Msg As Boolean
  3.         St = Trim(TextBox4)
  4.         Msg = St <> ""
  5.        TheMsg 4, Msg
  6. End Sub
複製代碼
  1. Private Sub Lot_Get()
  2.     Dim I As Long, St As String, B As String, C As String, d As String, Ar(), X As Integer
  3.     Set Dt = CreateObject("ScripTING.DICTIONARY")
  4.     'X = IIf(InStr(ActiveSheet.Name, "冰箱"), 9, 10)
  5.     With Sh
  6.         X = IIf(InStr(.Name, "冰箱"), 9, 10)
  7.         I = ShRow
  8.         Do While .Cells(I, "C") <> ""
  9.             B = .Cells(I, "B"):    C = .Cells(I, "C"):  d = .Cells(I, "D"):    St = Format(.Cells(I, X), "0.0")
  10.             If Not Dt.EXISTS(C) Then
  11.                 Dt(C) = Array(Array(B, C, d, St))
  12.             Else
  13.                 Ar = Dt(C)
  14.                 ReDim Preserve Ar(LBound(Ar) To UBound(Ar) + 1)
  15.                 Ar(UBound(Ar)) = Array(B, C, d, St)
  16.                  Dt(C) = Ar
  17.                  Ar = Dt(C)
  18.             End If
  19.             I = I + 1
  20.         Loop
  21.     End With
複製代碼

作者: v03586    時間: 2016-10-19 12:42

本帖最後由 v03586 於 2016-10-19 12:43 編輯

回復 16# GBKEE


    感謝版大...!! 現如今改掉限制後發現一個問題
   Lot 部分 只能Keyin 一個字元 就往下一格跳
   即使使用刷條碼的方式 , 例如 EE000-0001 , Lot 格式就只帶E , PCS 那欄會跳E000-0001
   回溫後使用期限的時間格式 , 也無法手動修改 如下圖 , 修改一個數字就往下一格跳

[attach]25579[/attach]
作者: GBKEE    時間: 2016-10-19 12:47

本帖最後由 GBKEE 於 2016-10-20 05:06 編輯

回復 17# v03586
  1. Private Sub TheMsg(T As Integer, Msg As Boolean)   ''** 程式作用  資料輸入格式的檢查
  2.     '** 乎叫此程式 須帶有 參數1   ,參數2
  3.     Dim St As String
  4.     Text_Ar(T).BackColor = IIf(Msg, 正常色, 錯誤色)
  5.     Text_Msg(T) = Msg
  6.     ComButton_檢查
  7.     If ComButton.Enabled Then ListBox1_Change
  8.     If ComButton.Enabled Then
  9.         ComButton.SetFocus          '**SetFocus 方法 將駐點移到此物件的執行個體上。
  10.     ElseIf Msg Then                     '**輸入格式的正確 下移至下一個控制項
  11. '*****************這裡試著修改 ****************************
  12.         If T > 2 And T <> 5 And T <> UBound(Text_Ar) Then Text_Ar(T + 1).SetFocus
  13. '********************************************************
  14.     End If
  15. End Sub
複製代碼
回溫後使用期限 格式 與 放入時間格式 Private Sub TextBox9_Change() 是相同的
  1. Private Sub TextBox6_Change()
  2.    Dim St, Msg As Boolean, Ar
  3.    '格式  日期&時間
  4.     St = Trim(TextBox6)
  5.     Msg = UBound(Split(St, "/")) = 2 And UBound(Split(St, " ")) = 1 And UBound(Split(St, ":")) = 1: If Not Msg Then GoTo Ne
  6.     Ar = Split(St, " ")
  7.     Msg = IsDate(Ar(0)): If Not Msg Then GoTo Ne
  8.     Msg = IsDate(Ar(1)): If Not Msg Then GoTo Ne
  9.     If Msg Then TextBox6 = Format(TextBox6, 日期時間格式)
  10. Ne:
  11.     TheMsg 6, Msg
  12. End Sub
複製代碼

作者: v03586    時間: 2016-10-19 13:27

回復 18# GBKEE


    版大, 我有修改過 工號 跟 層架編號解除限制 , 不知道是否影響那一欄的判斷
工號
  1. Private Sub TextBox1_Change()          '** 控制項有變動 : 程式作用  資料格式 的檢查
  2.     Dim St As String, Msg As Boolean, I As Integer
  3.     St = Trim(TextBox1)
  4.     Msg = St <> "" And Len(St) > 1: If Not Msg Then GoTo Ne   '**Msg=False 程式移到 Ne 繼續執行
  5. Ne:
  6.      TheMsg 1, Msg
  7. End Sub
複製代碼
層架編號
  1. Private Sub TextBox2_Change()
  2.    Dim St As String, Msg As Boolean
  3.     St = Trim(TextBox2)
  4.     Msg = St <> ""
  5.     TheMsg 2, Msg
  6. End Sub
複製代碼
接下來Lot 是依照版大所以修改的

如下版大請我嘗試修改的範圍
  1. Private Sub TheMsg(T As Integer, Msg As Boolean)   ''** 程式作用  資料輸入格式的檢查
  2.     '** 乎叫此程式 須帶有 參數1   ,參數2
  3.     Dim St As String
  4.     Text_Ar(T).BackColor = IIf(Msg, 正常色, 錯誤色)
  5.     Text_Msg(T) = Msg
  6.     ComButton_檢查
  7.     If ComButton.Enabled Then ListBox1_Change
  8.     If ComButton.Enabled Then
  9.         ComButton.SetFocus          '**SetFocus 方法 將駐點移到此物件的執行個體上。
  10.     ElseIf Msg Then                     '**輸入格式的正確 下移至下一個控制項
  11. '*****************這裡試著修改 ****************************
  12.         If T > 2 And T <> 5 And T <> UBound(Text_Ar) Then Text_Ar(T + 1).SetFocus
  13. '********************************************************
  14.     End If
  15. End Sub
複製代碼
我修改了 紅色字體 , 變成PCS一個字元就跳去下一格, 回溫後使用期限 , 點兩下變成1899年...也是修改一個數字就跳去下一個
  If T > 1 And T <> 4 And T <> UBound(Text_Ar) Then Text_Ar(T + 1).SetFocus

我修改了 紅色字體 , 變成LOT、回溫後使用期限修改 一個字元就跳去下一格, 回溫使用期限點兩下變成1899年...
可否將膠紙製造日, 到期日 不卡規則呢?? 因為也是刷條碼, 廠商條碼格式就像當初的一樣是字元格式 ”20171011” , 再由程式去轉換時間格式
  If T > 3 And T <> 6 And T <> UBound(Text_Ar) Then Text_Ar(T + 1).SetFocus
作者: GBKEE    時間: 2016-10-20 05:42

本帖最後由 GBKEE 於 2016-10-20 05:54 編輯

回復 19# v03586
回溫使用期限點兩下變成1899年...
修改這裡
  1. Sub 放入冰箱()   'Input 冰箱 (資料存入『Database-冰箱』)
  2.     Set Sh = Sheets("Database-冰箱")
  3.     回溫後使用期限 = Now + 2       '**給值
  4.     Com_Title = " [ 放入冰箱 ]"
  5.     Form_InPut.Show
  6. End Sub
複製代碼
  1. If T = 3 Or T >= 6 And T <> UBound(Text_Ar) Then Text_Ar(T + 1).SetFocus
  2.         '** 1工號 , 2層架編號 , 4LOT, 5PCS  **不設格式不跳到下一輸 入控制項
  3.         '**3Film P/N , 6回溫後使用期限, 7膠紙製造日 8 膠紙到期日 **'跳到下一輸 入控制項
  4.         '** 9 放入時間=>Text_Ar(T + 1).SetFocus 會有錯誤的
複製代碼
工號 跟 層架編號....   解除限制
  1. Private Sub TextBox1_Change()          '** 控制項有變動 : 程式作用  資料格式 的檢查
  2.      '**不限制格式
  3.      TheMsg 1, Trim(TextBox1) <> ""   '不限制格式
  4. End Sub
複製代碼
設定條碼格式
  1. Private Sub TextBox7_Change()
  2.     '格式  條碼 8 位數
  3.     Dim St(1 To 2) As String, Msg As Boolean, Ar
  4.     St(1) = Trim(TextBox7)
  5.     Msg = Len(St(1)) = 8 And IsNumeric(St(1)): If Not Msg Then GoTo Ne
  6.     St(2) = Mid(St(1), 1, 4) & "/" & Mid(St(1), 5, 2) & "/" & Mid(St(1), 7, 2)
  7.     Msg = IsDate(St(2)): If Not Msg Then GoTo Ne         '**日期正確
  8.     Msg = DateValue(St(2)) < Date: If Not Msg Then GoTo Ne    '**膠紙製造日必小於當日
  9. Ne:
  10.     TheMsg IIf(Label6.Enabled, 7, 6), Msg
  11. End Sub
  12. Private Sub TextBox8_Change()
  13.      '格式  條碼 8 位數
  14.     Dim St(1 To 3) As String, Msg As Boolean, Ar
  15.    St(1) = Trim(TextBox8)
  16.     Msg = Len(St(1)) = 8 And IsNumeric(St(1)): If Not Msg Then GoTo Ne
  17.     St(2) = Mid(St(1), 1, 4) & "/" & Mid(St(1), 5, 2) & "/" & Mid(St(1), 7, 2)  '膠紙到期日
  18.     Msg = IsDate(St(2)): If Not Msg Then GoTo Ne
  19.     Msg = Text_Msg(IIf(Label6.Enabled, 7, 6)): If Not Msg Then GoTo Ne '膠紙製造日是否正確
  20.     St(3) = Trim(TextBox7)
  21.     St(3) = Mid(St(3), 1, 4) & "/" & Mid(St(3), 5, 2) & "/" & Mid(St(3), 7, 2)  '**'膠紙製造日
  22.     Msg = DateValue(St(2)) > DateValue(St(3))                       '**膠紙到期日必大於膠紙製造日
  23. Ne:
  24.     TheMsg IIf(Label6.Enabled, 8, 7), Msg
  25. End Sub
  26. '**設定條碼格式 後需修改
  27. Private Sub ComButton_Click()          '**控制項的事件 (按下控制項)
  28.     Dim i As Integer, XR As Integer
  29.     If MsgBox(Join(Text_Ar, vbLf), vbYesNo, "   ** 確定 " & Com_Title & "  **") = vbYes Then
  30.         '**Join 函數 傳回一個字串 , 該字串是透過連結某個陣列中的多個子字串而建立的
  31.         XR = Application.CountA(Sh.[A:A])
  32.         With Sh.Range("A" & XR).Offset(1)
  33.             For i = 1 To UBound(Text_Ar)               '**UBound 函數 傳回 Long值,表示指定陣列某維最大可使用的陣列索引。
  34.                  If InStr(Sh.Name, "冰箱") And (i = 6 Or i = 7) Then
  35.                     .Cells(1, i) = Mid(Text_Ar(i), 1, 4) & "/" & Mid(Text_Ar(i), 5, 2) & "/" & Mid(Text_Ar(i), 7, 2)
  36.                  ElseIf InStr(Sh.Name, "冰箱") = 0 And (i = 7 Or i = 8) Then
  37.                     .Cells(1, i) = Mid(Text_Ar(i), 1, 4) & "/" & Mid(Text_Ar(i), 5, 2) & "/" & Mid(Text_Ar(i), 7, 2)
  38.                  Else
  39.                     .Cells(1, i) = UCase(Text_Ar(i).Text)  '**UCase 函數 傳回一個 Variant (String),所含為轉成大寫之字串。
  40.                 End If
  41.             Next
  42.         End With
  43.         DataBase_Show
  44.     End If
  45.     ListBox1_Change
  46. End Sub
複製代碼

作者: v03586    時間: 2016-10-21 13:29

回復 20# GBKEE


    版大您好!! 昨天將系統上線後, 使用者Feedback 的意見, 他們提到希望只要輸入有效資料
   資料表上需計算有效資料僅有
          『冰箱-DatabaseG欄位-膠紙到期日
          『回溫區-DatabaseF欄位-回溫後使用期限
          『氮氣櫃-DatabaseF欄位-回溫後使用期限
    故希望將無效資料刪除, 節省人員作業時間
   刪除後
    資料欄位如下圖, 如此一來 計算欄位就一致了!! 就不會像之前冰箱特別在某一欄, 其他兩個欄位不一樣
    [attach]25591[/attach]
   

修改後的IN/OUT 畫面如下圖
取出的畫面, 使用者雖然再查詢頁面找到Lot , 但資料筆數太多了...昨天找了很久, 可否新增一個需要輸入P/N 再讓使用者按拿取的畫面
(使用者也是刷條碼)

放進去的畫面, 除了冰箱不輸入, 回溫後使用期限, 其他都要輸入回溫後使用期限
不同一點的是, 冰箱要輸入膠紙到期日, 其他的則不需要輸入膠紙到期日 ,
工號, 層架. Lot 不卡資料格式 ,
PCS僅支援  1~999 ,  先前改完判斷 輸入1個數字就會跳到下一格
膠紙到期日一樣是回溫區,與氮氣櫃需要輸入, 一樣是刷條碼方式, 20161010 程式解析

之前輸入回溫後使用期限, 時間格式, 輸入到分 , 就會跳到下一格, 是否能有解呢??

放入日期是否可以改成按下按鈕的同時自動帶入資料庫就行了

[attach]25592[/attach]
作者: GBKEE    時間: 2016-10-23 10:38

回復 21# v03586

附檔試試看

[attach]25602[/attach]
   

[條碼] 沒接觸過,如有問題,我不知.




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