excel-vba - valor - seleccionar hoja excel vba
AddComment en varias hojas vba Excel (5)
De la documentación de Excel
Puede agregar notas a celdas individuales mediante el uso de comentarios
Puede ver en la pestaña ''Revisar'' de Excel que, cuando selecciona varias hojas, no puede crear un comentario. Supongo que esto tiene que ver con las partes internas de Excel que determinan qué celda debe tener un comentario asignado.
Aquí hay una función a la que puede llamar para asignar un comentario a una celda determinada, incluso si tiene varias hojas seleccionadas.
Este submarino también elimina la necesidad de probar si ya existe un comentario , simplemente pasa un nuevo comentario a una celda que ya tiene uno.
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
Úselo así en su código:
'' ... your previous code
Set rng = selectedSheet.Cells(1, columnIndex)
UpdateComment rng, "In standard report this crash starts to deploy from ..."
Para recorrer todas las hojas seleccionadas
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
La sintaxis AddComment funciona en la primera hoja seleccionada en el libro de trabajo, pero para la siguiente me da este error: Error 1004 "Error definido por la aplicación o definido por el objeto". No sé por qué se bloquea si se seleccionaron varias hojas y funciona solo para la primera seleccionada. ¿Alguien tiene alguna idea?
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
Un conjunto alternativo de código que muestra el problema. (Ejecuta esto con tres hojas de trabajo en blanco en un nuevo libro de trabajo):
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
Encontré una solución, pero todavía no sé por qué ocurre este problema. Por alguna razón, el error ocurre cuando tiene más de una hoja de trabajo seleccionada. La solución es ... Seleccionar una hoja antes de agregar comentarios con someSheet.Select
. Al final de la macro, puede intentar seleccionar todas las hojas seleccionadas previamente de ser necesario.
Lo que sí entiendo, gracias al comentario de Yoweks, es: estás recorriendo todas las hojas seleccionadas, verificando algo, estableciendo comentarios (lo que te da los problemas, porque no funciona con más de una hoja seleccionada) y quieres la opción previamente seleccionada hojas que se seleccionarán después.
Puede guardar la hoja previamente seleccionada en una variable, seleccionar una de ellas, ejecutar su código y luego seleccionar de nuevo todas las hojas seleccionadas previamente. Por favor, intente con el siguiente código:
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
Recuerdo caso generalmente similar (no pude hacer algo con el código), tratando de resolverlo y finalmente descubrí que ...
Tenga en cuenta que si tiene varias hojas seleccionadas, el botón "Nuevo comentario" en la cinta está inactivo , por lo que no puede hacerlo desde el código si no puede hacerlo manualmente.
¿Por qué? - No me preguntes. Veo una buena solución anterior, que parece ser la única forma de lograr lo que necesita.
Tuve el mismo problema al intentar hacer funcionar una función de comentarios, así que en lugar de tratar de resolverlo por escenario, decidí hacer una general; llamar según sea necesario.
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
En tu código
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
* Aparte de la pregunta, ¿por qué establecer una declaración if, else si ambas harán lo mismo?