Bob hỏi liệu có thể viết công thức và nhận câu trả lời trong một nhận xét, thay vì trong một ô hay không. Câu trả lời ngắn gọn là không, bạn không thể làm điều đó với một công thức. Tuy nhiên, bạn có thể làm điều đó với macro. Ví dụ: macro sau đây thêm nội dung của hai ô (A1 và B1) và sau đó gắn kết quả vào một nhận xét được đính kèm vào ô C1:

Sub MakeComment()

With Worksheets(1).Range("C1").AddComment         .Visible = True         .Text "Total of cell A1 plus cell B1 is equal to " & _           ([A1].Value) + ([B1].Value)

End With End Sub

Nếu bạn muốn chạy macro trên một phạm vi ô, thì cần phải có một cách tiếp cận khác. Các vòng lặp macro sau đi qua tất cả các ô trong một vùng chọn. Nếu ô chứa một công thức, macro sẽ đặt giá trị (kết quả của công thức) trong một chú thích được đính kèm với ô đó.

Sub ValueToComment()

Dim rCell As Range     For Each rCell In Selection         With rCell             If .HasFormula Then                 On Error Resume Next                 .Comment.Delete                 On Error GoTo 0                 .AddComment                 .Comment.Text Text:=CStr(rCell.Value)

End If         End With     Next     Set rCell = Nothing End Sub

Trong khi lặp qua các ô trong vùng chọn, nếu một trong các ô có công thức và nhận xét hiện có, thì nhận xét đó sẽ bị xóa và thay thế bằng nhận xét mới có chứa kết quả công thức.

Sau đó, giá trị của ô sẽ hiển thị cũng như nhận xét có cùng số. Thay vì CStr, bạn cũng có thể sử dụng chức năng Định dạng để hiển thị giá trị theo bất kỳ cách nào bạn có thể muốn.

Bạn cũng có thể tạo một macro sẽ sửa đổi nhận xét bất cứ khi nào bạn cập nhật nội dung của một ô cụ thể. Ví dụ: giả sử mỗi khi ai đó thực hiện thay đổi trong ô C11, bạn muốn kết quả của bất kỳ thứ gì có trong ô đó được đặt vào một nhận xét được đính kèm với ô F15. Macro sau thực hiện điều đó:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim sResult As String

If Union(Target, Range("C11")).Address = Target.Address Then         Application.EnableEvents = False         Application.ScreenUpdating = False         sResult = Target.Value         Target.ClearContents

With Range("F15")

.ClearComments             .AddComment             .Comment.Text Text:=sResult         End With         Application.EnableEvents = True         Application.ScreenUpdating = True     End If End Sub

Khi ai đó nhập một công thức (hoặc một giá trị) vào ô C11, kết quả của công thức đó (hoặc chính giá trị) được đặt vào một nhận xét được đính kèm với ô F15. Vì đây là một macro được kích hoạt bởi sự kiện, nó cần phải được nhập vào cửa sổ mã cho trang tính mà nó sẽ hoạt động.

Cuối cùng, bạn có thể muốn macro theo dõi toàn bộ cột. Macro sau sử dụng sự kiện Thay đổi của trang tính, giống như macro trước đó. Tuy nhiên, nó chỉ bắt đầu hoạt động nếu thay đổi được thực hiện trong cột F và chỉ khi một ô trong cột đó được thay đổi.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Cells.Count > 1 Then Exit Sub     If Target.Column <> 6 Then Exit Sub

Dim x As String     Application.EnableEvents = False     If Target.HasFormula Then         x = Evaluate(Target.Formula)

Else         x = Target.Text     End If

Target.ClearComments     If Target.Text = "" Then         Application.EnableEvents = True         Exit Sub     End If

Target.AddComment x     Target = ""

Application.EnableEvents = True End Sub

Nếu người dùng thực hiện thay đổi đối với một ô trong cột F, macro sẽ lấy kết quả của những gì đã được nhập và đặt nó vào một chú thích được đính kèm với ô đó. Nội dung của ô sau đó sẽ bị xóa.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (13038) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện menu cũ hơn của Excel tại đây: