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:
Em có đoạn code mọi người xem có rút ngắn gọn hơn được không ạ?
Mã:
Dim oSelFormulas As Range
    Sheet5.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet5.Protect "123123", True, True, True, True
    Sheet10.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet10.Protect "123123", True, True, True, True
    Sheet12.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet12.Protect "123123", True, True, True, True
    Sheet13.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet13.Protect "123123", True, True, True, True
    Sheet6.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet6.Protect "123123", True, True, True, True
Có ai xem giúp em bài này với ạ.
Thân!
 
Upvote 0
Em có đoạn code mọi người xem có rút ngắn gọn hơn được không ạ?
Mã:
Dim oSelFormulas As Range
    Sheet5.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet5.Protect "123123", True, True, True, True
    Sheet10.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet10.Protect "123123", True, True, True, True
    Sheet12.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet12.Protect "123123", True, True, True, True
    Sheet13.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet13.Protect "123123", True, True, True, True
    Sheet6.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet6.Protect "123123", True, True, True, True

Rút ngắn chi vậy?

Mã:
Dim vSh as Variant
for each vSh in array(Sheet5.name, Sheet10.name, Sheet12.name, Sheet13.name, Sheet6.name)
        Sheets(vSh).Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheets(vSh).Protect "123123", True, True, True, True
next vSh
 
Upvote 0
Rút ngắn trước hết là để dễ nhìn hơn, thứ 2 là dài quá thì cũng ngại khi đọc lại code Bác VetMini à. Cảm ơn Bác đã giúp đỡ! Chúc bác một ngày tốt lành.
Thêm một ý nữa là ở trên bác có để vSh dạng Variant, nếu bây giờ em khai báo nó ở dạng vSh as Worksheet có được không, và trong vòng for phải chỉnh như thế nào ở chỗ "in array(...) để nó hiểu được. Cảm ơn bác nhiều.
Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người Giải thích code này giúp em:
Mã:
[COLOR=#0000BB][FONT=monospace]With Sheet1[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]
     [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Parent[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Protect 123
End With[/FONT][/COLOR]

.parent ở đoạn code trên có mục đích gì đấy ạ, em thử seach gu gồ rồi mà chưa thấy???
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người Giải thích code này giúp em:
Mã:
[COLOR=#0000BB][FONT=monospace]With Sheet1[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]
     [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Parent[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Protect 123
End With[/FONT][/COLOR]

.parent ở đoạn code trên có mục đích gì đấy ạ, em thử seach gu gồ rồi mà chưa thấy???
Ví dụ A là cha của B. Khi ta nói B.parent là ta đang nói đến A
 
Upvote 0
Parent theo mình thì nên hiểu là đấng sinh thành; Cũng có nghĩa nói mẹ cũng đúng!; Khì, khì, . . . .

Đã lâu quá không thấy bài của chàng này! Xin chào nha!

Đấng sinh thành của 1 trang tính không fải chúng ta, người sở hữu file; mà là WorkSheets

Bạn có thể dùng câu lệnh sau:

MsgBox .Parent.Name

ngay sau câu lệnh đó để được thêm thông tin bổ ích.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Rút ngắn trước hết là để dễ nhìn hơn, thứ 2 là dài quá thì cũng ngại khi đọc lại code ...

Tôi rút ngắn là vì các đoạn code ây lặp lại nhiều lần. Chứ dễ nhìn hơn thì chưa chắc. Và đọc lại code có ngại hay không là do có chú thích kỹ càng hay không, chứ độ dài không quan trọng

...
để vSh dạng Variant, nếu bây giờ em khai báo nó ở dạng vSh as Worksheet có được không, và trong vòng for phải chỉnh như thế nào ở chỗ "in array(...) để nó hiểu được.

1. For Each luôn luôn đi với variant. Không có kiểu gì nữa hết. For each là lệnh duyệt phần tử của một tổ hợp (collection). Nó không phải là lệnh duyệt đếm kiểu for i = ...

2. Array chỉ làm một hàm tạo một mảng từ danh sách. Đối với VBA, array là một dạng collection nên có thể duyệt được bằng for each. Muốn dùng worksheet:
Dim vSh as Variant
for each vSh in array(Sheet5, Sheet10, Sheet12, Sheet13, Sheet6)
vSh.Select
Cells.Locked = False
Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
oSelFormulas.Locked = True
vSh.Protect "123123", True, True, True, True
next vSh

Có lý do tại sao tôi dùng name thay vì worksheet trực tiêp. Nhưng giải thích dài dòng lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác QuangHai
@HYen17:
Đã lâu quá không thấy bài của chàng này! Xin chào nha!
Em chào bác. Lúc đầu hỏi theo kiểu không biết gì thì cứ đưa lên hỏi, biết được một ít thì vừa tự mày mò vừa hỏi để biết thêm nhiều nữa, chả thế mà con mắt em giờ nó cứ lờ đờ... Bác yên tâm là em còn nguyên cả một trang A4 câu hỏi mà em tự đặt ra mà chưa có lời giải thỏa mãn. Lâu lâu có mấy bác động viên lại cũng thấy được giải tỏa. ;;;;;;;;;;;
Chúc các bác happy trong công việc nha.
Thân!
P/s: em bỏ cái .parent ra thì nó vẫn protect được bình thường. nó khác nhau ở chỗ nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả mọi người.
PHP:
Public Sub FilterData(ByVal Str As String)
 Dim r As Long, n As Long, matchRows() As Long, ftData As Variant


    UserForm1.ComboBox1.List = Array()
    LoadDT
    Str = TV(Str)
    If Str <> "" Then
        If IsArray(realDT) Then
            For r = 1 To UBound(realDT) Step 1
                If InStr(fakeDT(r), Str) > 0 Or InStr(realDT(r, 1), Str) > 0 Then
                    n = n + 1
                    ReDim Preserve matchRows(1 To n)
                    matchRows(n) = r
                End If
            Next
            
            If n > 0 Then
                ReDim ftData(1 To n, 1 To 2)
                For r = 1 To n Step 1
                    ftData(r, 1) = realDT(matchRows(r), 1)
                    ftData(r, 2) = realDT(matchRows(r), 2)
                Next
                UserForm1.ComboBox1.List = ftData
            End If
        End If
    End If
End Sub
Trong đoạn trên thì có đoạn
PHP:
ReDim Preserve matchRows(1 To n)
matchRows(n) = r
em không hiểu, nhờ mọi người chỉ giúp.
Nếu cần tải file ở #2 topic http://www.giaiphapexcel.com/forum/showthread.php?105218-Lọc-tìm-trên-Form&p=653301#post653301.
Em xin cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
DTDerror.jpg

Nhờ các Bác xem hộ đoạn code này. file chay trên excel 2003 thì ok khi chuyen sang excel 2007 thì báo loi vay/
 
Upvote 0
Chào các anh chị!
Em đang tập record macro, em muốn tô màu hết cho toàn bộ bảng tính (sheet "PH") chỉ trừ ô B2, sau khi record em có sửa code lại, nhưng sau khi sửa code thì nó báo lỗi và không chạy đúng theo như yêu cầu
Nhờ các anh chị chỉ chỗ sai và chỉnh lại code . Em cảm ơn
Mã:
Sub Macro4()
Dim Sh1 As Worksheet
    Set Sh1 = Sheets("PH")
    With Sh1
             .Interior.ColorIndex = 15
    End With
    Range("B2").Interior.ColorIndex = xlNone
End Sub
 
Upvote 0
Thêm 1 mệnh đề nữa là được:
PHP:
Sub Macro4()
Dim Sh1 As Worksheet
    Set Sh1 = Sheets("PH")
    With Sh1
        .UsedRange.Interior.ColorIndex = 35     '<=|'
    End With
    Range("B2").Interior.ColorIndex = xlNone
End Sub
 
Upvote 0
Mở khóa & bỏ tô màu theo điều kiện

Các anh chị giúp đỡ code cho trường hợp sau vì em không thể record macro được
em có sheet PH, sheet này đang bị khóa (pass là 123) và tô màu xám.Em muốn các trường hợp sau:


1/Em muốn khi chọn Validation ở ô B2 là "PhieuChi" thì code sẽ mở khóa và không tô màu cho các ô C2,D2, E5, A20 (các ô còn lại vẫn bị khóa và tô màu xám)

2/Em muốn khi chọn Validation ở ô B2 là "PhieuThu" thì code sẽ mở khóa và không tô màu cho các ô C2,D2, E7, A19
Em cảm ơn anh chị.
 

File đính kèm

  • DangThucTap_2.xls
    21 KB · Đọc: 9
Upvote 0
Các anh chị giúp đỡ code cho trường hợp sau vì em không thể record macro được
em có sheet PH, sheet này đang bị khóa (pass là 123) và tô màu xám.Em muốn các trường hợp sau:


1/Em muốn khi chọn Validation ở ô B2 là "PhieuChi" thì code sẽ mở khóa và không tô màu cho các ô C2,D2, E5, A20 (các ô còn lại vẫn bị khóa và tô màu xám)

2/Em muốn khi chọn Validation ở ô B2 là "PhieuThu" thì code sẽ mở khóa và không tô màu cho các ô C2,D2, E7, A19
Em cảm ơn anh chị.

Thử như vầy xem. Tôi đưa luôn cell B2 vào vùng mở khóa để khỏi phải Unprotect khi thay đổi giá trị tại B2 để test code
[GPECODE=vb]
Sub Test()
Dim Sh1 As Worksheet
Set Sh1 = Sheets("PH")
With Sh1
.Unprotect "123"
.UsedRange.Locked = False
.UsedRange.Interior.ColorIndex = 15
If .[B2].Value = "PhieuChi" Then
.Range("B2, C2, D2, E5, A20").Interior.ColorIndex = xlNone
.UsedRange.Locked = True
.Range("B2, C2, D2, E5, A20").Locked = False
.Protect "123"
Else
.Range("B2, C2, D2, E7, A19").Interior.ColorIndex = xlNone
.UsedRange.Locked = True
.Range("B2, C2, D2, E7, A19").Locked = False
.Protect "123"
End If
End With
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Anh chị giúp em câu lệnh sau
Câu lệnh đúng là
Mã:
 If .[B2].Value = "PhieuChi" Then
Em thêm và sửa
Mã:
If .[B2].Value = "PhieuChi" [B]Or "PhieuXuat"[/B] Then
Thì bị báo lỗi, cho em hỏi cách khắc phục lỗi
 
Upvote 0
[ThongBao]Anh chị giúp em câu lệnh sau
. . . . .
Em thêm và sửa
Mã:
If .[B2].Value = "PhieuChi" [B]Or "PhieuXuat" = .[B2].Value[/B] Then
Thì là cách khắc phục lỗi[/Thongbao]
 
Upvote 0
Web KT
Back
Top Bottom