กระทู้เก่าบอร์ด อ.Yeadram
1,690 4
URL.หัวข้อ /
URL
เปลี่ยนเดือนแล้วต้องการให้เพิ่มทีละ 1
ผมอยากทราบว่าจะเขียนฟังก์ชั่น อย่างไรให้ มันทำงานได้ โดยผมสมมติว่าเดือนนี้ (ม.ค.) ข้อมูลเป็นวันที่ text file 550123 (yymmdd) ผมต้องให้ให้เดือนนี้ค่าเริ่มต้นคือ LOT41 พอเดือนถัดไปก็เป็น LOT42, LOT43 , LOT44 , LOT45 โดยเพิ่มขึ้นเดือนละ LOT ครับ โดยอยากให้มัน Return ค่ากลับมาเป็นตัวอักษรตามที่บอกไว้ครับ
ตัวอย่างที่ต้องการครับ
text file : 550123 ===> LOT41
text file : 550124 ===> LOT41
text file : 550201 ===> LOT42
text file : 550229 ===> LOT43 *** หากเป็นวันที่สิ้นเดือนให้เริ่ม LOT ใหม่ด้วย ****
text file : 550301 ===> LOT43
text file : 550415 ===> LOT44
ขอบคุณทุกท่านที่ให้คำตอบครับ
ตัวอย่างที่ต้องการครับ
text file : 550123 ===> LOT41
text file : 550124 ===> LOT41
text file : 550201 ===> LOT42
text file : 550229 ===> LOT43 *** หากเป็นวันที่สิ้นเดือนให้เริ่ม LOT ใหม่ด้วย ****
text file : 550301 ===> LOT43
text file : 550415 ===> LOT44
ขอบคุณทุกท่านที่ให้คำตอบครับ
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R11982
ขอบคุณครับผมลองดูแล้วใช้ได้ครับ แต่ว่าหากเป็นวันที่สิ้นเดือนผมอยากให้มันขึ้น LOT ใหม่ด้วยครับ
ปล : ผมไม่เข้าใจตรงบรรทัดที่ต้อง /100 - 5460 หมายถึงอะไรหรอครับ
ปล : ผมไม่เข้าใจตรงบรรทัดที่ต้อง /100 - 5460 หมายถึงอะไรหรอครับ
3 @R11997
ขอโทษทีครับ ดูไม่ละเอียดเรื่องสิ้นเดือนขึ้น Lot ใหม่
ถ้ากรณีสิ้นเดือน --> ยากแล้วครับ แต่ทำได้ โดยต้องแปลงค่า FileName ให้เป็นเดือนก่อนแล้วเทียบว่าใช่สิ้นเดือนหรือไม่ ถ้าใช่ให้บวกเพิ่มอีกหนึ่งเป็น Lot ใหม่ (หลักการง่ายครับ แต่โค้ดกันยาว คงต้องขอเวลาว่างๆก่อนนะครับ)
ในมุมกลับขอถามครับ ทำไมต้องขึ้น Lot ใหม่ ณ วันสิ้นเดือน? (ขอเหตุผลที่แท้จริงนะครับ ไม่ใช่ว่า "เขาบอกมาให้ทำแบบนี้")
ในหลายๆคำถามที่ผมเจอ ส่วนมากเกิดจากการทำต่อเนื่องมาจากอดีต มีใครบางคนกำหนดให้มานานแล้ว ซึ่งถ้าตรวจสอบดูดีๆ อาจจะพบว่าเกิดจาก ความสามารถของคนหรือเครื่องมือ หรืออะไรก็ตามในตอนนั้น ไม่เอื้อให้ทำได้ดีกว่านี้ ...ก็ไม่ได้คาดหวังว่าจะเกิดการเปลี่ยนแปลงได้ทันที แต่อย่างน้อยระบบใหม่ๆที่เกิดตามมาจะได้ดีกว่าและง่ายกว่าเดิม
ส่วนสูตรที่ให้ไป ก็คำนวณธรรมดาครับ ลองคิดดูดีๆ ไม่มีอะไรซับซ้อน
ใบ้ให้ว่า "ทำไม 550123 จึงต้องเท่ากับ Lot 41 ?"
ถ้ากรณีสิ้นเดือน --> ยากแล้วครับ แต่ทำได้ โดยต้องแปลงค่า FileName ให้เป็นเดือนก่อนแล้วเทียบว่าใช่สิ้นเดือนหรือไม่ ถ้าใช่ให้บวกเพิ่มอีกหนึ่งเป็น Lot ใหม่ (หลักการง่ายครับ แต่โค้ดกันยาว คงต้องขอเวลาว่างๆก่อนนะครับ)
ในมุมกลับขอถามครับ ทำไมต้องขึ้น Lot ใหม่ ณ วันสิ้นเดือน? (ขอเหตุผลที่แท้จริงนะครับ ไม่ใช่ว่า "เขาบอกมาให้ทำแบบนี้")
ในหลายๆคำถามที่ผมเจอ ส่วนมากเกิดจากการทำต่อเนื่องมาจากอดีต มีใครบางคนกำหนดให้มานานแล้ว ซึ่งถ้าตรวจสอบดูดีๆ อาจจะพบว่าเกิดจาก ความสามารถของคนหรือเครื่องมือ หรืออะไรก็ตามในตอนนั้น ไม่เอื้อให้ทำได้ดีกว่านี้ ...ก็ไม่ได้คาดหวังว่าจะเกิดการเปลี่ยนแปลงได้ทันที แต่อย่างน้อยระบบใหม่ๆที่เกิดตามมาจะได้ดีกว่าและง่ายกว่าเดิม
ส่วนสูตรที่ให้ไป ก็คำนวณธรรมดาครับ ลองคิดดูดีๆ ไม่มีอะไรซับซ้อน
ใบ้ให้ว่า "ทำไม 550123 จึงต้องเท่ากับ Lot 41 ?"
4 @R11998
จริงๆ ผมทำได้แล้วละครับ เพียงแต่ว่ามันยังไม่ครอบคลุมความต้องการ
เนื่องจากโค้ดที่ผมเขียนมันใช้ได้เพียงปีต่อปี พอขึ้นปีใหม่จะให้นับ LOT ต่อเนื่องไปเลยนั้นยังทำไม่ได้ครับ ต้องไปแก้ที่ค่าตั้งต้นเสียก่อนครับ โค้ดที่ผมเขียนนะครับ
Public Function LotCycle(lcycleDate As Long) As String
Dim xDate As Date, FixedLot As Long
FixedLot = 40
If lcycleDate = 541231 Then
LotCycle = " Lot " & FixedLot
Debug.Print lcycleDate
ElseIf lcycleDate > 541231 Then
xDate = CDate(Right(lcycleDate, 2) & "/" & Mid(lcycleDate, 3, 2) & "/" & "25" & Left(lcycleDate, 2))
If xDate = MonthEnd(xDate) Then
LotCycle = " Lot " & FixedLot + CInt(Format(xDate, "m")) + 1
Debug.Print LotCycle
Else
LotCycle = " Lot " & FixedLot + CInt(Format(xDate, "m"))
Debug.Print LotCycle
End If
Else
Exit Function
End If
End Function
'----------------------------------------------------------------
Public Function MonthEnd(dtVal As Date) As Date
MonthEnd = DateSerial(Year(dtVal), Month(dtVal) + 1, 1) - 1
End Function
ส่วนคำถามที่ว่าทำไมต้องขึ้น Lot ใหม่เวลาสิ้นเดือน เนื่องจากว่าข้อมูลเป็นวันที่ย้อนหลัง 1 วันครับ ดังนั้นพอสิ้นเดือนถึงต้องให้ขึ้น Lot ใหม่เนื่องจากเราจะนับ Lot ตามเดือนจริงๆ ไม่ได้นับตามวันที่ข้อมูลครับ
ส่วนที่ต้อง /100 -5460 นั้นเข้าใจแล้วครับเป็นหลักการคิดที่ง่ายๆ ที่มองข้ามไปครับ ดังนั้นจึงจำเป็นต้องแปลงค่าให้กลับมาเป็นจำนวนเต็มโดยใช้ฟังก์ชั่น int นี่เอง ขอบคุณที่ให้แนวคิดครับ ทำให้ลดการเขียนโค้ดลงได้มาก ครับ
เนื่องจากโค้ดที่ผมเขียนมันใช้ได้เพียงปีต่อปี พอขึ้นปีใหม่จะให้นับ LOT ต่อเนื่องไปเลยนั้นยังทำไม่ได้ครับ ต้องไปแก้ที่ค่าตั้งต้นเสียก่อนครับ โค้ดที่ผมเขียนนะครับ
Public Function LotCycle(lcycleDate As Long) As String
Dim xDate As Date, FixedLot As Long
FixedLot = 40
If lcycleDate = 541231 Then
LotCycle = " Lot " & FixedLot
Debug.Print lcycleDate
ElseIf lcycleDate > 541231 Then
xDate = CDate(Right(lcycleDate, 2) & "/" & Mid(lcycleDate, 3, 2) & "/" & "25" & Left(lcycleDate, 2))
If xDate = MonthEnd(xDate) Then
LotCycle = " Lot " & FixedLot + CInt(Format(xDate, "m")) + 1
Debug.Print LotCycle
Else
LotCycle = " Lot " & FixedLot + CInt(Format(xDate, "m"))
Debug.Print LotCycle
End If
Else
Exit Function
End If
End Function
'----------------------------------------------------------------
Public Function MonthEnd(dtVal As Date) As Date
MonthEnd = DateSerial(Year(dtVal), Month(dtVal) + 1, 1) - 1
End Function
ส่วนคำถามที่ว่าทำไมต้องขึ้น Lot ใหม่เวลาสิ้นเดือน เนื่องจากว่าข้อมูลเป็นวันที่ย้อนหลัง 1 วันครับ ดังนั้นพอสิ้นเดือนถึงต้องให้ขึ้น Lot ใหม่เนื่องจากเราจะนับ Lot ตามเดือนจริงๆ ไม่ได้นับตามวันที่ข้อมูลครับ
ส่วนที่ต้อง /100 -5460 นั้นเข้าใจแล้วครับเป็นหลักการคิดที่ง่ายๆ ที่มองข้ามไปครับ ดังนั้นจึงจำเป็นต้องแปลงค่าให้กลับมาเป็นจำนวนเต็มโดยใช้ฟังก์ชั่น int นี่เอง ขอบคุณที่ให้แนวคิดครับ ทำให้ลดการเขียนโค้ดลงได้มาก ครับ
Time: 0.3488s
Function AssignLot(FileName) as String
LotNo = int(val(FileName) / 100) - 5460
Return = "LOT" & LotNo
End Function