Giúp học viết một Function

Liên hệ QC

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,187
Được thích
105
Chào anh chị!

Giả sử em có đoạn code sau:
PHP:
                        Select Case Ca
                            'Tu 8h den 20h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "N"
                            If Vao > T6 Then
                                If Vao <= T8 Then
                                    If Ra < T21 Then
                                        If Ra >= T20 Then
                                            Arr(j, 10) = T8
                                            Arr(j, 11) = T20
                                        End If
                                    End If
                                End If
                            End If
                            'Tu 20h den 8h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "D"
                            If Vao > T18 Then
                                If Vao <= T20 Then
                                    If Ra < T33 Then
                                        If Ra >= T32 Then
                                            Arr(j, 10) = T20
                                            Arr(j, 11) = T32
                                        End If
                                    End If
                                End If
                            End If
                        Case "H"
                            If Vao > T6 Then
                                If Vao <= T8 Then
                                    If Ra < T18 Then
                                        If Ra >= T17 Then
                                            Arr(j, 10) = T8
                                            Arr(j, 11) = T17
                                        End If
                                    End If
                                End If
                            End If
                            'Tu 6h den 14h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "X"
                            If Vao <= T6 Then
                                If Ra < T15 Then
                                    If Ra >= T14 Then
                                        Arr(j, 10) = T6
                                        Arr(j, 11) = T14
                                    End If
                                End If
                            End If
                            
                            'Tu 14 den 22h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "Y"
                            If Vao > T10 Then
                                If Vao <= T14 Then
                                    If Ra < T23 Then
                                        If Ra >= T22 Then
                                            Arr(j, 10) = T14
                                            Arr(j, 11) = T22
                                        End If
                                    End If
                                End If
                            End If
                            
                            'Tu 22h den 6h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "Z"
                            If Vao > T20 Then
                                If Vao <= T22 Then
                                    If Ra < T31 Then
                                        If Ra >= T30 Then
                                            Arr(j, 10) = T22
                                            Arr(j, 11) = T30
                                        End If
                                    End If
                                End If
                            End If
                        End Select
Với Ca dạng Text, Vao-Ra dạng Thời gian có dữ liệu ngày giờ phút giây, Txx là số giờ (Ví dụ T30 là 30h, T8 là 8h) là tham số truyền vào. Arr(j, 10) và Arr(j, 11) là kết quả em cần lấy

Vậy làm thế nào để chuyển dòng code này thành dạng Function riêng? Và nếu tạo Function riêng thì tốc độ xử lý có nhanh hơn so với ban đầu không?
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Chào anh chị!

Giả sử em có đoạn code sau:
PHP:
                        Select Case Ca
                            'Tu 8h den 20h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "N"
                            If Vao > T6 Then
                                If Vao <= T8 Then
                                    If Ra < T21 Then
                                        If Ra >= T20 Then
                                            Arr(j, 10) = T8
                                            Arr(j, 11) = T20
                                        End If
                                    End If
                                End If
                            End If
                            'Tu 20h den 8h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "D"
                            If Vao > T18 Then
                                If Vao <= T20 Then
                                    If Ra < T33 Then
                                        If Ra >= T32 Then
                                            Arr(j, 10) = T20
                                            Arr(j, 11) = T32
                                        End If
                                    End If
                                End If
                            End If
                        Case "H"
                            If Vao > T6 Then
                                If Vao <= T8 Then
                                    If Ra < T18 Then
                                        If Ra >= T17 Then
                                            Arr(j, 10) = T8
                                            Arr(j, 11) = T17
                                        End If
                                    End If
                                End If
                            End If
                            'Tu 6h den 14h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "X"
                            If Vao <= T6 Then
                                If Ra < T15 Then
                                    If Ra >= T14 Then
                                        Arr(j, 10) = T6
                                        Arr(j, 11) = T14
                                    End If
                                End If
                            End If
                           
                            'Tu 14 den 22h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "Y"
                            If Vao > T10 Then
                                If Vao <= T14 Then
                                    If Ra < T23 Then
                                        If Ra >= T22 Then
                                            Arr(j, 10) = T14
                                            Arr(j, 11) = T22
                                        End If
                                    End If
                                End If
                            End If
                           
                            'Tu 22h den 6h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "Z"
                            If Vao > T20 Then
                                If Vao <= T22 Then
                                    If Ra < T31 Then
                                        If Ra >= T30 Then
                                            Arr(j, 10) = T22
                                            Arr(j, 11) = T30
                                        End If
                                    End If
                                End If
                            End If
                        End Select
Với Ca dạng Text, Vao-Ra dạng Thời gian có dữ liệu ngày giờ phút giây, Txx là số giờ (Ví dụ T30 là 30h, T8 là 8h) là tham số truyền vào. Arr(j, 10) và Arr(j, 11) là kết quả em cần lấy

Vậy làm thế nào để chuyển dòng code này thành dạng Function riêng? Và nếu tạo Function riêng thì tốc độ xử lý có nhanh hơn so với ban đầu không?
Em cảm ơn!
Bài trên của bạn muốn viết Function thì với 5 điều kiện nhé.Ví dụ
Function kiemtra( byaval dk1 as string ...)
Còn về vấn đề tốc độ sử lý thì mình nghĩ code nó sẽ nhanh hơn. Code nó sẽ sử lý nhanh hơn.
 
Upvote 0
Bạn tham khảo cách này xem:
PHP:
Function VaoRa(Ca As String, Vao As Double, Ra As Double, Optional GioVao As Boolean = True)
Const T06 As Double = #6:00:00 AM#:                     Const T08 As Double = #8:00:00 AM#
Const T21 As Double = #9:00:00 PM#:                      Const T20 As Double = #8:00:00 PM#
Const T14 As Double = #2:00:00 PM#:                      Const T15 As Double = #3:00:00 PM#
Const T22 As Double = #10:00:00 PM#:                      Const T31 As Double = #12:00:00 PM#
Const T17 As Double = #5:00:00 PM#:                      Const T32 As Double = #11:00:00 PM#   '?? '
Const T18 As Double = #6:00:00 PM#:                       Const T33 As Double = #10:00:00 PM#  '?? '
' . . . . . . .         '
Select Case Ca
Case "N"
    If Vao > T6 And Vao <= T8 Then
        If Ra < T21 And Ra >= T20 Then
            If GioVao Then
                VaoRa = T8
            Else
                VaoRa = T20
            End If
        End If
    End If
Case Else
    ' . . . . .         '
End Select
End Function
 
Upvote 0
VBA là loại ngôn ngữ cũ. Nó có sự phân biệt giữa Sub và Function.

Ngừoi ta viết Function (hàm) khi cần nó trả về một cái gì đó. Trong ví dụ của bạn thì bạn cần nó trả về cái gì?

Cách học của bạn loạn xạ quá rồi. Bạn cần tìm tài liệu VBA mà đi trở lại từ căn bản.
 
Upvote 0
Giả sử em có đoạn code sau:
PHP:
                        Select Case Ca
                            'Tu 8h den 20h +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>
                        Case "N"
                            If Vao > T6 Then
                                If Vao <= T8 Then
                                    If Ra < T21 Then
                                        If Ra >= T20 Then
                                            Arr(j, 10) = T8
                                            Arr(j, 11) = T20
                                        End If
                                    End If
                                End If
                            End If
...
Với Ca dạng Text, Vao-Ra dạng Thời gian có dữ liệu ngày giờ phút giây, Txx là số giờ (Ví dụ T30 là 30h, T8 là 8h) là tham số truyền vào. Arr(j, 10) và Arr(j, 11) là kết quả em cần lấy

Thấy cái đề tài này hay hay nên tôi cũng muốn tham khảo thêm vụ chấm công này của bạn.
Tôi dịch ra như thế này, không biết tôi có hiểu đúng ý của code này của bạn không nhé. Lấy ví dụ ca "N" thôi.
Nếu giờ bấm Vào nằm trong khoảng 6 - 8h sáng và Ra trong khoảng 21h đổ lại thì sẽ lấy tham số của ca 8 - 20?
Vậy:
- Còn Select case "N" để làm gì vì đã xác định nhân viên đó thuộc ca "N" là ca 8 -20h?
- Nếu nhân viên bấm Vào 8h 5', 8h 10'...thì tính vô trường hợp nào?
Không trong lĩnh vực của bạn nên chưa hiểu lắm :)
 
Upvote 0
Thấy cái đề tài này hay hay nên tôi cũng muốn tham khảo thêm vụ chấm công này của bạn.
Ông chủ thớt có vụ chấm công kéo dài từ 3-4 năm trước đây tới bài này đó anh.
Ổng thấy VBA hay hay... mà hay thật nên nhảy vào. Kêu ổng đọc lý thuyết, đưa tài liệu sẵn đủ kiểu.. nhưng ổng không chịu đọc, mà chỉ thích có kết quả ngay thôi. @@
----
Ai muốn ra tay... thì phải quay về quá khứ và bắt đầu từ mấy năm trước ấy.
 
Upvote 0
Hehe.. :) . Tại cái vấn đề chấm công này nó điên đầu lắm, mỗi Cty mỗi vẽ nên cũng muốn tìm hiểu thêm loại hình ca làm việc hơn 12 tiếng này.
Mình chỉ làm cái bảng ca cho nhân viên nhà hàng nhỏ xíu thôi mà cũng rối rồi, phải cung cấp cả đống tham số mới tính được và cũng chưa làm tự động hoàn toàn mà vẫn phải xử lý thủ công (nhập tay) một số công đoạn điều chỉnh giờ công một số trường hợp ngoại lệ, đặc thù, máy chấm sai, máy bị lỗi v.v.. cho từng nhân viên.

223807
 
Lần chỉnh sửa cuối:
Upvote 0
Mấy cái Cases làm việc đại khái như nhau. Đáng lẽ phải làm bằng mảng.

CaseN = VBA.Array(T6, T8, T20, T21)
CaseD = VBA.Array(T18, T20, T32, T33)
CaseH = ...
...
timeFrames = VBA.Array(CaseN, CaseD, CaseH, CaseX, CaseY, CaseZ)
...
caseIdx = InStr("NDHXYZ", Ca)
If caseIdx Then
caseIdx = caseIdx -1 ' adjust index to begin at 0
If Vao > timeFrames(caseIdx)(1) And Vao <= timeFrames(caseIdx)(2) _
And Ra >= timeFrames(caseIdx)(3) And Ra < timeFrames(caseIdx)(4) Then
Arr(j, 10) = timeFrames(caseIdx)(2)
Arr(j, 11) = timeFrames(caseIdx)(3)
End If
End If
 
Upvote 0
Các Bác đã giúp thì giúp bạn ấy cho trót cái đoạn "nhô ra một cách lạ kì"
Có vẻ như ví dụ không đồng bộ hoặc theo ý của bạn ấy là vậy.

----------------------------------------------
PHP:
If Vao <= T6 Then
    If Ra < T15 Then
        If Ra >= T14 Then
            Arr(j, 10) = T6
            Arr(j, 11) = T14
        End If
    End If
End If
-------------------
Mình "ăn trộm code" của các Bác ở trên chứ không biết nhiều về VBA. Chủ yếu đăng bài kiếm "Like, ..."
Giải quyết luôn cái trường hợp "Hài hước kia" bằng cách cho số 0 vào.
-------------------

PHP:
Private Sub test_ThoiGianGiaoCa()
  Dim Ca$, Vao#, Ra#
  Ca = "N": Vao = #5:59:00 AM#: Ra = #8:05:00 PM#
  Call ThoiGianGiaoCa(Ca, Vao, Ra)
  Debug.Print Vao, Ra
End Sub
Sub ThoiGianGiaoCa(ByVal Ca$, ByRef Vao#, ByRef Ra#)
  Dim T, Idx%
  Const T06 = #6:00:00 AM#:   Const T08 = #8:00:00 AM#
  Const T21 = #9:00:00 PM#:   Const T20 = #8:00:00 PM#
  Const T14 = #2:00:00 PM#:   Const T15 = #3:00:00 PM#
  Const T22 = #10:00:00 PM#:  Const T31 = #12:00:00 PM#
  Const T17 = #5:00:00 PM#:   Const T32 = #11:00:00 PM#
  Const T18 = #6:00:00 PM#:   Const T33 = #10:00:00 PM#
  T = Array(0, Array(T06, T08, T20, T21), _
            Array(T18, T20, T32, T33), _
            Array(T06, T08, T17, T18), _
            Array(0, T06, T14, T15), _
            Array(T10, T14, T22, T23), _
            Array(T20, T22, T30, T31))
  Idx = InStr("NDHXYZ", Ca)
  If Idx Then
    If Vao > T(Idx)(0) And Vao <= T(Idx)(1) _
    And Ra >= T(Idx)(2) And Ra < T(Idx)(3) Then
      Vao = T(Idx)(1): Ra = T(Idx)(2): Goto Ends
    End If
  End If
  Vao = 0 : Ra = 0
Ends: Erase T
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn viết để xài được thì cần biết/thấy qui chế chấm công của CQ chủ bài đăng;
Còn trong quá trình học viết hàm thì chỉ nên gợi ý thôi & nên viết 1 cách đơn giản sao cho dễ hiểu với người chập chững!
 
Upvote 0
VBA là loại ngôn ngữ cũ. Nó có sự phân biệt giữa Sub và Function.

Ngừoi ta viết Function (hàm) khi cần nó trả về một cái gì đó. Trong ví dụ của bạn thì bạn cần nó trả về cái gì?

Cách học của bạn loạn xạ quá rồi. Bạn cần tìm tài liệu VBA mà đi trở lại từ căn bản.
Vâng, anh nói đúng. Em ngẫu hứng nghĩ cái gì thì tìm hiểu cái đó chứ không học bài bản. Trong ví dụ của em mảng Arr(i,10) và Arr(i,11) là kết quả em cần lấy. Vì là dạng trả kết quả mảng nên em không biết cách làm. Nếu viết theo cách trả về kết quả từng mảng 1 thì vòng lặp và điều kiện xét của em x2 lần không cần thiết nên hỏi anh chị xem cách viết nào hợp lý nhất.
Bài đã được tự động gộp:

Thấy cái đề tài này hay hay nên tôi cũng muốn tham khảo thêm vụ chấm công này của bạn.
Tôi dịch ra như thế này, không biết tôi có hiểu đúng ý của code này của bạn không nhé. Lấy ví dụ ca "N" thôi.
Nếu giờ bấm Vào nằm trong khoảng 6 - 8h sáng và Ra trong khoảng 21h đổ lại thì sẽ lấy tham số của ca 8 - 20?
Vậy:
- Còn Select case "N" để làm gì vì đã xác định nhân viên đó thuộc ca "N" là ca 8 -20h?
- Nếu nhân viên bấm Vào 8h 5', 8h 10'...thì tính vô trường hợp nào?
Không trong lĩnh vực của bạn nên chưa hiểu lắm :)
Vâng anh các trường hợp không trong điều kiện trên thì buộc em phải chấm tay ở cột riêng. Trường hợp anh giả sử thì nó sẽ theo quy luật tiến lên 15p nghĩa là từ trên 1 đến 15 thì đều tính tròn 15. Ví dụ 8h5p -> 8h15'. 8h31' --> 8h45'
Bài đã được tự động gộp:

Ông chủ thớt có vụ chấm công kéo dài từ 3-4 năm trước đây tới bài này đó anh.
Ổng thấy VBA hay hay... mà hay thật nên nhảy vào. Kêu ổng đọc lý thuyết, đưa tài liệu sẵn đủ kiểu.. nhưng ổng không chịu đọc, mà chỉ thích có kết quả ngay thôi. @@
----
Ai muốn ra tay... thì phải quay về quá khứ và bắt đầu từ mấy năm trước ấy.
Thực ra code từ đó đến nay em vẫn dùng và thay đổi dần dần cho tốt hơn. Mỗi lần biết hơn một chút thì em thấy code có thể viết tốt hơn một chút. Và chủ đề này là một ví dụ như vậy. Đúng là em chỉ quan tâm kết quả, ví dụ động đến vấn đề nào đó thì em sẽ tìm trên mạng rồi lấy code đó tham khảo và chỉnh sửa theo đúng hoàn cảnh của mình.
Bài đã được tự động gộp:

Mấy cái Cases làm việc đại khái như nhau. Đáng lẽ phải làm bằng mảng.

CaseN = VBA.Array(T6, T8, T20, T21)
CaseD = VBA.Array(T18, T20, T32, T33)
CaseH = ...
...
timeFrames = VBA.Array(CaseN, CaseD, CaseH, CaseX, CaseY, CaseZ)
...
caseIdx = InStr("NDHXYZ", Ca)
If caseIdx Then
caseIdx = caseIdx -1 ' adjust index to begin at 0
If Vao > timeFrames(caseIdx)(1) And Vao <= timeFrames(caseIdx)(2) _
And Ra >= timeFrames(caseIdx)(3) And Ra < timeFrames(caseIdx)(4) Then
Arr(j, 10) = timeFrames(caseIdx)(2)
Arr(j, 11) = timeFrames(caseIdx)(3)
End If
End If
Để em xem có xoay sở được không nhé, cảm ơn anh!
 
Lần chỉnh sửa cuối:
Upvote 0
Các Bác đã giúp thì giúp bạn ấy cho trót cái đoạn "nhô ra một cách lạ kì"
Có vẻ như ví dụ không đồng bộ hoặc theo ý của bạn ấy là vậy.

----------------------------------------------
PHP:
If Vao <= T6 Then
    If Ra < T15 Then
        If Ra >= T14 Then
            Arr(j, 10) = T6
            Arr(j, 11) = T14
        End If
    End If
End If
-------------------
Mình "ăn trộm code" của các Bác ở trên chứ không biết nhiều về VBA. Chủ yếu đăng bài kiếm "Like, ..."
Giải quyết luôn cái trường hợp "Hài hước kia" bằng cách cho số 0 vào.
-------------------

PHP:
Private Sub test_ThoiGianGiaoCa()
  Dim Ca$, Vao#, Ra#
  Ca = "N": Vao = #5:59:00 AM#: Ra = #8:05:00 PM#
  Call ThoiGianGiaoCa(Ca, Vao, Ra)
  Debug.Print Vao, Ra
End Sub
Sub ThoiGianGiaoCa(ByVal Ca$, ByRef Vao#, ByRef Ra#)
  Dim T, Idx%
  Const T06 = #6:00:00 AM#:   Const T08 = #8:00:00 AM#
  Const T21 = #9:00:00 PM#:   Const T20 = #8:00:00 PM#
  Const T14 = #2:00:00 PM#:   Const T15 = #3:00:00 PM#
  Const T22 = #10:00:00 PM#:  Const T31 = #12:00:00 PM#
  Const T17 = #5:00:00 PM#:   Const T32 = #11:00:00 PM#
  Const T18 = #6:00:00 PM#:   Const T33 = #10:00:00 PM#
  T = Array(0, Array(T06, T08, T20, T21), _
            Array(T18, T20, T32, T33), _
            Array(T06, T08, T17, T18), _
            Array(0, T06, T14, T15), _
            Array(T10, T14, T22, T23), _
            Array(T20, T22, T30, T31))
  Idx = InStr("NDHXYZ", Ca)
  If Idx Then
    If Vao > T(Idx)(1) And Vao <= T(Idx)(2) _
    And Ra >= T(Idx)(3) And Ra < T(Idx)(4) Then
      Vao = T(Idx)(2): Ra = T(Idx)(3): Goto Ends
    End If
  End If
  Vao = 0 : Ra = 0
Ends: Erase T
End Sub
Cái này anh làm theo hướng của anh VietMini :). Cảm ơn anh nhé!
 
Upvote 0
... Trong ví dụ của em mảng Arr(i,10) và Arr(i,11) là kết quả em cần lấy. Vì là dạng trả kết quả mảng nên em không biết cách làm. ...
Hàm chỉ trả về được một trị hoặc một đối tượng. Nhu cầu của bạn là cần chép vào 2 biến Arr(i,10) và Arr(i,11). Do đó bạn chỉ có thể nạp 2 biến ấy vào tham số dạng ByRef để Sub/Hàm sử lý. Trường hợp của bạn thì 2 biến ấy là phần tử của 1 mảng cho nên có thể nạp mảng và chỉ số. Trường hợp này cũng vì phải nạp nhiều tham "cố định" (mảng Arr, các trị T's) quá cho nên có thể dùng biến toàn cục để giảm thiểu số tham phải nạp. Tôi chỉ nói vậy cho các bạn muốn học thêm thôi chứ nếu trình độ của bạn như thế thì quản lý biến toàn cục hơi mệt.

Trường hợp bạn muốn tìm hiểu cách viết hàm trả về nhiều hơn 1 trị thì có các cách sau:
1. lập 1 Type hoặc Object chứa các trị ấy. Như vậy hàm chỉ cần trả về biến với Type trên hoặc đối tượng đã lập.
2. đơn giản hơn, cho hàm trả về một mảng. Mỗi phần tử của mảng là một trị cần trả về.
Bạn có thể tham khảo ví dụ tôi đã dùng hàm trả về 1 trị, hàm trả về 2 trị (mảng 2 phần tử), và Sub (không trả về gì cả) ở đây

 
Upvote 0
Hàm chỉ trả về được một trị hoặc một đối tượng. Nhu cầu của bạn là cần chép vào 2 biến Arr(i,10) và Arr(i,11). Do đó bạn chỉ có thể nạp 2 biến ấy vào tham số dạng ByRef để Sub/Hàm sử lý. Trường hợp của bạn thì 2 biến ấy là phần tử của 1 mảng cho nên có thể nạp mảng và chỉ số. Trường hợp này cũng vì phải nạp nhiều tham "cố định" (mảng Arr, các trị T's) quá cho nên có thể dùng biến toàn cục để giảm thiểu số tham phải nạp. Tôi chỉ nói vậy cho các bạn muốn học thêm thôi chứ nếu trình độ của bạn như thế thì quản lý biến toàn cục hơi mệt.

Trường hợp bạn muốn tìm hiểu cách viết hàm trả về nhiều hơn 1 trị thì có các cách sau:
1. lập 1 Type hoặc Object chứa các trị ấy. Như vậy hàm chỉ cần trả về biến với Type trên hoặc đối tượng đã lập.
2. đơn giản hơn, cho hàm trả về một mảng. Mỗi phần tử của mảng là một trị cần trả về.
Bạn có thể tham khảo ví dụ tôi đã dùng hàm trả về 1 trị, hàm trả về 2 trị (mảng 2 phần tử), và Sub (không trả về gì cả) ở đây

Vâng em cảm ơn anh! Em cũng đang sử dụng biến toàn cục rồi ạ.

Chỗ anh chỉ em ở trên em đã viết thành như này và đã chạy ngon lành rồi anh nhé. Em thích cách anh viết code, rõ ràng mạch lạc.

PHP:
        CaseN = VBA.Array(T6, T8, T20, T21)
        CaseD = VBA.Array(T18, T20, T32, T33)
        CaseH = VBA.Array(T6, T8, T17, T18)
        CaseX = VBA.Array(0, T6, T14, T15)
        CaseY = VBA.Array(T10, T14, T22, T23)
        CaseZ = VBA.Array(T20, T22, T30, T31)
    
        TimeFrames = VBA.Array(CaseN, CaseD, CaseH, CaseX, CaseY, CaseZ)

        caseIdx = InStr("NDHXYZ", Ca)
        If caseIdx Then
                   caseIdx = caseIdx - 1
         If Vao > TimeFrames(caseIdx)(0) And Vao <= TimeFrames(caseIdx)(1),_
         And Ra >= TimeFrames(caseIdx)(2) And Ra < TimeFrames(caseIdx)(3) Then
                   Arr(j, 10) = TimeFrames(caseIdx)(1)
                   Arr(j, 11) = TimeFrames(caseIdx)(2)
         End If
         End If

Nhân tiện anh nói về biến toàn cục cho em hỏi thêm ngoài luồng:
Em có nên để biến toàn cục như này không: Public Rws As Long, R As Long, I As Long, j As Long, k As Long, h As Long
Hiện em đang sử dụng, mỗi sub lại cần call một sub để reset các biến này về 0 anh ạ, hơi chuối.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhân tiện anh nói về biến toàn cục cho em hỏi thêm ngoài luồng:
Em có nên để biến toàn cục như này không: Public Rws As Long, R As Long, I As Long, j As Long, k As Long, h As Long
Hiện em đang sử dụng, mỗi sub lại cần call một sub để reset các biến này về 0 anh ạ, hơi chuối.
Vậy thì bạn dùng biến toàn cục chi cho cực thân :D
 
Upvote 0
Cảm ơn anh, người đặt nền móng đầu tiên cho em về VBA :)
Bạn tham khảo cách này xem:
PHP:
Function VaoRa(Ca As String, Vao As Double, Ra As Double, Optional GioVao As Boolean = True)
Const T06 As Double = #6:00:00 AM#:                     Const T08 As Double = #8:00:00 AM#
Const T21 As Double = #9:00:00 PM#:                      Const T20 As Double = #8:00:00 PM#
Const T14 As Double = #2:00:00 PM#:                      Const T15 As Double = #3:00:00 PM#
Const T22 As Double = #10:00:00 PM#:                      Const T31 As Double = #12:00:00 PM#
Const T17 As Double = #5:00:00 PM#:                      Const T32 As Double = #11:00:00 PM#   '?? '
Const T18 As Double = #6:00:00 PM#:                       Const T33 As Double = #10:00:00 PM#  '?? '
' . . . . . . .         '
Select Case Ca
Case "N"
    If Vao > T6 And Vao <= T8 Then
        If Ra < T21 And Ra >= T20 Then
            If GioVao Then
                VaoRa = T8
            Else
                VaoRa = T20
            End If
        End If
    End If
Case Else
    ' . . . . .         '
End Select
End Function
Bài đã được tự động gộp:

Vậy thì bạn dùng biến toàn cục chi cho cực thân :D
Vì file của em cũng nhiều sub, mỗi lần lại phải Dim, em ghét sự lặp lại không cần thiết này anh ạ.
 
Upvote 0
Upvote 0
Vì file của em cũng nhiều sub, mỗi lần lại phải Dim, em ghét sự lặp lại không cần thiết này anh ạ.
Bạn tiết kiệm công gõ, thì phải chi thêm bộ nhớ cho các tham biến toàn cục thôi.
Mình khuyên nên khai báo toàn cục chỉ khi tham biến đó có xài trong hầu hết các macro & cần lưu trong nơi nào đó để xài lại trị của nó ở lần chạy macro khác.
Tham biến để ghi nhận dòng dữ liệu trong ListBox,
. . . . .
Còn chỉ vì ghét sự lặp lại khái báo biến mà đưa nó thành toàn cục là hoàn toàn không nên.
 
Upvote 0
Mục đích chính của biến toàn cục là để các Sub/Function chia sẻ thông tin với nhau. Nếu không cần chia sẻ thì không cần dùng biến toàn cục.
 
Upvote 0
"Không cần thiết" chỉ là quan điểm cá nhân của bạn và quan điểm đó hoàn toàn sai lầm.
Vậy à anh, em cứ nghĩ là như thế quản lý các biến về một mối (@$%@
Bài đã được tự động gộp:

Vậy là em hiểu sai về biến toàn cục rồi :(
Mục đích chính của biến toàn cục là để các Sub/Function chia sẻ thông tin với nhau. Nếu không cần chia sẻ thì không cần dùng biến toàn cục.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom