Cho em hỏi về "Select Case" trường hợp vùng dữ liệu không cố định

Liên hệ QC

nhnn1986

Thành viên hoạt động
Tham gia
30/10/17
Bài viết
108
Được thích
19
Giới tính
Nam
EM chào Anh/Chị ạ, em muốn hỏi về Code Select Case như sau:
Code của em hiện tại chạy được là:
Mã:
Function GetDayOff(ByVal sCurrentMonth As String, ByVal sReportCode As String) As Long
Dim LastDayOfMonth As Long
LastDayOfMonth = DateSerial(CLng(Left(sCurrentMonth, 4)), CLng(Right(sCurrentMonth, 2)) + 1, 0)
Select Case sReportCode
Case "A0014"
    GetDayOff = LastDayOfMonth + 7
Case "B0014", "B0024", "B0034"
    GetDayOff = LastDayOfMonth + 12
Case "A144", "C156", "D254"
    GetDayOff = LastDayOfMonth + 13
Case "G004", "G008", "G036"
    GetDayOff = LastDayOfMonth + 25
Case "G057", "G037", "G035", "G077"
    GetDayOff = LastDayOfMonth + 90
Case Else
    GetDayOff = LastDayOfMonth + 15
End Select
End Function

Thực tế các trường hợp như "A0014", "B"0014", "A144" v.v. vài tháng đổi ngày một lần nên sửa code lại hơi mất thời gian.
Ví dụ tháng 5: Case "A0014" ==> sang tháng 6 thành Case "A0014","G057"
Vậy em muốn hỏi là có thể thiết lập các giá trị mỗi "Case" bằng 1 biến đại diện được không ạ? nếu được thì xin giúp em với ạ?
- Tại Cột A em sẽ điền các giá trị như: A0014, B0014 v.v.
- Và tại Cột B em điền các giá trị tương ứng như: 7, 12 v.v
==> Khi có thay đổi em chỉ cần sửa giá trị cột B tương ứng, không phải vào sửa code.

Kết quả em muốn na ná thế này ạ:


Mã:
Set a = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"07")
Set b = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"12")
Set c = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"13")
Set d = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"25")
Set e = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"90")

Select Case sReportCode
Case a
    GetDayOff = LastDayOfMonth + 7
Case b
    GetDayOff = LastDayOfMonth + 12
Case c
    GetDayOff = LastDayOfMonth + 13
Case d
    GetDayOff = LastDayOfMonth + 25
Case e
    GetDayOff = LastDayOfMonth + 90
Case Else
    GetDayOff = LastDayOfMonth + 15
End Select
 
EM chào Anh/Chị ạ, em muốn hỏi về Code Select Case như sau:
Code của em hiện tại chạy được là:
Mã:
Function GetDayOff(ByVal sCurrentMonth As String, ByVal sReportCode As String) As Long
Dim LastDayOfMonth As Long
LastDayOfMonth = DateSerial(CLng(Left(sCurrentMonth, 4)), CLng(Right(sCurrentMonth, 2)) + 1, 0)
Select Case sReportCode
Case "A0014"
    GetDayOff = LastDayOfMonth + 7
Case "B0014", "B0024", "B0034"
    GetDayOff = LastDayOfMonth + 12
Case "A144", "C156", "D254"
    GetDayOff = LastDayOfMonth + 13
Case "G004", "G008", "G036"
    GetDayOff = LastDayOfMonth + 25
Case "G057", "G037", "G035", "G077"
    GetDayOff = LastDayOfMonth + 90
Case Else
    GetDayOff = LastDayOfMonth + 15
End Select
End Function

Thực tế các trường hợp như "A0014", "B"0014", "A144" v.v. vài tháng đổi ngày một lần nên sửa code lại hơi mất thời gian.
Ví dụ tháng 5: Case "A0014" ==> sang tháng 6 thành Case "A0014","G057"
Vậy em muốn hỏi là có thể thiết lập các giá trị mỗi "Case" bằng 1 biến đại diện được không ạ? nếu được thì xin giúp em với ạ?
- Tại Cột A em sẽ điền các giá trị như: A0014, B0014 v.v.
- Và tại Cột B em điền các giá trị tương ứng như: 7, 12 v.v
==> Khi có thay đổi em chỉ cần sửa giá trị cột B tương ứng, không phải vào sửa code.

Kết quả em muốn na ná thế này ạ:


Mã:
Set a = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"07")
Set b = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"12")
Set c = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"13")
Set d = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"25")
Set e = range("A2", Range("A" & Rows.Count).End(xlUp)).Find(range(B2", Range("A" & Rows.Count).End(xlUp),"90")

Select Case sReportCode
Case a
    GetDayOff = LastDayOfMonth + 7
Case b
    GetDayOff = LastDayOfMonth + 12
Case c
    GetDayOff = LastDayOfMonth + 13
Case d
    GetDayOff = LastDayOfMonth + 25
Case e
    GetDayOff = LastDayOfMonth + 90
Case Else
    GetDayOff = LastDayOfMonth + 15
End Select
Bạn thử thành thế này.
Mã:
Function GetDayOff(ByVal sCurrentMonth As String, ByVal so As Long) As Long
Dim LastDayOfMonth As Long
LastDayOfMonth = DateSerial(CLng(Left(sCurrentMonth, 4)), CLng(Right(sCurrentMonth, 2)) + 1, 0)
    GetDayOff = LastDayOfMonth + so
End Function
Mã:
=GetDayOff(H8,7)
 
Upvote 0
Trường hợp của bạn rõ ràng là có bảng tra.
Mà căn bản của bảng tra là VLookup (hoặc Match).
 
Upvote 0
Bạn thử thành thế này.
Mã:
Function GetDayOff(ByVal sCurrentMonth As String, ByVal so As Long) As Long
Dim LastDayOfMonth As Long
LastDayOfMonth = DateSerial(CLng(Left(sCurrentMonth, 4)), CLng(Right(sCurrentMonth, 2)) + 1, 0)
    GetDayOff = LastDayOfMonth + so
End Function
Mã:
=GetDayOff(H8,7)
GetDayOff(H8,7)
Chủ thớt đang nhờ tìm số "7" mờ
 
Upvote 0
Function GetDayOff(ByVal sCurrentMonth As String, ByVal sReportCode As String) As Long
GetDayOff = DateSerial(CLng(Left(sCurrentMonth, 4)), CLng(Right(sCurrentMonth, 2)) + 1, 0)
Dim rg As Range, pos As Variant
Set rg = Range("A2", Range("A" & Rows.Count).End(xlUp))
pos = Application.Match(sReportCode, rg, 0)
If IsNumeric(pos) Then GetDayOff = GetDayOff + rg.Cells(pos,2).Value
End Function

Thực ra code thì code vậy thôi chứ cái này dùng hàm thẳng trong bảng tính với name động hoặc table nó "chiến" hơn
 
Lần chỉnh sửa cuối:
Upvote 0
Function GetDayOff(ByVal sCurrentMonth As String, ByVal sReportCode As String) As Long
GetDayOff = DateSerial(CLng(Left(sCurrentMonth, 4)), CLng(Right(sCurrentMonth, 2)) + 1, 0)
Dim rg As Range, pos As Variant
Set rg = Range("A2", Range("A" & Rows.Count).End(xlUp))
pos = Application.Match(sReportCode, rg, 0)
If IsNumeric(pos) Then GetDayOff = GetDayOff + rg.Cells(pos,2).Value
End Function

Thực ra code thì code vậy thôi chứ cái này dùng hàm thẳng trong bảng tính với name động hoặc table nó "chiến" hơn
Còn thiếu 1 trường hợp
...
Case Else
GetDayOff = LastDayOfMonth + 15
...
 
Upvote 0
Dạ em cảm ơn Anh @HieuCD , @VetMini , @snow25 nhiều ạ

Do Function này để gán vào macro khác nên em buộc phải để ở trong code.
Dạ bài #8 gán tiếp vào bài #7 như thế nào vậy ạ, xin giúp em thêm chút xíu nữa. Chứ giờ em "chọc ngoáy" vào sự hư hết code ạ
 
Upvote 0
Mình có cái này bạn xem cho vui:
PHP:
Function DayOfMonth(sThang As String, Optional Nhuan As Boolean = False) As Integer
 Dim Thang As Integer
 
 Thang = CInt(sThang)
 DayOfMonth = 31
 On Error Resume Next
 DayOfMonth = Switch(Thang = 2, 28, Thang = 4, 30, Thang = 6, 30, Thang = 9, 30, Thang = 11, 30)
 If Nhuan And DayOfMonth = 28 Then DayOfMonth = 29
End Function
 
Upvote 0
Dạ em cảm ơn Anh @HieuCD , @VetMini , @snow25 nhiều ạ

Do Function này để gán vào macro khác nên em buộc phải để ở trong code.
Dạ bài #8 gán tiếp vào bài #7 như thế nào vậy ạ, xin giúp em thêm chút xíu nữa. Chứ giờ em "chọc ngoáy" vào sự hư hết code ạ
If ... End IF có rồi, chỉ thêm Else
If
...
Else
...
End if
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom