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:
Dễ và khó là từ ngữ có tính cách chủ quan. Như tôi đã đề cập, có nhiều cách để làm cho dễ nhìn. Cách hữu hiệu nhất là dùng dấu cách để đẩy code sâu vào. 2 hay 3, 4 vòng lặp đều được. Trong code của bạn có một đống with. Tại sao cần phân biệt được chỗ kết vòng lặp mà không phân biệt chỗ kết with?

Ui, Thầy ơi!
Cái này em chưa thấy ai phân biệt khác ngoài việc dùng phím Tab Thầy ah.
Nói thật là em chỉ nói nên suy nghĩ của em đã làm thôi ạ,chứ Thầy mà hỏi thì chắc dù có dành thời gian còn lại của cuộc đời này để học code thì em cũng không thể trả lời được câu hỏi của Thầy đâu ạ.**~**

Cảm ơn Thầy đã quan tâm ạ!
 
Upvote 0
Trả lời:

bạn có 2 vòng lặp for, thay vì bạn lòng chúng vào nhau:
for i1 = 1 to 10
...
for i2 = 1 to 5
... ' code của i2
next i2
... ' code của i1
next i1

Sau một hồi cắt dán, bạn lỡ chúng thành móc vào nhau:
for i1 = 1 to 10
...
for i2 = 1 to 5
... ' code của i2
next i1
... ' code đáng lẽ của i1, bây giờ thành i2
next i2

VBA sẽ la toáng lên là vòng lặp của bạn lỗi. Đó là nhờ nó thấy rõ tình trạng "móc" thay vì "lồng"

Nhưng nếu code của bạn chỉ dùng next trơn thì VBA không cách nào biết là bạn bị lầm, và có khả năng bạn bị kết quả sai.

Đối với End With thì hơi khác. With là lệnh ghép tiền tố. 99% các trường hợp, nếu bạn đừng lạm dụng nó thì sẽ thấy nó ghép nghiêm chỉnh.

Riêng IF/THEN/ELSE/END IF thì hơi khó chịu. Rất dễ bị lầm. Vì vậy nếu bạn để ý khi tôi dùng những block IF lớn, nhiều dòng, tôi có chú (comment) ở ELSE và END IF.
 
Upvote 0
Đếm số liệu

Em muốn có thông báo đếm số liệu từ cell dưới cùng đến cell A9 có bao nhiêu số liệu
em dùng code
Mã:
Sub Dem()
    With Sheets("TH")
        If [A65536].End(xlUp).Row <= 8 Then
            [COLOR=#ff0000][B]MsgBox [A65536].End(xlUp).Rows.Count[/B][/COLOR]
            MsgBox "Sheet TH Không có du lieu!"
            Exit Sub
        End If
    End With
End Sub
Trong đó dòng màu đỏ không hiển thị Msgbox (đúng là hiển thị là 3)
Nhờ anh chị hướng dẫn, em cảm ơn
 

File đính kèm

  • Dem.xls
    18 KB · Đọc: 7
Upvote 0
Em muốn có thông báo đếm số liệu từ cell dưới cùng đến cell A9 có bao nhiêu số liệu
em dùng code
Mã:
Sub Dem()
    With Sheets("TH")
        If [A65536].End(xlUp).Row <= 8 Then
            [COLOR=#ff0000][B]MsgBox [A65536].End(xlUp).Rows.Count[/B][/COLOR]
            MsgBox "Sheet TH Không có du lieu!"
            Exit Sub
        End If
    End With
End Sub
Trong đó dòng màu đỏ không hiển thị Msgbox (đúng là hiển thị là 3)
Nhờ anh chị hướng dẫn, em cảm ơn
Tôi hiểu ý bạn là như thế này phải không?
Mã:
Sub Dem()
Dim lr
lr = Range("A" & Rows.Count).End(3).Row
        If lr > 8 Then
            MsgBox lr - 8
          Else
            MsgBox "Sheet TH Không có du lieu!" 
            Exit Sub
        End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc bạn muốn vậy hả??
Mã:
Sub Dem()
With Sheets("TH")
    If [A65536].End(xlUp).Row <= 8 Then
        MsgBox "Sheet TH Không có du lieu!": Exit Sub
    Else
        MsgBox [A65536].End(xlUp).Row - 8
    End If
End With
End Sub
Dạ đúng theo ý muốn
Cho em hỏi thêm, nếu File trên của em, em tạo thêm 1 sheet mới và đứng tại sheet này ta chạy code Dem() thì kết quả thông báo là
" Sheet TH Không có du lieu!"
Em không hiểu tại sao nó ra thông báo như vậy ? vì cột A có dữ liệu mà
Em cảm ơn
 
Upvote 0
Dạ đúng theo ý muốn
Cho em hỏi thêm, nếu File trên của em, em tạo thêm 1 sheet mới và đứng tại sheet này ta chạy code Dem() thì kết quả thông báo là
" Sheet TH Không có du lieu!"
Em không hiểu tại sao nó ra thông báo như vậy ? vì cột A có dữ liệu mà
Em cảm ơn
Thử cái code #527 ấy. Xem có khác tí nào hông? Nếu không khác thì lại phải đưa file lên thôi.
 
Upvote 0
Đã thử rồi
Bây giờ tại Sheet1, ta chạy code thì thông báo " Sheet TH Không có du lieu!"
Mã:
Sub Dem()
With Sheets("TH")
    If[SIZE=6] [COLOR=#ff0000].[/COLOR][/SIZE][A65536].End(xlUp).Row <= 8 Then
        MsgBox "Sheet TH Không có du lieu!": Exit Sub
    Else
        MsgBox [SIZE=5][COLOR=#ff0000].[/COLOR][/SIZE][A65536].End(xlUp).Row - 8
    End If
End With
End Sub
Thêm 2 dấu chấm màu đỏ vô là được ngay.
 
Upvote 0
[NHỜ GIẢI THÍCH ĐOẠN BÔI ĐỎ TRONG CODE]

Em có tìm hiểu qua về RegExp tuy nhiên vẫn bị mắc chỗ này, nhờ mọi người giải thích giùm ạ
Mã:
Function TachHD(s As String)
With CreateObject("Vbscript.RegExp")
    .Global = True
    .Pattern = "\d{7}"
[COLOR=#ff0000][B]    TachHD = .Execute(s).Item(0)[/B][/COLOR]
End With
End Function

Em xin cảm ơn !
 

File đính kèm

  • hoi.xls
    35 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Món này khó nút. Chịu khó đến link sau mà đọc nhé chàng trai: http://www.giaiphapexcel.com/forum/showthread.php?76017-VBscript-Regexp

P/s: tôi cũng chưa tìm hiểu & chưa biết về RegExp (khi nào có nhu cầu thì tìm hiểu sâu) giờ cứ tềnh tềnh thôi...
Đọc mấy bài đó đau đầu quá.........tềnh tềnh thôi...--=0
Thêm Link nữa nè
http://www.giaiphapexcel.com/forum/...hử-nghiệm-VBScript-RegExp&p=430042#post430042
 
Upvote 0
[NHỜ GIẢI THÍCH ĐOẠN BÔI ĐỎ TRONG CODE]

Em có tìm hiểu qua về RegExp tuy nhiên vẫn bị mắc chỗ này, nhờ mọi người giải thích giùm ạ
Mã:
Function TachHD(s As String)
With CreateObject("Vbscript.RegExp")
    .Global = True
    .Pattern = "\d{7}"
[COLOR=#ff0000][B]    TachHD = .Execute(s).Item(0)[/B][/COLOR]
End With
End Function

Em xin cảm ơn !

Đoạn đỏ đỏ:
Hàm Execute của RegExp trả về một collection các đoạn chuỗi mà nó tìm được.
Thuộc tính Item của collection truy vấn phần tử. (0) là chỉ số của phần tử đầu tiên.

Chú thích:
Theo cách viết thì chỉ dùng được cho hàm người dùng. Đặt vào code khác để gọi hơi nguy hiểm, bởi vì nếu không có chuỗi con match nào thì Execute sẽ trống, truy vấn phần tử của nó sẽ bị lỗi.
 
Upvote 0
chào mọi người.
em có 1 đoạn code thế này
Mã:
Private Sub UserForm_Initialize()
'thuc hien truoc khi show form
    Dim WDow As Window
'thêm các workbook đang mở
    If Windows.Count <> 0 Then
        ReDim ArrListBox1(Windows.Count - 1)
        For Each WDow In Windows
            ArrListBox1(i) = WDow.Caption
            i = i + 1
        Next
'xóa listWook cũ
        ListWBook.Clear
        ListWBook.List = ArrListBox1
    Else
        Unload Me
        MsgBox "Không có Trang Tính nào ca?"
        On Error GoTo 0
    End If
End Sub

'-----------------------------------------
'Thực hiện khi đã show form
Private Sub UserForm_Activate()
'chon muc dau tien cua ListWBook
    Me.ListWBook.ListIndex = 0
'kich hoat checkbox XemTatCa
[COLOR=#ff0000]    Me.XemTatCa.Value = True[/COLOR]
End Sub

'-----------------------------------------
Private Sub XemTatca_Click()
    Set WinWb = Windows([COLOR=#0000ff]ListWBook.Value[/COLOR])
    Set WBook = WinWb.Parent
    ...code....
    On Error Resume Next
    Me.ListWSheet.ListIndex = 0
End Sub
đến khi kích hoạt XemTatCa thì bị lỗi ListWBook.Value=""
lúc thì chạy được, lúc thì không chạy được. em chả hiểu bị lỗi gì
mong được mọi người giúp
http://www.giaiphapexcel.com/forum/showthread.php?111414-Nhờ-sửa-lỗi-tham-chiếu-trong-Listbox
 
Upvote 0
Giả sử Em có các cột (Mặt hàng, Số lương, Đơn giá, Thành tiền) và em đang sử dụng filter 2 cột (Mặt hàng và Số lượng). Dữ liệu mà nhiều nắm lúc ko biết là đang filter ở cột nào.
A/Chị có cách nào dùng code để chạy một phát là các cột đều ở dạng sellect all (tức là sẽ ko còn cột nào đang ở chế độ filter). Mong A/Chị giúp đỡ. Cám ơn A/C!
 
Upvote 0
Giả sử Em có các cột (Mặt hàng, Số lương, Đơn giá, Thành tiền) và em đang sử dụng filter 2 cột (Mặt hàng và Số lượng). Dữ liệu mà nhiều nắm lúc ko biết là đang filter ở cột nào.
A/Chị có cách nào dùng code để chạy một phát là các cột đều ở dạng sellect all (tức là sẽ ko còn cột nào đang ở chế độ filter). Mong A/Chị giúp đỡ. Cám ơn A/C!
Thử đơn giản như vầy:
Mã:
Sub GPE()
ActiveSheet.AutoFilterMode = False
End Sub
 
Upvote 0
Giả sử Em có các cột (Mặt hàng, Số lương, Đơn giá, Thành tiền) và em đang sử dụng filter 2 cột (Mặt hàng và Số lượng). Dữ liệu mà nhiều nắm lúc ko biết là đang filter ở cột nào.
A/Chị có cách nào dùng code để chạy một phát là các cột đều ở dạng sellect all (tức là sẽ ko còn cột nào đang ở chế độ filter). Mong A/Chị giúp đỡ. Cám ơn A/C!
Excel có sẵn cái nút này mà, cần gì viết code nữa.
Data | Sort & Filter | Clear
 
Upvote 0
Hiện tại Em đang sử dụng conditional formating với công thức.
=IF($F10<>"";TRUE;FALSE)
Để khi nhập dữ liệu ngày vào cột F thì nó tự định dạng border cho dòng (nếu cột F có dữ liệu thì sẽ định dạng dòng cho dòng đó).
Nhưng nếu dữ liệu nhiều thì nó sẽ bị chậm dữ liệu.
A/C giúp Em code để nó sẽ tô mầu cho dòng theo điều kiện nếu dòng F có dữ liệu thì nó sẽ tự động định dạng border theo sự kiện worksheetchange. Mong A/C giúp. Cám ơn A/C!
 

File đính kèm

  • Định dạng cho dòng.xls
    429.5 KB · Đọc: 3
  • Untitled.jpg
    Untitled.jpg
    20.5 KB · Đọc: 6
Upvote 0
Bạn xem File này đúng ý bạn cần chưa
 

File đính kèm

  • Định dạng cho dòng.xls
    437 KB · Đọc: 12
Upvote 0

File đính kèm

  • Định dạng cho dòng (1).xls
    432.5 KB · Đọc: 4
Upvote 0
Bạn ơi mình tải file của bạn giúp mình về. Mình xóa cái conditional formating với công thức =IF($F10<>"";TRUE;FALSE)
Thì nó ko tự kẻ dòng được. Bạn xem lại giúp mình với nhé. Cám ơn Bạn!

Sorry bạn,lúc nãy Test thử quên không xóa cái CF đi, bây giờ sửa lại rồi đó, gửi lại bạn File này
 

File đính kèm

  • hoan chinh.xls
    440.5 KB · Đọc: 17
Upvote 0
Web KT

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

Back
Top Bottom