返回列表 上一主題 發帖

[發問] 如何判定料號+批號其生產天數

回復 9# jsc0518

用你原來的檔案測試是OK的,裡面也有2天重複只計算1次
有新的測試檔案嗎?我看看萬提在哪裡?
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 21# ML089
Dear ML089,
我修改了儲存格格式後,再套用你的公式,就OK了。
Just do it.

TOP

本帖最後由 Andy2483 於 2022-11-28 14:16 編輯

回復 18# 准提部林

謝謝 jsc0518 前輩發表此主題與範例
謝謝 准提部林前輩指導
以下學習前輩的程式碼心得,請前輩再指導!

'不了解題意不是問題!將前輩的程式碼一行行學習!就會知道題意!
'因為後學不是要解答!是學習!

Option Explicit
Sub test_1()
Dim Arr, xD, Brr(), T$, T1$, i&, n%, m%
'↑宣告變數
[02!g:i].ClearContents '不累計, 這要先清空
'↑名為"02"的工作表(以下稱:表二) G:I欄清除內容
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD 是字典
Arr = Range([01!a1], [01!c65536].End(3))
'↑令Arr 是陣列!倒入 名為"01"工作表(以下稱:表一),
'表一[A1]到C欄最後有內容的最小方正區域儲存格區域的值

ReDim Brr(1 To UBound(Arr), 1 To 3)
'↑宣告Brr陣列的範圍! 縱向從1到 Arr陣列縱向最大列號,橫向從1到3
For i = 2 To UBound(Arr)
'↑設順迴圈從2到 Arr陣列縱向最大列號
    T = Arr(i, 2) & "|" & Arr(i, 3)
    '↑令T字串變數 是迴圈列第二欄Arr陣列位置的值連接 "|" 符號,
    '再連接 迴圈列第三欄Arr陣列位置的值,(以下稱:料號|批號)

    T1 = Arr(i, 1) & "|" & T
    '↑令T1字串變數 是迴圈列第一欄Arr陣列位置的值連接 "|" 符號,
    '再連接 T變數 (以下稱: 日期|料號|批號)

    m = xD(T)
    '↑令m數字變數 是字典裡 料號|批號 為key對應的item
    '一開始m是初始值0
    '在i=2時!其實這一行程式碼已做了兩件事
    '1."A123456|R001"這字串已經藉由此行程式碼作為key,Item是字典初始值 Variant
    '2.m=0
   
    '換個方式敘述:查字典裡KEY是 "A123456|R001"的ITEM是什麼?找得到就把item給m
    '如果沒這個key! 就把這字串當key放進字典裡
   
    '如果能耐心的跟著繞迴圈理解!就會發現 m只是去查字典看 料號|批號 是在Brr陣列第幾列

   
    xD(T1) = xD(T1) + 1
    '↑令 日期|料號|批號 字串變數為key的item累加1
   
    '以前都覺得很奇怪前面程式碼又沒有這個變數!! 為什麼會在這裡 +1 ???
    '原來是以前都沒有變數初始值的觀念!所以都看不懂!
    '不是宣不宣告的問題! 不檢查宣告變數Option Explicit ,不宣告程式碼還是會跑!
    '只是被認定是通用變數!使用這個變數來做數學運算,他就是數字.....
   
    '沒有正統學習,駑鈍的資質就從學習跟錯誤中求進步!
    '字典好像也可以宣告他只裝數字或字串!再學習其他帖子就有機會學到了!
    '謝謝論壇!謝謝各位前輩!

   
   '所以 xD(T1) = xD(T1) + 1 只是在確定 日期|料號|批號 是不是全新組合!後方排除重複!  @2
    If m = 0 Then
    '↑如果m數字變數是0 ??(迴圈跑到 料號|批號 是第一次在字典裡查這key m才會是0)
       n = n + 1
       '↑令n數字變數開始累加1  這是要放Brr陣列結果的列位,如下方 @1標註位置
        '一開始n初始值是0
       '這是要新增一筆 全新組合的 料號|批號 放Brr陣列結果的列位

       m = n
       '↑令 m數字變數值=n數字變數值
       'n是要繼續累加!
       '所以也要有個變數,裝現在迴圈 料號|批號 放Brr陣列結果的列位 的列號

       xD(T) = n
       '↑令以 料號|批號 變數為key的item= n變數值
       Brr(n, 1) = Arr(i, 2) '@1
      '↑將迴圈列第二欄Arr陣列位置的值倒入 Brr陣列(n數字變數值列,第一欄)位置
       Brr(n, 2) = Arr(i, 3)  '@1
       '↑將迴圈列第三欄Arr陣列位置的值倒入 Brr陣列(n數字變數值列,第二欄)位置
    End If
    If xD(T1) = 1 Then '@2
    '↑如果 日期|料號|批號 字串變數為key的item 等於 1
    '雖然前面 都有把 料號|批號 放Brr陣列結果的列位 的列號m帶出來!
    '但是 日期|料號|批號 如果重複了!這條件是不會成立的!

       Brr(m, 3) = Brr(m, 3) + 1
       '↑讓 Brr陣列(m數字變數值列,第三欄)位置的值累加1
    End If
   
Next
[02!g1:i1] = [{"料號","批號","天數"}]
'↑令表二儲存格[G1:I1]依序倒入標題 "料號","批號","天數"
'又學到了!以前都只會 [02!G1:I1] = Array("料號", "批號", "天數")

With [02!g2].Resize(n, 3)
'↑以下是關於表二[G2]儲存格向下擴展n列,向右擴展3欄的範圍儲存格(以下稱:結果格)
     .Value = Brr
     '↑把Brr陣列的值倒入結果格
     .Sort KEY1:=.Item(1), Order1:=1, _
           Key2:=.Item(2), Order2:=1, Header:=2
     '↑結果格做排序
     '以前都以為是指定哪一儲存格做KEY1:,指定哪一儲存格做KEY2:
     '原來是抓排序儲存格的欄位而已

End With
End Sub
Sub 二層次_漸增排序()
Dim xA
Set xA = [G2:I7]
xA.Sort _
KEY1:=xA.Item(1), Order1:=xlAscending, _
Key2:=xA.Item(2), Order2:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
End Sub

TOP

        靜思自在 : 心中常存善解、包容、感思、知足、惜福。
返回列表 上一主題