excel - registros - macro para insertar filas y copiar datos
El código VBA no mira a través de filas ocultas para agregar una fila con número de seguimiento (3)
Tengo otra pregunta que espero resolver con su ayuda.
¿Qué quiero hacer? Uso Excel para rastrear mi trabajo, actividades, contactos, etcétera. Mientras hacía eso descubrí que estaba haciendo un montón de trabajo repetitivo al agregar filas al final de una hoja llamada "Actividades".
Lo que quiero hacer es esto: - Presione un botón y agregue una fila. - Aumentar el número de seguimiento con 1 - Insertar valores predeterminados
El código. Para automatizar esto, he encontrado (copiado, pegado, ajustado a mis necesidades) el siguiente código:
Sub AddRowActiviteiten_NewAtEnd()
''Add''s a new row at the end of the sheet.
Dim wsActiviteiten As Worksheet
Set wsActiviteiten = Sheets("Activiteiten")
DefType = "Daily"
DefStatus = "Open"
DefIssue = "*****"
DefImpact = "*****"
DefPrio = "Laag"
MyDate = Date
wsActiviteiten.Range("A4").Value = "1"
''Copy the "One Row To Rule Them All"
wsActiviteiten.Range("A3:Q3").Copy
wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteAll)
''Stop the "copy-action"
Application.CutCopyMode = False
''Increase the tracking number with "one"
LastNumber = wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Value
wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = LastNumber + 1
''Insert default values
LastRow = wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(-1, 0).Row
Cells(LastRow + 1, 2) = DefType
Cells(LastRow + 1, 3) = DefStatus
Cells(LastRow + 1, 4) = DefIssue
Cells(LastRow + 1, 5) = DefImpact
Cells(LastRow + 1, 6) = DefPrio
Cells(LastRow + 1, 8) = MyDate
''Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select
End Sub
El problema. En esta hoja, abro nuevos artículos, pero también los cierro. Lo hago al cambiar su estado y ocultarlos de la vista. Y este es el punto donde sale mal. Cuando cierro el último elemento de la lista y quiero agregar una nueva, la macro agrega una nueva fila debajo de la última entrada visible . No encuentra la última entrada que acabo de ocultar. Y también, cuando esto sucede, agregar los valores predeterminados a la nueva fila no funciona. Los agrega a la fila encima del agregado.
De alguna manera esto tiene perfecto sentido. Le digo a la macro que busque la última entrada, pero lo que no entiendo es por qué mira la última entrada visible y por qué no se ve en las filas ocultas.
Para replicar. Copie el código en una hoja (tal vez necesite cambiar el nombre de la hoja) y agregue algunas líneas. Pon algo de información en la última fila y escóndelo. Agregue otras pocas líneas y vea qué sucede.
La solución. ¿Hay una manera de resolver esto? Tal vez hay una manera más inteligente de hacer las cosas? Investigué cosas, pero sobre todo obtuve resultados usando "(" A "y Rows.Count) .End (xlUp)". Un ciclo podría funcionar, pero me temo que 1) No busca a través de filas ocultas y 2) hace que la hoja (algo) sea lenta. Debo decir que he intentado hacer un ciclo, primero quiero ver si mi primera solución es rescatable.
Gracias por su aporte, si hay alguna pregunta, hágamelo saber.
Simon EDIT: código de trabajo para cualquier persona interesada
Sub AddRowActiviteiten_NewAtEnd()
''Add''s a new row at the end of the sheet.
Dim wsActiviteiten As Worksheet
Set wsActiviteiten = Sheets("Activiteiten")
DefType = "Daily"
DefStatus = "Open"
DefIssue = "*****"
DefImpact = "*****"
DefPrio = "Laag"
MyDate = Date
''Copy the One Row To Rule Them All
wsActiviteiten.Range("A3:Q3").Copy
''Offset(y,x)
''De -16 is een getal dat iets doet, maar ik weet niet wat.
wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(1, -16).PasteSpecial (xlPasteAll)
''Stop the "copy-action"
Application.CutCopyMode = False
''Het volgnummer verhogen met 1
''Het laatste getal selecteren (LastNumber) en dan plus 1.
LastNumber = wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(0, -16).Value
wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(1, -16).Value = LastNumber + 1
''Insert default values
LastRow = wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(-1, 0).Row
Cells(LastRow + 1, 2) = DefType
Cells(LastRow + 1, 3) = DefStatus
Cells(LastRow + 1, 4) = DefIssue
Cells(LastRow + 1, 5) = DefImpact
Cells(LastRow + 1, 6) = DefPrio
Cells(LastRow + 1, 8) = MyDate
''Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select
End Sub
Supongamos que tenemos una columna de estado AB y actualmente cerramos un elemento colocando la palabra "Cerrado" en esa columna y luego ocultando la fila.
En lugar:
- Mostrar todas las filas
- Realice las inserciones y ediciones necesarias
- A través de un bucle, oculta todas las filas marcadas como "Cerrado"
Use esto para obtener la última fila y verá la última fila, incluso si está oculta.
LastRow = wsActiviteiten.UsedRange.Rows.Count
Actualizar
Veo que su hoja tiene un autofiltro que "oculta" las filas de estado, que Find
no detecta, a diferencia de las filas ocultas.
Te sugiero que pruebes este código actualizado a continuación:
Sub Test()
Dim rng1 As Range
If ActiveSheet.AutoFilterMode Then
MsgBox ActiveSheet.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Row
Else
Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious)
If Not rng1 Is Nothing Then MsgBox rng1.Row
End If
End Sub
publicación inicial
Si está ocultando filas, puede usar Find
con la opción xlFormulas
para buscar entradas en filas ocultas (a diferencia de xlValues
).
Dim rng1 As Range
Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious)
MsgBox rng1.Address