2012-04-04 43 views
8

Tôi đang cố gắng viết macro đơn giản để hiển thị cửa sổ bật lên (vbOKOnly) nếu giá trị trong ô vượt quá một giá trị nhất định.Mã VBA để hiển thị hộp thông báo bật lên nếu công thức trong ô mục tiêu vượt quá một giá trị nhất định

Tôi về cơ bản có một bảng tính với các sản phẩm và giảm giá. Tôi có một công thức trong một tế bào, nói A1, cho thấy giảm giá như là một phần trăm (50% hoặc 0,5) hiệu quả giảm giá của tất cả các mục.

Điều tôi đang tìm là mã để hiển thị hộp thông báo nếu giá trị của ô A1 vượt quá 50%, vì đầu vào của ô khác đã đẩy giảm giá hơn 50%.

Cảm ơn!

+3

Bạn có biết định dạng có điều kiện không? Có lý do nào bạn muốn một MsgBox định dạng có điều kiện không? –

Trả lời

14

Bạn có thể thêm mã VBA sau vào tờ của bạn:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Range("A1") > 0.5 Then 
     MsgBox "Discount too high" 
    End If 
End Sub 

Mỗi khi một tế bào bị thay đổi trên bảng, nó sẽ kiểm tra giá trị của ô A1.

Ghi chú:

  • nếu A1 cũng phụ thuộc vào dữ liệu nằm trong các bảng tính khác, macro sẽ không được gọi nếu bạn thay đổi dữ liệu đó.
  • macro sẽ được gọi sẽ được gọi mỗi khi có thay đổi nào đó trên trang tính của bạn. Nếu nó có nhiều công thức (như trong 1000s) nó có thể chậm.

Widor sử dụng một cách tiếp cận khác nhau (Worksheet_Calculate thay vì Worksheet_Change):

  • Ưu điểm: Phương pháp của ông sẽ làm việc nếu giá trị A1 được liên kết với các tế bào nằm trong tờ khác.
  • Nhược điểm: nếu bạn có nhiều liên kết trên trang tính tham khảo các trang tính khác, phương pháp của anh sẽ chạy chậm hơn một chút.

Kết luận: sử dụng Worksheet_Change nếu A1 chỉ phụ thuộc vào dữ liệu nằm trên bảng cùng, sử dụng Worksheet_Calculate nếu không muốn nói.

+0

Có bạn đã đúng. Tôi đã xóa bài đăng của mình. Có vẻ như tôi đã hiểu sai câu hỏi :) +1 vì đã làm đúng :) –

+0

@SiddharthRout thành thật mà nói tôi đã trả lời bằng dữ liệu lần đầu tiên, cho đến khi tôi đọc dòng thứ 3 của câu hỏi;) – assylias

+0

LOL @ assylias. Nhắc nhở chúng tôi rằng chúng tôi vẫn là con người;) –

1

Tôi không nghĩ rằng hộp thư là cách tốt nhất để đi với điều này vì bạn sẽ cần mã VB chạy trong vòng lặp để kiểm tra nội dung ô hoặc trừ khi bạn định chạy macro theo cách thủ công. Trong trường hợp này, tôi nghĩ sẽ tốt hơn nếu thêm định dạng có điều kiện vào ô để thay đổi nền thành màu đỏ (ví dụ) nếu giá trị vượt quá giới hạn trên.

+2

Không cần lặp lại. – assylias

+1

@assylias Tôi đã suy nghĩ dọc theo dòng của một tập lệnh được bản địa hóa để tập trung vào ô đã nói, nếu sử dụng phương pháp bạn đã cung cấp thì không cần lặp lại, nhưng khi bạn nói càng nhiều dữ liệu trên bảng tính, chạy. –

+0

@assylias Tìm thấy điều này trong khi tìm kiếm chủ đề. Trên thực tế Matt là chính xác. Trong khi một vòng lặp không được sử dụng trong cú pháp trong VBa, một Worksheet_Change, có hiệu lực là một "looping" gọi liên tục. Nói cách khác, đó là một cuộc gọi nội bộ tới "Bất cứ điều gì xảy ra chưa?" hơn và hơn, mỗi mili giây. – ejbytes

2

Thực chất bạn muốn thêm mã vào sự kiện Calculate của Trang tính có liên quan.

Trong cửa sổ dự án của trình chỉnh sửa VBA, bấm đúp vào trang tính bạn muốn thêm mã vào và từ trình đơn thả xuống ở đầu cửa sổ trình soạn thảo, chọn 'Bảng tính' và 'Tính toán' ở bên trái và phải tương ứng.

Ngoài ra, sao chép mã dưới đây vào trình soạn thảo của sheet mà bạn muốn sử dụng:

Private Sub Worksheet_Calculate() 

If Sheets("MySheet").Range("A1").Value > 0.5 Then 
    MsgBox "Over 50%!", vbOKOnly 
End If 

End Sub 

Bằng cách này, mỗi khi bảng tính sẽ tính toán lại nó sẽ kiểm tra xem nếu giá trị là> 0,5 hoặc 50% .