กระทู้เก่าบอร์ด อ.Yeadram
        
           1,843   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.8001s
    
      
		
Function AssignLot(FileName) as String
LotNo = int(val(FileName) / 100) - 5460
Return = "LOT" & LotNo
End Function