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:
Câu lệnh này:
Mã:
Application.CutCopyMode = False
Mấy dòng trong câu hỏi trên là không tô màu (Fill).

Cảm ơn anh. Cho em hỏi bây giờ em muốn cứ mỗi làn chọn một 1 cell bất kỳ (từ N3:N33 ) tức là chỉ cần kích chuột 1 lần vào cell đó

là màu nó tự tô vào các ô tương ứng trong bảng mà không cần bấm vào nút tô nữa thì phải làm thế nào ạ
 
Upvote 0
Cảm ơn anh. Cho em hỏi bây giờ em muốn cứ mỗi làn chọn một 1 cell bất kỳ (từ N3:N33 ) tức là chỉ cần kích chuột 1 lần vào cell đó

là màu nó tự tô vào các ô tương ứng trong bảng mà không cần bấm vào nút tô nữa thì phải làm thế nào ạ

Cho code vào sự kiện Worksheet_SelectionChange. Tuy nhiên bạn dùng Copy rồi Paste Specials là rất dở
Xem bài 25:
http://www.giaiphapexcel.com/forum/...eo-điều-kiện-bằng-hàm-vba&p=674771#post674771
Hoặc sửa code của bạn thành:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim rngSource As Range, rngColor As Range, cel As Range
  If Not Intersect(Range("N2:N33"), Target) Is Nothing Then
    If Target.Count = 1 Then
      Set rngSource = Range("C4:K32")
      rngSource.Interior.Color = xlNone
      For Each cel In rngSource
        If cel.Value <> Empty Then
          If UCase(cel.Value) = UCase(Target.Value) Then
            cel.Interior.Color = Target.Interior.Color
          End If
        End If
      Next
    End If
  End If
End Sub
Đương nhiên code trên ta cho vào Sheet1 nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Cho code vào sự kiện Worksheet_SelectionChange. Tuy nhiên bạn dùng Copy rồi Paste Specials là rất dở
Xem bài 25:
http://www.giaiphapexcel.com/forum/...eo-điều-kiện-bằng-hàm-vba&p=674771#post674771

Cảm ơn chú Ndu ạ. Bài tập này đúng là ở topic trên con thấy hay hay nên lấy về làm thử. Tuy nhiên do mới tiếp xúc với VBA

nên là bài này con chỉ viết với những vốn kiến thức của mình mới học được như dùng For - Next và 1 số câu lệnh đơn giản như Copy _

Paste thôi nên không thể nào mà nói là đã hoàn chỉnh được. Xin chú nói thêm tại sao lại " rất dở " hả chú. Con có thấy điều gì bất thường đâu ạ. Hi hi :-=
Và khi nào ta viết Code cần đưa vào 1 sheet cụ thể, khi nào thì cần đưa vào 1 module ạ. Tại sao trong trường hợp này đưa code vào module thì

lại không được vậy chú .
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn chú Ndu ạ. Bài tập này đúng là ở topic trên con thấy hay hay nên lấy về làm thử. Tuy nhiên do mới tiếp xúc với VBA

nên là bài này con chỉ viết với những vốn kiến thức của mình mới học được như dùng For - Next và 1 số câu lệnh đơn giản như Copy _

Paste thôi nên không thể nào mà nói là đã hoàn chỉnh được. Xin chú nói thêm tại sao lại " rất dở " hả chú. Con có thấy điều gì bất thường đâu ạ. Hi hi :-=
Và khi nào ta viết Code cần đưa vào 1 sheet cụ thể, khi nào thì cần đưa vào 1 module ạ. Tại sao trong trường hợp này đưa code vào module thì

lại không được vậy chú .
Theo tôi hiểu, có thể bạn làm đúng yêu cầu bài toán, nhưng nếu chỉ cần tô màu, thì nên dùng phương thức Interior, chỉ lấy màu nền, còn lệnh Copy và PasteSpecial Format sẽ lấy nguyên định dạng của ô Copy, mà đã là định dạng thì nhiều vấn đề phức tạp trong đó (Font, Fill, Border, CF, Style, ...)
Còn code đưa vào sheet hay module thì tùy từng code, code sự kiện trên sheet thì đưa và sheet.
 
Upvote 0
E chào các AC, e có đoạn code sau, nhờ các AC giải thích giúp e dòng 6 ; 7 và 9 ạ. E cảm ơn nhiều !

1.Private Sub Worksheet_Change(ByVal Target As Range)
2. Dim fRng As Range, Clls As Range
3. On Error Resume Next
4. If Target.Row >= 5 And Target.Column = 1 Then
5. For Each Clls In Target
6. If Clls.Value = "" Then Clls.Offset(, -1).Resize(, 1) = "" And Clls.Offset(, 1).Resize(, 1) = ""
7. Set fRng = S1.Range(S1.[A1], S1.[A1000].End(3)).Resize(, 1).Find(Clls.Value, , xlValues, xlWhole)
8. If Not fRng Is Nothing Then
9. Clls.Offset(, -1).Resize(, 1) = fRng.Offset(, 1).Resize(, 1).Value
10. Clls.Offset(, 1).Resize(, 1) = fRng.Offset(, 2).Resize(, 1).Value
11. End If
12. Next
13. End If
End Sub
 
Upvote 0
E chào các AC, e có đoạn code sau, nhờ các AC giải thích giúp e dòng 6 ; 7 và 9 ạ. E cảm ơn nhiều !

1.Private Sub Worksheet_Change(ByVal Target As Range)
2. Dim fRng As Range, Clls As Range
3. On Error Resume Next
4. If Target.Row >= 5 And Target.Column = 1 Then
5. For Each Clls In Target
6. If Clls.Value = "" Then Clls.Offset(, -1).Resize(, 1) = "" And Clls.Offset(, 1).Resize(, 1) = ""
7. Set fRng = S1.Range(S1.[A1], S1.[A1000].End(3)).Resize(, 1).Find(Clls.Value, , xlValues, xlWhole)
8. If Not fRng Is Nothing Then
9. Clls.Offset(, -1).Resize(, 1) = fRng.Offset(, 1).Resize(, 1).Value
10. Clls.Offset(, 1).Resize(, 1) = fRng.Offset(, 2).Resize(, 1).Value
11. End If
12. Next
13. End If
End Sub
Không cần giải thích đâu bởi code này.. trật lất và sẽ không bao giờ chạy đúng (dù không báo lỗi vì có On Error Resume Next)
 
Upvote 0
Không cần giải thích đâu bởi code này.. trật lất và sẽ không bao giờ chạy đúng (dù không báo lỗi vì có On Error Resume Next)
Phiên bản 2025 sẽ có thêm cột âm (-) đứng trước cột A, khi đó code này có ứng dụng được không thầy?
 
Upvote 0
Không cần giải thích đâu bởi code này.. trật lất và sẽ không bao giờ chạy đúng (dù không báo lỗi vì có On Error Resume Next)
Dạ đây thầy ơi. E thấy no hoạt động mà. E chỉ chưa hiểu đoạn code tại dòng 6;7;9 nên mới nhờ các AC giúp ạ
 

File đính kèm

  • HOC VBA.xlsm
    21.1 KB · Đọc: 18
Upvote 0
Dạ đây thầy ơi. E thấy no hoạt động mà. E chỉ chưa hiểu đoạn code tại dòng 6;7;9 nên mới nhờ các AC giúp ạ

Bạn bỏ dòng On Error Resume Next rồi test lại xem có hoạt động không?
Tôi cho rằng code trên phải sửa thế này mới đúng:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim fRng As Range, Clls As Range
  'On Error Resume Next
  If Target.Row [COLOR=#ff0000]>[/COLOR] 5 And Target.Column = [COLOR=#ff0000]3[/COLOR] Then
    For Each Clls In Target
      [COLOR=#ff0000]If Clls.Value = "" Then
        Clls.Offset(, -1).Resize(, 1) = ""
        Clls.Offset(, 1).Resize(, 1) = ""
      End If[/COLOR]
      Set fRng = S1.Range(S1.[A1], S1.[A1000].End(3)).Find(Clls.Value, , xlValues, xlWhole)
      If Not fRng Is Nothing Then
        Clls.Offset(, -1) = fRng.Offset(, 1).Resize(, 1).Value
        Clls.Offset(, 1) = fRng.Offset(, 2).Resize(, 1).Value
      End If
    Next
  End If
End Sub
Màu đỏ là những chỗ sửa lại
 
Upvote 0
Chắc bạn táy máy sửa cái gì rồi. Nếu cấu trúc dữ liệu là như vậy thì code có lẽ phải như vầy:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim fRng As Range, Clls As Range
  On Error Resume Next
 'If Target.Row >= 5 And Target.Column = [B][COLOR=#ff0000]1[/COLOR][/B] Then
  If Target.Row >= 5 And Target.Column = [B][COLOR=#0000ff]3[/COLOR][/B] Then
    For Each Clls In Target
     'If Clls.Value = "" Then Clls.Offset(, -1).Resize(, 1) = "" [B][COLOR=#ff0000]And[/COLOR] [/B]Clls.Offset(, 1).Resize(, 1) = ""
      If Clls.Value = "" Then Clls.Offset(, -1).Resize(, 1) = ""[B][COLOR=#0000cd]:[/COLOR][/B] Clls.Offset(, 1).Resize(, 1) = ""
      Set fRng = S1.Range(S1.[A1], S1.[A1000].End(3)).Resize(, 1).Find(Clls.Value, , xlValues, xlWhole)
      If Not fRng Is Nothing Then
        Clls.Offset(, -1).Resize(, 1) = fRng.Offset(, 1).Resize(, 1).Value
        Clls.Offset(, 1).Resize(, 1) = fRng.Offset(, 2).Resize(, 1).Value
      End If
    Next
  End If
End Sub
 
Upvote 0
Dạ đây k phải file của e, e kiếm trên mạng để học hỏi thui ạ. E hiểu cấu trúc file này rùi. Cảm ơn các thầy và ac...

P/s: Khi e muốn xoá 1 Cell. e hay dùng cách này:
i.value = "" Then
i.Offset(, 1).Select
Selection.ClearContents
i.Offset(, 2).Select
Selection.ClearContents

Vậy cách này với cách dùng Resize như ở trên nó khác nhau nhiều ko vậy ạ
 
Upvote 0
Dạ đây k phải file của e, e kiếm trên mạng để học hỏi thui ạ. E hiểu cấu trúc file này rùi. Cảm ơn các thầy và ac...

P/s: Khi e muốn xoá 1 Cell. e hay dùng cách này:
i.value = "" Then
i.Offset(, 1).Select
Selection.ClearContents
i.Offset(, 2).Select
Selection.ClearContents

Vậy cách này với cách dùng Resize như ở trên nó khác nhau nhiều ko vậy ạ

Bạn nên đọc lý thuyết về thuộc tính Offset & Resize tí đi. Thực hành nó trong vài code là hiểu ra nguyên lý hoạt động của nó liền.
Trong Excel thì hàm Offset có cả 2 tính năng vừa dịch chuyển vừa mở rộng vùng
Còn trong VBA thì kết Offset là dịch chuyển . Còn Resize là mở rộng vùng.
Cứ đọc và hiểu nôm na như thế, thực hành vài lần....là hiểu và nhớ nguyên tắc hoạt động của nó.
Chúc thành công!
 
Upvote 0
Dạ đây k phải file của e, e kiếm trên mạng để học hỏi thui ạ. E hiểu cấu trúc file này rùi. Cảm ơn các thầy và ac...

P/s: Khi e muốn xoá 1 Cell. e hay dùng cách này:
i.value = "" Then
i.Offset(, 1).Select
Selection.ClearContents
i.Offset(, 2).Select
Selection.ClearContents

Vậy cách này với cách dùng Resize như ở trên nó khác nhau nhiều ko vậy ạ

Theo code trong file của bạn thì Resize là thừa
Còn code bài này thì Select và Selection là thừa, đồng thời nó sẽ khiến màn hình giật giật. Chỉ cần vầy
Mã:
If i.value = "" Then
i.Offset(, 1).ClearContents
i.Offset(, 2).ClearContents
Hoặc:
Mã:
If i.value = "" Then
i.Offset(, 1).Resize(,2).ClearContents
 
Upvote 0
Còn bài nữa ở đâu rồi ta?
 
Upvote 0
Nhờ mọi người xem giúp em File này với, tại sao khi em gõ A,B, .. vào ô B4 bên Sheet CT rồi ấn Enter tại sao không hiện lên kết quả tại cột C và D ạ.

Em xin cảm ơn !
 

File đính kèm

  • vlookup.xls
    35 KB · Đọc: 10
Upvote 0
Nhờ mọi người xem giúp em File này với, tại sao khi em gõ A,B, .. vào ô B4 bên Sheet CT rồi ấn Enter tại sao không hiện lên kết quả tại cột C và D ạ.

Em xin cảm ơn !

Hãy xem lại bạn đang with cái gì. (selection).......Sao enter nó nhảy được.....__--____--____--__
 
Upvote 0
Nhờ mọi người xem giúp em File này với, tại sao khi em gõ A,B, .. vào ô B4 bên Sheet CT rồi ấn Enter tại sao không hiện lên kết quả tại cột C và D ạ.

Em xin cảm ơn !
Bạn dùng sự kiện Worksheet_SelectionChange, thì gõ A, B xong rồi nhấp vào ô chứa A, B nó mới chạy code, bạn muốn gõ Enter nó chạy code thì đổi sang sự kiện Worksheet_Change và lồng vòng lặp vào trong sự kiện này.
 
Upvote 0
Web KT
Back
Top Bottom