باب پرسید آیا می توان فرمول نوشت و جواب را به جای در سلول در نظر گرفت؟ پاسخ کوتاه این است که نه، شما نمی توانید آن را با یک فرمول انجام دهید. با این حال، می توانید این کار را با ماکرو انجام دهید. به عنوان مثال، ماکرو زیر محتویات دو سلول (A1 و B1) را اضافه می کند و سپس نتیجه را در یک نظر متصل به سلول 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
اگر ترجیح میدهید ماکرو را روی محدودهای از سلولها اجرا کنید، رویکرد متفاوتی ضروری است. حلقه های ماکرو زیر از طریق تمام سلول های یک انتخاب می گذرد. اگر سلول حاوی فرمول باشد، ماکرو مقدار (نتیجه فرمول ها) را در یک نظر متصل به آن سلول قرار می دهد.
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
در حین حلقه زدن سلولهای انتخابی، اگر یکی از سلولها دارای فرمول و نظر موجود باشد، کامنت حذف میشود و با نظر جدیدی که حاوی نتیجه فرمول است جایگزین میشود. پس از آن مقدار سلول ها و همچنین یک نظر با همان شماره نمایش داده می شود. به جای CStr می توانید از تابع Format برای نمایش مقدار به هر شکلی که می خواهید استفاده کنید.
شما همچنین می توانید یک ماکرو ایجاد کنید که هر زمان که محتوای یک سلول خاص را به روز می کنید، نظر را تغییر می دهد. به عنوان مثال، اجازه دهید بگوییم که هر بار که شخصی تغییری در سلول C11 ایجاد میکند، میخواهید نتیجه هر آنچه در آن سلول است در یک نظر متصل به سلول F15 قرار گیرد. ماکرو زیر دقیقاً این کار را انجام می دهد:
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
هنگامی که شخصی فرمول (یا مقدار) را در سلول C11 وارد می کند، نتایج آن فرمول (یا خود مقدار) در نظری که به سلول F15 متصل است قرار می گیرد. از آنجایی که این یک ماکرو راهاندازی رویداد است، باید در پنجره کد صفحه کاری که در آن کار میکند وارد شود.
در نهایت، ممکن است بخواهید ماکرو خود را بر یک ستون کامل نظارت کنید. ماکرو زیر از رویداد Change یک کاربرگ استفاده می کند، درست مانند ماکرو قبلی. با این حال، تنها زمانی وارد عمل میشود که تغییر در ستون F انجام شود و تنها در صورتی که یک سلول در آن ستون تغییر کند.
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
اگر کاربر تغییری در یک سلول در ستون F ایجاد کند، ماکرو نتیجه آنچه وارد شده را می گیرد و آن را در یک نظر متصل به آن سلول قرار می دهد. سپس محتویات سلول حذف می شود.