Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Thử thay thành
"TONGHOP!R5C1"

Và sau đó thay tất cả ActiveSheet thành Sheets("TONGHOP")

xem nó đi đâu về đâu
1570007586242.png
Cám ơn anh đã phản hồi ạ. Nhưng sau khi thay xong nó vẫn báo lỗi ạ
Bài đã được tự động gộp:

Có 1 cách là bạn thêm dòng dưới đây vào Code của bạn:
PHP:
ActiveSheet.Range("A1").CurrentRegion.Copy Sheets("TONGHOP").Range("A1")
cảm ơn anh đã giúp ạ. ý anh à copy dữ liệu sang sheet TONG HOP ấy ạ
 
Upvote 0
Upvote 0
Em muốn duyệt qua các sheet có tên là aaa, rồi đến bbb
Thì đoạn code dưới thì đúng
Mã:
 For Each Sh In ThisWorkbook.Worksheets
        If Sh.Name = "aaa" Or Sh.Name = "bbb" Then
Bây giờ em muốn để nó trong Array
Mã:
For Each Sh In ThisWorkbook.Worksheets
      If Sh.Name = Array("aaa", "bbb") Then
thì nó báo lỗi Type mismath
Bây giờ em muốn để các Sheet trong Array được không? và code sửa như thế nào
p/s: em muốn làm như trên cho gọn vì em có rất nhiều sheet để duyệt
Em cảm ơn
 
Upvote 0
Em muốn duyệt qua các sheet có tên là aaa, rồi đến bbb
Thì đoạn code dưới thì đúng
Mã:
For Each Sh In ThisWorkbook.Worksheets
        If Sh.Name = "aaa" Or Sh.Name = "bbb" Then
Bây giờ em muốn để nó trong Array
Mã:
For Each Sh In ThisWorkbook.Worksheets
      If Sh.Name = Array("aaa", "bbb") Then
thì nó báo lỗi Type mismath
Bây giờ em muốn để các Sheet trong Array được không? và code sửa như thế nào
p/s: em muốn làm như trên cho gọn vì em có rất nhiều sheet để duyệt
Em cảm ơn
Bạn thử:
PHP:
 arr = Array("aaa", "bbb", "ccc", "...")
    For i = 1 To Sheets.Count
        '------------------------
    Next i

Hoặc:
PHP:
        For Each i In Array("aaa", "bbb", "ccc", "...")
            '----------------
        Next
 
Upvote 0
Kính chào các anh, chị;
Em mới tập tành VBA nên không biết xử lý vấn đề này sao. Các anh, chị biết xử lý giúp e nha. E nghiên cứu mãi mà không được. Các anh, chị chỉnh sửa dùm e nha. Cám ơn các anh, chị nhiều.

1570343070214.png
 

File đính kèm

  • NTP-NOTE.xlsm
    166 KB · Đọc: 12
Upvote 0
Bạn thử:
PHP:
arr = Array("aaa", "bbb", "ccc", "...")
    For i = 1 To Sheets.Count
        '------------------------
    Next i

Hoặc:
PHP:
        For Each i In Array("aaa", "bbb", "ccc", "...")
            '----------------
        Next
Câu trả lời của bạn chỉ giải quyết vấn đề bằng cách khác, chứ không trực tiếp theo chiều hướng người hỏi.

để các Sheet trong Array được không? và code sửa như thế nào
For Each Sh In Array(Sheets("aaa"), Sheets("bbb"), ...)
...
Next Sh
 
Upvote 0
Em mới tập tành VBA nên không biết xử lý vấn đề này sao. Các anh, chị biết xử lý giúp e nha. E nghiên cứu mãi mà không được. Các anh, chị chỉnh sửa dùm e nha.
PHP:
Private Sub UserForm_Activate()
Me.Caption = "KE HOACH CONG VIEC DEN NGAY " & Format(Now(), "dd/mm/yyyy")
Sheets("Weekend Plan").Select
Dim AsOFDate, AsOfWeek As String, MaxARRow, MaxARColumn, ListQuaHanRow, ListDenHanRow As Integer
AsOFDate = Format(Now(), "mm/DD/yyyy")      'AsOFDate = Format(Now(), "dd/mm/yyyy") '
AsOfWeek = Format(Now() + 7, "mm/DD/yyyy")  'AsOfWeek = Format(Now() + 7, "dd/mm/yyyy") '
MaxARRow = Range("MaxARRow")
MaxARColumn = Range("MaxARColumn")
ListQuaHanRow = 0:                              ListDenHanRow = 0
Me.ListQuaHan.Clear:                            Me.ListDenHan.Clear
'Loc Phát Sinh Quá Han  '
Me.MultiPage1.Value = 0
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "mm/DD/yyyy") < AsOFDate Then
        Me.ListQuaHan.AddItem (Cells(i, 1))
        Me.ListQuaHan.List(ListQuaHanRow, 1) = Cells(i, 2)
        Me.ListQuaHan.List(ListQuaHanRow, 2) = Cells(i, 3)
        Me.ListQuaHan.List(ListQuaHanRow, 3) = Format(Cells(i, 4), "#,###,###")
        Me.ListQuaHan.List(ListQuaHanRow, 4) = Cells(i, 5)
        Me.ListQuaHan.List(ListQuaHanRow, 5) = Cells(i, 6)
        ListQuaHanRow = ListQuaHanRow + 1
    End If
Next i
'Loc Phát Sinh Dén Han: '
Me.MultiPage1.Value = 1
For j = 2 To MaxARRow
    If Format(Cells(j, 5), "mm/DD/yyyy") >= AsOFDate And Format(Cells(j, 5), "mm/DD/yyyy") <= AsOfWeek Then '** '
        Me.ListDenHan.AddItem (Cells(j, 1))
        Me.ListDenHan.List(ListDenHanRow, 1) = Cells(j, 2)
        Me.ListDenHan.List(ListDenHanRow, 2) = Cells(j, 3)
        Me.ListDenHan.List(ListDenHanRow, 3) = Format(Cells(j, 4), "#,###,###")
        Me.ListDenHan.List(ListDenHanRow, 4) = Cells(j, 5)
        Me.ListDenHan.List(ListDenHanRow, 5) = Cells(j, 6)
        ListDenHanRow = ListDenHanRow + 1
    End If
Next j
End Sub
 
Upvote 0
Em mới tập tành VBA nên không biết xử lý vấn đề này sao. Các anh, chị biết xử lý giúp e nha. E nghiên cứu mãi mà không được. Các anh, chị chỉnh sửa dùm e nha. Cám ơn các anh, chị nhiều.
Sai vì trong UserForm_Activate bạn so sánh chuỗi mà chuỗi lại không chuẩn.
Lấy vd.
Mã:
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "dd/mm/yyyy") < AsOFDate Then
'    ...
    End If
Next i

Với i = 38 thì Cells(i, 5) là ngày 1 tháng 11 năm 2019. AsOFDate là 6 tháng 10 năm 2019 (ta chạy code ngày hôm nay)
Format(Cells(i, 5), "dd/mm/yyyy") = "01/11/2019"
AsOFDate = "06/10/2019".

Qui tắc so sánh chuỗi cùng chiều dài:
So sánh ký tự 1. Nếu không bằng nhau thì kết thúc và chuỗi có ký tự nhỏ hơn thì nhỏ hơn. Nếu bằng nhau thì so sánh ký tự 2. Tương tự nếu không bằng nhau thì kết thúc và chuỗi có ký tự nhỏ hơn thì nhỏ hơn. Nếu bằng nhau thì so sánh ký tự 3 v...v Nếu tất cả các ký tự bằng nhau thì 2 chuỗi bằng nhau.

Với qui tắc trên thì khi so sánh chuỗi "01/11/2019" và "06/10/2019" thì ở ký tự 2 ta có 1 < 6, vậy chuỗi "01/11/2019" < chuỗi "06/10/2019". Tức điều kiện cho IF thỏa và dòng 38 (STT = 37) được thêm vào ListBox. Tương tự với STT = 38-41, 67-71.

Cách khắc phục:
1. So sánh số.
Ngày tháng trong Excel là số nên so sánh số thôi. Tại sao phải biến thành chuỗi rồi so sánh chuỗi?
Mã:
Private Sub UserForm_Activate()
...
Dim AsOFDate As Long, AsOfWeek As Long, MaxARRow As Long, MaxARColumn As Long, ListQuaHanRow As Long, ListDenHanRow As Long
AsOFDate = Date
AsOfWeek = Date + 7
'    ...
For i = 2 To MaxARRow
    If Cells(i, 5) < AsOFDate Then
'    ...
    End If
Next i
...
For j = 2 To MaxARRow
    If Cells(j, 5) >= AsOFDate And Cells(j, 5) <= AsOfWeek Then
'    ...
    End If
Next j
End Sub

2. So sánh chuỗi (không khuyến cáo). Nếu thế thì dùng dạng "yyy/mm/dd". Dùng dạng này thì đúng.
Với vd. ở trên thì:
Format(Cells(i, 5), "dd/mm/yyyy") = "2019/11/01"
AsOFDate = "2019/10/06".
Và khi so sánh thì có "2019/11/01" > "2019/10/06" (so sánh kết thúc ở ký tự 7: 1 > 0)
Do vậy điều kiện không thỏa và dòng 38 (STT = 37) không được thêm vào ListBox
Mã:
Private Sub UserForm_Activate()
'    ...
Dim AsOFDate As String, AsOfWeek As String, MaxARRow As Long, MaxARColumn As Long, ListQuaHanRow As Long, ListDenHanRow As Long
AsOFDate = Format(Now(), "yyyy/mm/dd")
AsOfWeek = Format(Now() + 7, "yyyy/mm/dd")
'    ...
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "yyyy/mm/dd") < AsOFDate Then
'    ...
    End If
Next i
...

For j = 2 To MaxARRow
    If Format(Cells(j, 5), "yyyy/mm/dd") >= AsOFDate And Format(Cells(j, 5), "yyyy/mm/dd") <= AsOfWeek Then
'    ...
    End If
Next j
End Sub
 
Upvote 0
PHP:
Private Sub UserForm_Activate()
Me.Caption = "KE HOACH CONG VIEC DEN NGAY " & Format(Now(), "dd/mm/yyyy")
Sheets("Weekend Plan").Select
Dim AsOFDate, AsOfWeek As String, MaxARRow, MaxARColumn, ListQuaHanRow, ListDenHanRow As Integer
AsOFDate = Format(Now(), "mm/DD/yyyy")      'AsOFDate = Format(Now(), "dd/mm/yyyy") '
AsOfWeek = Format(Now() + 7, "mm/DD/yyyy")  'AsOfWeek = Format(Now() + 7, "dd/mm/yyyy") '
MaxARRow = Range("MaxARRow")
MaxARColumn = Range("MaxARColumn")
ListQuaHanRow = 0:                              ListDenHanRow = 0
Me.ListQuaHan.Clear:                            Me.ListDenHan.Clear
'Loc Phát Sinh Quá Han  '
Me.MultiPage1.Value = 0
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "mm/DD/yyyy") < AsOFDate Then
        Me.ListQuaHan.AddItem (Cells(i, 1))
        Me.ListQuaHan.List(ListQuaHanRow, 1) = Cells(i, 2)
        Me.ListQuaHan.List(ListQuaHanRow, 2) = Cells(i, 3)
        Me.ListQuaHan.List(ListQuaHanRow, 3) = Format(Cells(i, 4), "#,###,###")
        Me.ListQuaHan.List(ListQuaHanRow, 4) = Cells(i, 5)
        Me.ListQuaHan.List(ListQuaHanRow, 5) = Cells(i, 6)
        ListQuaHanRow = ListQuaHanRow + 1
    End If
Next i
'Loc Phát Sinh Dén Han: '
Me.MultiPage1.Value = 1
For j = 2 To MaxARRow
    If Format(Cells(j, 5), "mm/DD/yyyy") >= AsOFDate And Format(Cells(j, 5), "mm/DD/yyyy") <= AsOfWeek Then '** '
        Me.ListDenHan.AddItem (Cells(j, 1))
        Me.ListDenHan.List(ListDenHanRow, 1) = Cells(j, 2)
        Me.ListDenHan.List(ListDenHanRow, 2) = Cells(j, 3)
        Me.ListDenHan.List(ListDenHanRow, 3) = Format(Cells(j, 4), "#,###,###")
        Me.ListDenHan.List(ListDenHanRow, 4) = Cells(j, 5)
        Me.ListDenHan.List(ListDenHanRow, 5) = Cells(j, 6)
        ListDenHanRow = ListDenHanRow + 1
    End If
Next j
End Sub

Được rồi nè. e cám ơn anh nhiều nha.
Bài đã được tự động gộp:

Sai vì trong UserForm_Activate bạn so sánh chuỗi mà chuỗi lại không chuẩn.
Lấy vd.
Mã:
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "dd/mm/yyyy") < AsOFDate Then
'    ...
    End If
Next i

Với i = 38 thì Cells(i, 5) là ngày 1 tháng 11 năm 2019. AsOFDate là 6 tháng 10 năm 2019 (ta chạy code ngày hôm nay)
Format(Cells(i, 5), "dd/mm/yyyy") = "01/11/2019"
AsOFDate = "06/10/2019".

Qui tắc so sánh chuỗi cùng chiều dài:
So sánh ký tự 1. Nếu không bằng nhau thì kết thúc và chuỗi có ký tự nhỏ hơn thì nhỏ hơn. Nếu bằng nhau thì so sánh ký tự 2. Tương tự nếu không bằng nhau thì kết thúc và chuỗi có ký tự nhỏ hơn thì nhỏ hơn. Nếu bằng nhau thì so sánh ký tự 3 v...v Nếu tất cả các ký tự bằng nhau thì 2 chuỗi bằng nhau.

Với qui tắc trên thì khi so sánh chuỗi "01/11/2019" và "06/10/2019" thì ở ký tự 2 ta có 1 < 6, vậy chuỗi "01/11/2019" < chuỗi "06/10/2019". Tức điều kiện cho IF thỏa và dòng 38 (STT = 37) được thêm vào ListBox. Tương tự với STT = 38-41, 67-71.

Cách khắc phục:
1. So sánh số.
Ngày tháng trong Excel là số nên so sánh số thôi. Tại sao phải biến thành chuỗi rồi so sánh chuỗi?
Mã:
Private Sub UserForm_Activate()
...
Dim AsOFDate As Long, AsOfWeek As Long, MaxARRow As Long, MaxARColumn As Long, ListQuaHanRow As Long, ListDenHanRow As Long
AsOFDate = Date
AsOfWeek = Date + 7
'    ...
For i = 2 To MaxARRow
    If Cells(i, 5) < AsOFDate Then
'    ...
    End If
Next i
...
For j = 2 To MaxARRow
    If Cells(j, 5) >= AsOFDate And Cells(j, 5) <= AsOfWeek Then
'    ...
    End If
Next j
End Sub

2. So sánh chuỗi (không khuyến cáo). Nếu thế thì dùng dạng "yyy/mm/dd". Dùng dạng này thì đúng.
Với vd. ở trên thì:
Format(Cells(i, 5), "dd/mm/yyyy") = "2019/11/01"
AsOFDate = "2019/10/06".
Và khi so sánh thì có "2019/11/01" > "2019/10/06" (so sánh kết thúc ở ký tự 7: 1 > 0)
Do vậy điều kiện không thỏa và dòng 38 (STT = 37) không được thêm vào ListBox
Mã:
Private Sub UserForm_Activate()
'    ...
Dim AsOFDate As String, AsOfWeek As String, MaxARRow As Long, MaxARColumn As Long, ListQuaHanRow As Long, ListDenHanRow As Long
AsOFDate = Format(Now(), "yyyy/mm/dd")
AsOfWeek = Format(Now() + 7, "yyyy/mm/dd")
'    ...
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "yyyy/mm/dd") < AsOFDate Then
'    ...
    End If
Next i
...

For j = 2 To MaxARRow
    If Format(Cells(j, 5), "yyyy/mm/dd") >= AsOFDate And Format(Cells(j, 5), "yyyy/mm/dd") <= AsOfWeek Then
'    ...
    End If
Next j
End Sub
Cám ơn anh nhiều nha, e đã xử lý được rồi nè.
 
Upvote 0
PHP:
Private Sub UserForm_Activate()
Me.Caption = "KE HOACH CONG VIEC DEN NGAY " & Format(Now(), "dd/mm/yyyy")
Sheets("Weekend Plan").Select
Dim AsOFDate, AsOfWeek As String, MaxARRow, MaxARColumn, ListQuaHanRow, ListDenHanRow As Integer
AsOFDate = Format(Now(), "mm/DD/yyyy")      'AsOFDate = Format(Now(), "dd/mm/yyyy") '
AsOfWeek = Format(Now() + 7, "mm/DD/yyyy")  'AsOfWeek = Format(Now() + 7, "dd/mm/yyyy") '
MaxARRow = Range("MaxARRow")
MaxARColumn = Range("MaxARColumn")
ListQuaHanRow = 0:                              ListDenHanRow = 0
Me.ListQuaHan.Clear:                            Me.ListDenHan.Clear
'Loc Phát Sinh Quá Han  '
Me.MultiPage1.Value = 0
For i = 2 To MaxARRow
    If Format(Cells(i, 5), "mm/DD/yyyy") < AsOFDate Then
        Me.ListQuaHan.AddItem (Cells(i, 1))
        Me.ListQuaHan.List(ListQuaHanRow, 1) = Cells(i, 2)
        Me.ListQuaHan.List(ListQuaHanRow, 2) = Cells(i, 3)
        Me.ListQuaHan.List(ListQuaHanRow, 3) = Format(Cells(i, 4), "#,###,###")
        Me.ListQuaHan.List(ListQuaHanRow, 4) = Cells(i, 5)
        Me.ListQuaHan.List(ListQuaHanRow, 5) = Cells(i, 6)
        ListQuaHanRow = ListQuaHanRow + 1
    End If
Next i
'Loc Phát Sinh Dén Han: '
Me.MultiPage1.Value = 1
For j = 2 To MaxARRow
    If Format(Cells(j, 5), "mm/DD/yyyy") >= AsOFDate And Format(Cells(j, 5), "mm/DD/yyyy") <= AsOfWeek Then '** '
        Me.ListDenHan.AddItem (Cells(j, 1))
        Me.ListDenHan.List(ListDenHanRow, 1) = Cells(j, 2)
        Me.ListDenHan.List(ListDenHanRow, 2) = Cells(j, 3)
        Me.ListDenHan.List(ListDenHanRow, 3) = Format(Cells(j, 4), "#,###,###")
        Me.ListDenHan.List(ListDenHanRow, 4) = Cells(j, 5)
        Me.ListDenHan.List(ListDenHanRow, 5) = Cells(j, 6)
        ListDenHanRow = ListDenHanRow + 1
    End If
Next j
End Sub
Code chắc chắn sai.
Với code như thế thì AsOFDate = "10/06/2019"
Nếu vd. Cells(i, 5) = 6 tháng 1 năm 2020 thì Format(Cells(i, 5), "mm/DD/yyyy") = "01/06/2020
Lúc này thì
Format(Cells(i, 5), "mm/DD/yyyy") = "01/06/2020 < "10/06/2019" = AsOFDate

Tức dữ liệu cho Cells(i, 5) được thêm vào ListBox. Nhưng rõ ràng là ngày "6 tháng 1 năm 2020" là trong tương lai nên chưa hoàn thành vậy không thể thêm vào ListBox.

Nếu đã so sánh chuỗi thì phải tạo nó theo dạng "năm/tháng/ngày"
Bài đã được tự động gộp:

Được rồi nè. e cám ơn anh nhiều nha.
Chắc chắn chứ? Bạn thử thay E2 = "ngày 6 tháng 1 năm 2020" xem. Lúc đó dòng 2 được nhập vào ListBox trong khi ngày E2 là trong tương lai.
 
Upvote 0
Code chắc chắn sai.
Với code như thế thì AsOFDate = "10/06/2019"
Nếu vd. Cells(i, 5) = 6 tháng 1 năm 2020 thì Format(Cells(i, 5), "mm/DD/yyyy") = "01/06/2020
Lúc này thì
Format(Cells(i, 5), "mm/DD/yyyy") = "01/06/2020 < "10/06/2019" = AsOFDate

Tức dữ liệu cho Cells(i, 5) được thêm vào ListBox. Nhưng rõ ràng là ngày "6 tháng 1 năm 2020" là trong tương lai nên chưa hoàn thành vậy không thể thêm vào ListBox.

Nếu đã so sánh chuỗi thì phải tạo nó theo dạng "năm/tháng/ngày"
Bài đã được tự động gộp:


Chắc chắn chứ? Bạn thử thay E2 = "ngày 6 tháng 1 năm 2020" xem. Lúc đó dòng 2 được nhập vào ListBox trong khi ngày E2 là trong tương lai.
Vâng, được rồi a. Giờ chỉ vướng chỗ như comment trong hình nữa a (trong excel hiện còn 1 ngày, trong bảng hiện ra chỉ số 1), a có cách nào ko a.

1570355659861.png
 
Lần chỉnh sửa cuối:
Upvote 0
Có nghĩa là tôi sai? Tức bạn vẫn cho là code của bạn SA_DQ đúng?
Lúc trước là "Được rồi nè", bây giờ là "Vâng, được rồi a". Tức bạn vẫn cho là không có gì sai cả? Viết thì nên viết rõ, tránh để hiểu lầm.
Giờ chỉ vướng chỗ như comment trong hình nữa a, a có cách nào ko a.
Sai đúng đều như nhau cả thì mất công làm để mà làm gì.
 
Upvote 0
Có nghĩa là tôi sai? Tức bạn vẫn cho là code của bạn SA_DQ đúng?
Lúc trước là "Được rồi nè", bây giờ là "Vâng, được rồi a". Tức bạn vẫn cho là không có gì sai cả? Viết thì nên viết rõ, tránh để hiểu lầm.

Sai đúng đều như nhau cả thì mất công làm để mà làm gì.
Ý em là sau khi tiếp nhận và chỉnh sửa theo ý của a, code đã hoạt động theo đúng nội dung e muốn hiển thị. cám ơn a nhiều.
 
Upvote 0
Upvote 0
Tại sao khi mở file (file đã lưu vào thư mục) thì có file hỏi "Enable Macro", có file thì không hỏi?
Em đang sử dụng Win 7 và Office 2010
Em cũng đã vào Trust Center để kiểm tra nhưng không thấy sự khác biệt
Nhờ anh/chị giải thích. Em cảm ơn.
 
Upvote 0
Nhờ các a/c sửa giúp e đoạn code này với ạ. Vấn đề chính là khi e ấn nút SAVE thì nó chỉ lưu có câu lệnh đầu tiên.z1572670508164_06c4ba1810a931a9447c5907b2ca0994.pngz1572669801550_ff15dbd98890ea20cedd914f46ad216a.png
 

File đính kèm

  • San pham.xlsm
    53.2 KB · Đọc: 7
Upvote 0
Anh chị xem giúp nếu muốn thay cột A trong sheet nhập thành cột C thì chỉnh code như thế nào ạ
Em cảm ơn!
 

File đính kèm

  • data.xlsb
    33.9 KB · Đọc: 9
Upvote 0
Web KT
Back
Top Bottom