Sự kiện thay đổi định dạng cho VBA Excel


2

Tôi đang cố gắng ngăn mọi người sửa đổi (hầu hết) bảng tính của mình trong khi vẫn cho phép họ sử dụng chức năng sắp xếp của Trình lọc tự động. Những gì tôi đã làm cho đến nay được sử dụng sự kiện Worksheet_Change và Application.Undo để tự động hoàn tác mọi giá trị được nhập vào các ô mà tôi không muốn sửa đổi. Điều này hoạt động rất tốt, ngoại trừ việc nó không thể phát hiện các thay đổi trong định dạng. Có ai biết một phương tiện để kích hoạt một sự kiện khi định dạng (màu văn bản / màu nền) của một ô bị thay đổi không?

Cảm ơn!


Bạn nên thử bảo vệ với UserInterfaceOnly và xem liệu nó có cho phép AutoFilter hoạt động không.
Lance Roberts

Bạn muốn nói rằng bạn muốn đảo ngược màu Cell Fill? Bạn đã thử Cells.Interior.Potype = xlNone hay Selection.Interior.ColorIndex = xlNone
Rajesh S

Câu trả lời:


0

Các sự kiện bạn bị giới hạn ở cấp độ bảng tính như sau:

Activate
BeforeDoubleClick
BeforeRightClick
Calculate
Change
Deactivate
FollowHyperLink
PivotTableUpdate
SelectionChange

Tôi cho rằng bạn có thể thử một cái gì đó tại sự kiện SelectionChange. Nếu ai đó thay đổi định dạng của một ô và sau đó di chuyển đến một ô khác thì sự kiện đó sẽ được gọi.

Bất cứ mã nào bạn có trong khu vực đó sẽ liên tục được gọi, vì vậy sẽ là một ý tưởng tốt để mở đầu mọi việc bạn làm với một số kiểm tra nhanh để đảm bảo các ô nằm trong một phạm vi nhất định, có dữ liệu, v.v. mặt khác khi người dùng chuyển từ tế bào này sang tế bào khác.


Cảm ơn đã giúp đỡ! Điều cuối cùng tôi làm là ngăn người dùng lưu trang tính; bất cứ điều gì được viết trong cột "Nhận xét" sẽ kích hoạt sự kiện Thay đổi trang tính để lưu phiên bản được đóng dấu thời gian trong một trang tính khác. Các bình luận đóng dấu thời gian sau đó được chuyển qua khi bảng gốc được mở lại.
The_Third

-1

tôi thấy nó khá đơn giản:

Tại ThisWorkbook:

Public Sub Workbook_Open()
Set SelectLast = Range("A1")
SelectVal = Range("A1").Value
SelectColor = Range("A1").Interior.Color
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
Dim LastVal As String
Dim LastColor As String
LastVal = ""
LastColor = ""
For i = 1 To SelectLast.Columns.Count
    For y = 1 To SelectLast.Rows.Count
        LastVal = LastVal & SelectLast.Cells(y, i).Value
        LastColor = LastColor & SelectLast.Interior.Color
    Next
Next
If ((LastVal <> SelectVal) Or (LastColor <> SelectColor)) Then MsgBox ("Something happend")
SelectVal = ""
SelectColor = ""
For i = 1 To Target.Columns.Count
    For y = 1 To Target.Rows.Count
        SelectVal = SelectVal & Target.Cells(y, i).Value
        SelectColor = SelectColor & Target.Interior.Color
    Next
Next
Set SelectLast = Target
End Sub

và tại Module1

Global SelectLast As Excel.Range
Global SelectVal As String
Global SelectColor As String

Nó có thể xem bất cứ điều gì với sửa đổi nhỏ.


Không chắc chắn tại sao điều này bị hạ cấp: đối với tôi, có vẻ như 1) sự kiện này được kích hoạt đúng lúc để phát hiện các thay đổi và 2) nó hoàn nguyên cả giá trị và màu sắc (tôi không chắc liệu điều này có thực sự xảy ra ở trên không?). Tiếp theo, tôi giả định tác giả có đúng rằng một số thứ định dạng khác ngoài màu sắc cũng có thể được hoàn nguyên?
Arjan

Xin chào, xin lỗi vì tiếng Anh của tôi iam không thực sự tốt, nhưng tôi đã tìm thấy một lỗi nhỏ khi kiểm tra iam. Với phạm vi rất lớn, nó rất chậm. Đối với tôi sử dụng nó không liên quan, nhưng nó sẽ nhanh hơn nếu bạn rời khỏi các vòng lặp, và hãy so sánh chỉ ô đầu tiên bên trái. Nhưng, chắc chắn bạn có thể sử dụng để hoàn nguyên bất kỳ thay đổi nào.
nonUser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.