#1
by Mistermis » Mon Sep 09, 2019 1:11 pm
สวัสดีอาจารย์และผู้รู้ทุกท่าน ผมมีข้อสงสัยเกี่ยวกับการหาตำแหน่งของตัวเลขในเซลล์เดียวกัน
ตามโค้ดด้านล่างนี้เป็น Code เกี่ยวกับการหาอายุงานของพนักงานครับ
Code: Select all
Sub DayWork()
Dim Bdate, DD, DM, DY As String
Dim TD, TDD, TD_D As String
Dim BBD, BBND, DayFM As String
Dim DF_Y, Fyear As String
Dim last_row As Integer
Dim Ddate As Date
Dim FM, FD, FY As Integer
Dim aday, IcolS, Icolf As Long
IcolS = Cells(Rows.Count, "A").End(xlUp).Row
FY = tb_FY
FM = tb_FM
FD = tb_FD
Ddate = Date
Bdate = DateSerial(FY, FM, FD)
Cells(IcolS, "E").Value = DateSerial(FY + 543, FM, FD)
If Month(Ddate) >= Month(Bdate) Then
DY = DateDiff("YYYY", Bdate, Date)
TD = DateSerial(FY, Month(Date), Day(Date))
If Day(TD) >= Day(Bdate) Then
BBD = DateSerial(FY, FM, Day(Date))
DM = DateDiff("M", BBD, TD)
TD_D = DateSerial(FY, FM, Day(Date))
DD = DateDiff("D", TD_D, Bdate)
Else
BBND = DateSerial(FY, FM, Day(Date))
DM = DateDiff("M", BBND, TD)
Select Case FM
Case "1", " 3", "5", "7", "8", "10", "12"
DayFM = 31
Case "4", "6", "9", "11"
DayFM = 30
Case "2"
Fyear = DateSerial(2020, Month(Bdate), Day(Bdate))
DF_Y = DateDiff("YYYY", Bdate, Fyear)
DF_Y = (DF_Y Mod 4)
If DF_Y = 0 Then
DayFM = 29
DD = (DayFM - FD) + Day(Date)
Else
DayFM = 28
End If
End Select
DD = (DayFM - FD) + Day(Date)
DM = DM - 1
End If
Else
Ddate = DateSerial(FY + 1, Month(Date), Day(Date))
DY = DateDiff("YYYY", Ddate, Date)
If Day(Ddate) > Day(Bdate) Then
TDD = DateSerial(FY, FM, Day(Date))
DM = DateDiff("M", Ddate, Bdate)
DD = DateDiff("D", TDD, Bdate)
Else
BBND = DateSerial(FY, FM + 1, Day(Date))
DM = DateDiff("M", Ddate, BBND)
Select Case FM
Case "1", " 3", "5", "7", "8", "10", "12"
DayFM = 31
Case "4", "6", "9", "11"
DayFM = 30
Case "2"
Fyear = DateSerial(2020, Month(Bdate), Day(Bdate))
DF_Y = DateDiff("YYYY", Bdate, Fyear)
DF_Y = (DF_Y Mod 4)
If DF_Y = 0 Then
DayFM = 29
Else
DayFM = 28
End If
End Select
DD = (DayFM - FD) + Day(Date)
End If
End If
Cells(IcolS, "F").Value = CStr(Abs(DY)) & "-" & CStr(Abs(DM)) & "-" & CStr(Abs(DD))
Cells(IcolS, "G").Value = CStr(Abs(DY))
Next i
End Sub
จาก Code ข้างต้นมีวิธีการทำงานคร่าวๆ คือ เมื่อกรอกวันที่เริ่มทำงานใน form โดยจะแบ่งเป็น 3 textbox คือ วัน / เดือน / ปี ตามลำดับ
แล้วจากนั้นจะทำการรันออกมาเป็นอายุงาน ซึ่งเป็น textbox เดียว และนำไปใส่ยังตารางในไฟล์ที่แนบให้
คำถาม ถ้าผมต้องการสร้างปุ่มอัพเดต แล้วเมื่อกดปุ่มอัพเดต จะให้ทำการอัพเดตอายุงานของพนักงานทั้งหมดให้เป็นปัจจุบันทันที (เนื่องจาก Code ด้านบนไม่มีคำสั่งให้อัพเดตอายุงานให้เป็นปัจจุบันเอง) แต่ปัญหาคือ ค่าของตัวแปร FD FM FY ที่มาจาก Textbox 3 Box นั้น มันคือการนำเข้าของค่าที่อยู่ในเซลล์เดียวกันใน Column E ซึ่งเป็น Type วันที่ เช่น 12/6/2562
ดังนั้นสิ่งที่ผมต้องการ คือ Code เพื่อหาตำแหน่งตัวเลขของเซลล์นั้นๆ เพื่อนำเข้าไปใส่ในตัวแปร FD FM FY เช่น ถ้าค่าของวันที่ในเซลล์นั้นเป็น 12/6/2562 ก็ให้ FD = 12 , FM = 6 , FY = 2562 เป็นต้น
ตัวอย่าง Code ตามที่ผมได้ศึกษาแล้วลองเขียนมาครับ (แต่ก็ยังไม่ได้)
Code: Select all
Set ws = ActiveSheet
last_row = ws.Cells(Rows.Count, 1).End(xlUp).Row
For i = 3 To last_row
IcolS = Cells(Rows.Count, "A").End(xlUp).Row
FY = ws.Cells(i, E).Characters(1, 2).Value
FM = ws.Cells(i, E).Characters(4, 2).Value
FD = ws.Cells(i, E).Characters(7, 4).Value
ถ้าหากมีข้อผิดพลาดประการใดก็ขออภัยและขอคำแนะนำจากผู้รู้ทุกท่านด้วยครับ ขอบคุณอาจารย์และผู้รู้ทุกท่าน
สวัสดีอาจารย์และผู้รู้ทุกท่าน ผมมีข้อสงสัยเกี่ยวกับการหาตำแหน่งของตัวเลขในเซลล์เดียวกัน
ตามโค้ดด้านล่างนี้เป็น Code เกี่ยวกับการหาอายุงานของพนักงานครับ
[code]
Sub DayWork()
Dim Bdate, DD, DM, DY As String
Dim TD, TDD, TD_D As String
Dim BBD, BBND, DayFM As String
Dim DF_Y, Fyear As String
Dim last_row As Integer
Dim Ddate As Date
Dim FM, FD, FY As Integer
Dim aday, IcolS, Icolf As Long
IcolS = Cells(Rows.Count, "A").End(xlUp).Row
FY = tb_FY
FM = tb_FM
FD = tb_FD
Ddate = Date
Bdate = DateSerial(FY, FM, FD)
Cells(IcolS, "E").Value = DateSerial(FY + 543, FM, FD)
If Month(Ddate) >= Month(Bdate) Then
DY = DateDiff("YYYY", Bdate, Date)
TD = DateSerial(FY, Month(Date), Day(Date))
If Day(TD) >= Day(Bdate) Then
BBD = DateSerial(FY, FM, Day(Date))
DM = DateDiff("M", BBD, TD)
TD_D = DateSerial(FY, FM, Day(Date))
DD = DateDiff("D", TD_D, Bdate)
Else
BBND = DateSerial(FY, FM, Day(Date))
DM = DateDiff("M", BBND, TD)
Select Case FM
Case "1", " 3", "5", "7", "8", "10", "12"
DayFM = 31
Case "4", "6", "9", "11"
DayFM = 30
Case "2"
Fyear = DateSerial(2020, Month(Bdate), Day(Bdate))
DF_Y = DateDiff("YYYY", Bdate, Fyear)
DF_Y = (DF_Y Mod 4)
If DF_Y = 0 Then
DayFM = 29
DD = (DayFM - FD) + Day(Date)
Else
DayFM = 28
End If
End Select
DD = (DayFM - FD) + Day(Date)
DM = DM - 1
End If
Else
Ddate = DateSerial(FY + 1, Month(Date), Day(Date))
DY = DateDiff("YYYY", Ddate, Date)
If Day(Ddate) > Day(Bdate) Then
TDD = DateSerial(FY, FM, Day(Date))
DM = DateDiff("M", Ddate, Bdate)
DD = DateDiff("D", TDD, Bdate)
Else
BBND = DateSerial(FY, FM + 1, Day(Date))
DM = DateDiff("M", Ddate, BBND)
Select Case FM
Case "1", " 3", "5", "7", "8", "10", "12"
DayFM = 31
Case "4", "6", "9", "11"
DayFM = 30
Case "2"
Fyear = DateSerial(2020, Month(Bdate), Day(Bdate))
DF_Y = DateDiff("YYYY", Bdate, Fyear)
DF_Y = (DF_Y Mod 4)
If DF_Y = 0 Then
DayFM = 29
Else
DayFM = 28
End If
End Select
DD = (DayFM - FD) + Day(Date)
End If
End If
Cells(IcolS, "F").Value = CStr(Abs(DY)) & "-" & CStr(Abs(DM)) & "-" & CStr(Abs(DD))
Cells(IcolS, "G").Value = CStr(Abs(DY))
Next i
End Sub
[/code]
จาก Code ข้างต้นมีวิธีการทำงานคร่าวๆ คือ เมื่อกรอกวันที่เริ่มทำงานใน form โดยจะแบ่งเป็น 3 textbox คือ วัน / เดือน / ปี ตามลำดับ
แล้วจากนั้นจะทำการรันออกมาเป็นอายุงาน ซึ่งเป็น textbox เดียว และนำไปใส่ยังตารางในไฟล์ที่แนบให้
[attachment=0]Data (Myanmar).xlsm[/attachment]
[color=#FF0000] [u][b]คำถาม[/b][/u] [/color] ถ้าผมต้องการสร้างปุ่มอัพเดต แล้วเมื่อกดปุ่มอัพเดต จะให้ทำการอัพเดตอายุงานของพนักงานทั้งหมดให้เป็นปัจจุบันทันที (เนื่องจาก Code ด้านบนไม่มีคำสั่งให้อัพเดตอายุงานให้เป็นปัจจุบันเอง) แต่ปัญหาคือ ค่าของตัวแปร FD FM FY ที่มาจาก Textbox 3 Box นั้น มันคือการนำเข้าของค่าที่อยู่ในเซลล์เดียวกันใน Column E ซึ่งเป็น Type วันที่ เช่น 12/6/2562
[color=#FF8000][b]ดังนั้นสิ่งที่ผมต้องการ[/b][/color] คือ Code เพื่อหาตำแหน่งตัวเลขของเซลล์นั้นๆ เพื่อนำเข้าไปใส่ในตัวแปร FD FM FY เช่น ถ้าค่าของวันที่ในเซลล์นั้นเป็น 12/6/2562 ก็ให้ FD = 12 , FM = 6 , FY = 2562 เป็นต้น
ตัวอย่าง Code ตามที่ผมได้ศึกษาแล้วลองเขียนมาครับ (แต่ก็ยังไม่ได้)
[code]
Set ws = ActiveSheet
last_row = ws.Cells(Rows.Count, 1).End(xlUp).Row
For i = 3 To last_row
IcolS = Cells(Rows.Count, "A").End(xlUp).Row
FY = ws.Cells(i, E).Characters(1, 2).Value
FM = ws.Cells(i, E).Characters(4, 2).Value
FD = ws.Cells(i, E).Characters(7, 4).Value
[/code]
[quote]ถ้าหากมีข้อผิดพลาดประการใดก็ขออภัยและขอคำแนะนำจากผู้รู้ทุกท่านด้วยครับ ขอบคุณอาจารย์และผู้รู้ทุกท่าน[/quote]