รูปแบบการเปลี่ยนแปลงกิจกรรมสำหรับ Excel VBA


2

ฉันพยายามป้องกันไม่ให้ผู้คนแก้ไข (ส่วนใหญ่) สเปรดชีตของฉันในขณะที่ยังคงเตือนพวกเขาให้ใช้ฟังก์ชันการเรียงลำดับของตัวกรองอัตโนมัติ สิ่งที่ฉันทำไปแล้วจนถึงตอนนี้ก็ใช้งาน Worksheet_Change และ Application.Undo เพื่อยกเลิกค่าใด ๆ ที่ป้อนลงในเซลล์ที่ฉันไม่ต้องการแก้ไขโดยอัตโนมัติ วิธีนี้ใช้งานได้ดียกเว้นว่าไม่สามารถตรวจจับการเปลี่ยนแปลงในการจัดรูปแบบ ไม่มีใครรู้วิธีที่จะทำให้เกิดเหตุการณ์เมื่อรูปแบบ (ข้อความ / สีพื้นหลัง) ของเซลล์มีการเปลี่ยนแปลง?

ขอบคุณ!


คุณควรลองป้องกันด้วย UserInterfaceOnly และดูว่าจะอนุญาตให้ตัวกรองอัตโนมัติทำงานได้หรือไม่
Lance Roberts

คุณหมายถึงว่าคุณต้องการย้อนกลับสีเติมเซลล์หรือไม่ คุณลองใช้ Cells.Interior.Pattern = xlNone หรือ Selection.Interior.ColorIndex = xlNone
Rajesh S

คำตอบ:


0

กิจกรรมที่คุณ จำกัด ในระดับแผ่นงานมีดังนี้:

Activate
BeforeDoubleClick
BeforeRightClick
Calculate
Change
Deactivate
FollowHyperLink
PivotTableUpdate
SelectionChange

ฉันคิดว่าคุณสามารถลองบางอย่างที่กิจกรรม SelectionChange หากใครบางคนเปลี่ยนการจัดรูปแบบของเซลล์แล้วย้ายไปยังเซลล์อื่นที่เหตุการณ์จะถูกเรียก

รหัสใดก็ตามที่คุณมีในพื้นที่นั้นจะถูกเรียกอย่างต่อเนื่องดังนั้นจึงเป็นความคิดที่ดีที่จะนำหน้าสิ่งที่คุณทำด้วยการตรวจสอบอย่างรวดเร็วเพื่อให้แน่ใจว่าเซลล์อยู่ในช่วงที่แน่นอนมีข้อมูล ฯลฯ แผ่นงานของคุณอาจเชื่องช้า มิฉะนั้นเมื่อผู้ใช้ย้ายจากเซลล์หนึ่งไปอีกเซลล์หนึ่ง


ขอบคุณสำหรับความช่วยเหลือ! สิ่งที่ฉันทำคือการป้องกันไม่ให้ผู้ใช้บันทึกแผ่นงาน สิ่งใดก็ตามที่เขียนในคอลัมน์ "ความคิดเห็น" จะทริกเกอร์เหตุการณ์การเปลี่ยนเวิร์กชีทเพื่อบันทึกเวอร์ชันที่ประทับเวลาไว้ในชีตอื่น ความคิดเห็นที่ประทับเวลาจะถูกถ่ายโอนไปเมื่อแผ่นงานต้นฉบับถูกเปิดอีกครั้ง
The_Third

0

ฉันพบว่ามันค่อนข้างง่าย:

ที่ 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

และที่ Module1

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

มันเป็นไปได้ดูอะไรกับการปรับเปลี่ยนเล็กน้อย


ไม่แน่ใจว่าทำไมสิ่งนี้จึงถูกลดระดับลง: ดูเหมือนว่าฉัน 1) เหตุการณ์นี้เกิดขึ้นทันเวลาเพื่อตรวจจับการเปลี่ยนแปลงและ 2) มันเปลี่ยนทั้งค่าและสี (ฉันไม่แน่ใจว่าสิ่งนี้เกิดขึ้นจริงหรือไม่) ต่อไปฉันคิดว่าผู้เขียนนั้นถูกต้องว่ามีการจัดรูปแบบอื่นนอกเหนือจากสีที่สามารถเปลี่ยนกลับได้เช่นกัน?
Arjan

สวัสดีขออภัยสำหรับภาษาอังกฤษของฉันไม่ดีนัก แต่ฉันพบข้อผิดพลาดเล็กน้อยเมื่อทำการทดสอบ ด้วยช่วงใหญ่มากมันช้ามาก สำหรับการใช้งานของฉันไม่เกี่ยวข้อง แต่ควรเร็วขึ้นถ้าคุณออกจากลูปและให้เปรียบเทียบเซลล์ซ้ายแรก แต่คุณสามารถใช้เพื่อยกเลิกการเปลี่ยนแปลงใด ๆ
ไม่ใช่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.