Giải nghĩa code VBA

Liên hệ QC

bienda

Thành viên chính thức
Tham gia
2/1/09
Bài viết
50
Được thích
3
Mã:
Option Explicit

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim rngData As Range
For Each rngData In Target.Cells
    If rngData.HasFormula Then
        ActiveSheet.Protect ("[COLOR=red]abc[/COLOR]")
        Exit Sub
    Else
        ActiveSheet.Unprotect ("[COLOR=red]abc[/COLOR]")
    End If
Next rngData
End Sub

Em có cái code VBA để khóa Sheet và mở Sheet khi con trỏ chỉ vào ô Cell.
Các cao nhân làm ơn giải thích từng dòng lệnh giúp em với.
Em xin chân thành cảm ơn
 
1. Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Khi có sự thay đổi trong chọn lựa ở bất kỳ sheet nào thuộc bảng tính (workbook) "này" ("này" có nghĩa ám chỉ bảng tính có code "kia") thì Workbook_SheetSelectionChange sẽ được gọi để thực hiện. Khi được gọi thì sẽ có 2 tham số được truyền vào: sh chỉ ra đối tượng sheet mà ở đó "vừa" có sự chọn lựa, và Target chỉ ra vùng được chọn lựa trong sh. Vùng có thể là 1 ô, cũng có thể là nhiều ô. Vd. nếu tập tin có 10 sheet và ở thời điểm nào đó người dùng chọn vùng C3:H9 trong sheet Data thì sh = đối tượng Data, Target = vùng C3:H19.

2.
Dim rngData As Range
For Each rngData In Target.Cells
(A)
Trong ngữ cảnh này In Target.Cells - (A) thì rngData là 1 ô (1 cell)
(A) -> duyệt từng ô (cell) trong vùng Target (trong vùng C3:H9 trên sheet Data)

3.
If rngData.HasFormula Then
Nếu ô rngData có chứa công thức thì:

4.
ActiveSheet.Protect ("abc")
Exit Sub

protect sheet đang hoạt động và kết thức macro hiện hành. Sheet đang hoạt động chính là sheet vừa có sự chọn lựa vùng, tức chính là sheet sh. Vậy để dễ hiểu hơn thì nên là: sh.Protect "abc".

5.
Else
Nếu không thì (tức nếu là ô không chứa công thức):

6.
ActiveSheet.Unprotect ("abc")
Bỏ protect. Cũng có thể là sh.Unprotect "abc"

Kết luận: trên cơ sở phân tích ta thấy:
1. Nếu vùng được chọn (Target) không có ô nào chứa công thức -> bước 4 không bao giờ được thực hiện. Chỉ toàn các bước 6 được thực hiện. Tức kết cục là sheet sh được Unprotect.

2. Nếu vùng được chọn (Target) có ít nhất 1 ô có công thức thì bước 4 sẽ được thực hiện 1 lần và ngay sau đó việc thực hiện macro được kết thúc. Tức kết cục là sheet sh được Protect.
 
Upvote 0
1. Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Khi có sự thay đổi trong chọn lựa ở bất kỳ sheet nào thuộc bảng tính (workbook) "này" ("này" có nghĩa ám chỉ bảng tính có code "kia") thì Workbook_SheetSelectionChange sẽ được gọi để thực hiện. Khi được gọi thì sẽ có 2 tham số được truyền vào: sh chỉ ra đối tượng sheet mà ở đó "vừa" có sự chọn lựa, và Target chỉ ra vùng được chọn lựa trong sh. Vùng có thể là 1 ô, cũng có thể là nhiều ô. Vd. nếu tập tin có 10 sheet và ở thời điểm nào đó người dùng chọn vùng C3:H9 trong sheet Data thì sh = đối tượng Data, Target = vùng C3:H19.

2.
Dim rngData As Range
For Each rngData In Target.Cells
(A)
Trong ngữ cảnh này In Target.Cells - (A) thì rngData là 1 ô (1 cell)
(A) -> duyệt từng ô (cell) trong vùng Target (trong vùng C3:H9 trên sheet Data)

3.
If rngData.HasFormula Then
Nếu ô rngData có chứa công thức thì:

4.
ActiveSheet.Protect ("abc")
Exit Sub

protect sheet đang hoạt động và kết thức macro hiện hành. Sheet đang hoạt động chính là sheet vừa có sự chọn lựa vùng, tức chính là sheet sh. Vậy để dễ hiểu hơn thì nên là: sh.Protect "abc".

5.
Else
Nếu không thì (tức nếu là ô không chứa công thức):

6.
ActiveSheet.Unprotect ("abc")
Bỏ protect. Cũng có thể là sh.Unprotect "abc"

Kết luận: trên cơ sở phân tích ta thấy:
1. Nếu vùng được chọn (Target) không có ô nào chứa công thức -> bước 4 không bao giờ được thực hiện. Chỉ toàn các bước 6 được thực hiện. Tức kết cục là sheet sh được Unprotect.

2. Nếu vùng được chọn (Target) có ít nhất 1 ô có công thức thì bước 4 sẽ được thực hiện 1 lần và ngay sau đó việc thực hiện macro được kết thúc. Tức kết cục là sheet sh được Protect.
Bác cho em hỏi là thành phần này
[" & "]trong code có vai trò gì ạ?
Bài đã được tự động gộp:

( " [ COLOR = red ] [ /COLOR ] " )
 
Upvote 0
Bác cho em hỏi là thành phần này
[" & "]trong code có vai trò gì ạ?
Bài đã được tự động gộp:

( " [ COLOR = red ] [ /COLOR ] " )
Cái này tôi cho là GPE làm chưa chuẩn.

Khi viết bài thì bạn chèn các thẻ [ code ] [ /code ], [ quote ] [ /quote] ... Khi bạn tô mầu đỏ 1 đoạn xyz trong vd. [ quote ] thì sau khi gửi bài bạn sẽ thấy xyz mầu đỏ. Nhưng nếu bạn tô mầu đoạn xyz trong thẻ [ code ] thì sau khi gửi bài bạn thấy có TEXT = "[ COLOR = red ]xyz[ /COLOR ]" và xyz không có mầu đỏ. Nhiều diễn đàn khác có thể tô mầu cả trong thẻ [ code ] nhưng GPE khi đó không tô mầu mà chỉ hiện thẻ [ color ].

Chủ thớt khi viết code trong thẻ [ code ] đã tô mầu đỏ abc nên mới có [ COLOR = red ]abc[ /COLOR ]. Thực ra code chỉ là ActiveSheet.Protect ("abc"). Do chủ thớt tô mầu đỏ abc trong thẻ code nên GPE hiển thị ra thế. Các diễn đàn khác ngay cả trong thẻ [ code ] cũng có thể tô mầu.
 
Upvote 0
Cảm ơn hai bác nhiều. Em mới học kiến thức còn kém thấy cái kia sao code nó lạ vậy. Hoá ra là thế. Hihi cứ tưởng lại trong code lại có cái đấy mà không hiểu vì sao
 
Upvote 0
Cái này tôi cho là GPE làm chưa chuẩn.

Khi viết bài thì bạn chèn các thẻ [ code ] [ /code ], [ quote ] [ /quote] ... Khi bạn tô mầu đỏ 1 đoạn xyz trong vd. [ quote ] thì sau khi gửi bài bạn sẽ thấy xyz mầu đỏ. Nhưng nếu bạn tô mầu đoạn xyz trong thẻ [ code ] thì sau khi gửi bài bạn thấy có TEXT = "[ COLOR = red ]xyz[ /COLOR ]" và xyz không có mầu đỏ. Nhiều diễn đàn khác có thể tô mầu cả trong thẻ [ code ] nhưng GPE khi đó không tô mầu mà chỉ hiện thẻ [ color ].

Chủ thớt khi viết code trong thẻ [ code ] đã tô mầu đỏ abc nên mới có [ COLOR = red ]abc[ /COLOR ]. Thực ra code chỉ là ActiveSheet.Protect ("abc"). Do chủ thớt tô mầu đỏ abc trong thẻ code nên GPE hiển thị ra thế. Các diễn đàn khác ngay cả trong thẻ [ code ] cũng có thể tô mầu.
Để tô màu trong bbcode [ code] bác thử dùng cú pháp:
1600482783999.png
Kết quả:
Rich (BB code):
abc

Bác tham khảo thử xem sao nhé!
 
Upvote 0
Web KT

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

Back
Top Bottom