AddComment на нескольких листах VBA Excel
синтаксис AddComment работает на первом выбранном листе в книге, но для следующего дает мне эту ошибку: Ошибка 1004 "ошибка, определенная приложением или объектом". Я не знаю почему вылетает, если было выбрано несколько листов и работает только для первого выбранного. У кого-нибудь есть какие-нибудь идеи?
If selectedSheet.Cells(7, columnIndex).value <> 100 Then
selectedSheet.Cells(7, columnIndex).Interior.ColorIndex = 3
If standardReportFilePath <> "" Then 'not using the Standard Report Evalution algorithm
If VerifyStandardReportFile(selectedSheet.Name, selectedSheet.Cells(1, columnIndex).value, wbk, amplitude, missingCrashes) = True Then
selectedSheet.Cells(1, columnIndex).Interior.ColorIndex = 36 ' color the crash cell with yellow
Set rng = selectedSheet.Cells(1, columnIndex)
If rng.Comment Is Nothing Then
**rng.AddComment "In Standard Report this crash starts to deploy from " & CStr(amplitude) & " amplitude"**
Else
rng.Comment.Text "In Standard Report this crash starts to deploy from " & CStr(amplitude) & " amplitude"
End If
End If
End If
End If
End If
альтернативный набор кода, который показывает проблему. (Запустите это с тремя пустыми листами в новой книге.):
Sub test()
Dim ws As Worksheet
Dim Rng As Range
'Running code with a single sheet selected
Worksheets("Sheet1").Select
'Code that shows issue - this will work
Set ws = Worksheets("Sheet2")
Set Rng = ws.Cells(1, 1)
If Rng.Comment Is Nothing Then
Rng.AddComment "xxx"
End If
'Get rid of comment again
Rng.Comment.Delete
'Running code with multiple sheets selected
Worksheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
'Code that shows issue - will crash on the "AddComment"
Set ws = Worksheets("Sheet2")
Set Rng = ws.Cells(1, 1)
If Rng.Comment Is Nothing Then
Rng.AddComment "xxx"
End If
End Sub
5 ответов
Я нашел обходной путь, но до сих пор не знаю, почему эта проблема происходит. По какой-то причине ошибка возникает, если выбрано несколько листов. Решение... Чтобы выбрать один лист перед добавлением комментариев с someSheet.Select
. В конце макроса при необходимости можно попытаться снова выбрать все ранее выбранные листы.
что я понимаю-благодаря комментарию Yoweks-это: Вы просматриваете все выбранные листы, что-то проверяете, устанавливаете комментарии (давая вам проблемы, потому что он не работает с более чем одним выбранным листом) и хотите, чтобы ранее выбранные листы были выбраны впоследствии.
вы можете сохранить ранее выбранный лист в переменной, выбрать один из них, запустить код, а затем снова выбрать все ранее выбранные листы. Пожалуйста, попробуйте следующее код:
Sub Comments()
Dim WsArr As Sheets, WS As Worksheet, ColIdx As Long
ColIdx = 7
Set WsArr = ActiveWorkbook.Windows(1).SelectedSheets
WsArr(1).Select
For Each WS In WsArr
'*** your logic
Set Rng = WS.Cells(1, ColIdx)
If Rng.Comment Is Nothing Then
Rng.AddComment "In Standard Report this crash starts to deploy from " & CStr(amplitude) & " amplitude"
Else
Rng.Comment.Text "Changed T"
End If
Next WS
WsArr.Select
End Sub
вы можете добавить примечания к отдельные ячейки С помощью комментариев
вы можете увидеть на вкладке "Обзор" в Excel, что при выборе нескольких листов вы не можете создать комментарий. Я предполагаю, что это связано с внутренними элементами Excel, определяющими, какая ячейка должна иметь комментарий, назначенный ей.
вот функция, которую вы можете вызвать, чтобы назначить комментарий данная ячейка, даже если выбрано несколько листов.
этот подраздел также устраняет необходимость проверки, если комментарий уже существует, просто передайте новый комментарий в ячейку, которая уже имеет один.
Sub UpdateComment(Rng As Range, Cmnt As String)
Application.ScreenUpdating = False
' Get currently selected sheets
Dim mySheets As Sheets: Set mySheets = ThisWorkbook.Windows(1).SelectedSheets
' Set current selection to just one sheet: this is where error is avoided
ThisWorkbook.Sheets(1).Select
' Set Comment, new if doesn't exist or changed if it does
If Rng.Comment Is Nothing Then
Rng.AddComment Cmnt
Else
Rng.Comment.Text Cmnt
End If
' Tidy up: re-select sheets & enable screen updating
mySheets.Select
Application.ScreenUpdating = True
End Sub
используйте его так в своем коде:
' ... your previous code
Set rng = selectedSheet.Cells(1, columnIndex)
UpdateComment rng, "In standard report this crash starts to deploy from ..."
петля по всем выбранным листам
Dim sh As Worksheet
For Each sh In ThisWorkbook.Windows(1).SelectedSheets
Set rng = sh.Cells(1, columnIndex)
UpdateComment rng, "In standard report this crash starts to deploy from ..."
Next sh
у меня была та же проблема, пытаясь заставить функцию комментариев работать, поэтому вместо того, чтобы пытаться понять ее по сценарию, я решил сделать общий; вызов по мере необходимости.
Sub General_Functions_Comments(InCell As Range, TxtComment As String, Optional IsMergedAnalyzed As Boolean)
Dim IsComment As Comment
Dim RangeFixedMerged As Range
If InCell.MergeCells = False Or IsMergedAnalyzed = True Then ' 3. If InCell.MergeCells = False
With InCell
Set IsComment = .Comment
If IsComment Is Nothing Then ' 1. If Iscomment Is Nothing
.AddComment.Text Text:=TxtComment
.Comment.Shape.TextFrame.AutoSize = True
.Comment.Visible = False
Else ' 1. If Iscomment Is Nothing
If InStr(.Comment.Text, TxtComment) Then ' 2. If InStr(.Comment.Text, TxtComment)
Else ' 2. If InStr(.Comment.Text, TxtComment)
.Comment.Text .Comment.Text & Chr(10) & TxtComment
.Comment.Shape.TextFrame.AutoSize = True
.Comment.Visible = False
End If ' 2. If InStr(.Comment.Text, TxtComment)
End If ' 1. If Iscomment Is Nothing
End With
Else ' 3. If InCell.MergeCells = False
Set RangeFixedMerged = InCell.Cells(1, 1)
Call General_Functions_Comments(RangeFixedMerged, TxtComment, True)
Set RangeFixedMerged = Nothing
End If ' 3. If InCell.MergeCells = False
End Sub
в коде
If standardReportFilePath <> "" Then 'not using the Standard Report Evalution algorithm
If VerifyStandardReportFile(selectedSheet.Name, selectedSheet.Cells(1, columnIndex).Value, wbk, amplitude, missingCrashes) = True Then
selectedSheet.Cells(1, columnIndex).Interior.ColorIndex = 36 ' color the crash cell with yellow
Set Rng = selectedSheet.Cells(1, columnIndex)
If Rng.Comment Is Nothing Then
Call General_Functions_Comments(Rng, "In Standard Report this crash starts to deploy from " & CStr(amplitude) & " amplitude", True)
Else: Call General_Functions_Comments(Rng, "In Standard Report this crash starts to deploy from " & CStr(amplitude) & " amplitude", True)
End If
End If
End If
End If
End If
* в стороне вопрос, зачем устанавливать if, else заявление, если оба будут делать то же самое?
Я помню вообще похожий случай (я не мог что-то сделать из кода), изо всех сил пытался его решить и, наконец, нашел это...
обратите внимание, что если у вас выбрано несколько листов, кнопка "новый комментарий" на ленте -неактивные, так что вы просто не можете сделать это из кода, если вы не можете сделать это вручную.
Почему? - не спрашивай меня. Я вижу хороший обходной путь выше, который кажется единственным способом достичь того, что вам нужно.