[Excel] Archivado de una línea de datos.
Hola,
Me gustaría poder archivar líneas de datos que contengan fechas y horas entre las columnas "J" y "V" de mi tabla en la hoja "A" (compuesta por las columnas de "A" a "AH").
La condición que desencadena el archivado es que haya una hora inscrita en la columna "U".
El archivado debe realizarse en la hoja "B", cada línea archivada debe inscribirse una debajo de la otra a partir de la celda "A5".
Conozco bastante bien Excel, pero desgraciadamente no su sistema de programación. ¿Podrías ayudarme, por favor?
Gracias,
Alain
Me gustaría poder archivar líneas de datos que contengan fechas y horas entre las columnas "J" y "V" de mi tabla en la hoja "A" (compuesta por las columnas de "A" a "AH").
La condición que desencadena el archivado es que haya una hora inscrita en la columna "U".
El archivado debe realizarse en la hoja "B", cada línea archivada debe inscribirse una debajo de la otra a partir de la celda "A5".
Conozco bastante bien Excel, pero desgraciadamente no su sistema de programación. ¿Podrías ayudarme, por favor?
Gracias,
Alain
15 respuestas
-
JvDoHola,
debe ser muy claro para ti, pero al leerte no sé si quieres recuperar filas o celdas (entre J y V) y tal vez solo aquellas que son fechas u horas.
En cuanto a tu columna U, que es la que identifica las zonas a archivar, ¿cuál es la hora criterio?
Último punto, ¿una zona archivada puede ser archivada nuevamente?
Si no, ¿cómo las diferencias?
Lo más sencillo para todos es que subas un ejemplo de tus datos en el sitio Cjoint.
Atentamente -
Usuario anónimore :
en todos los casos, me parece imperativo fijar una columna índice
que siempre tendrá un valor distinto, como un número que se incre-
mente automáticamente.
para simplificar el trabajo, como ejemplo podría añadir una nueva
columna [ a - aj ], y anotaría el número de línea del archivo.
Es decir, que en el momento de escribir el archivo en la hoja de archivo,
también se guardaría el número de línea de la hoja de archivo
en la hoja de origen que daría la dirección en caso de actualización
del archivo "sobrescribir".
¿le parece aceptable esta solución?
Lupin -
Usuario anónimoHola,
¡Efectivamente, falta mucha información!
Suponiendo:
que el nombre de la hoja A es [ HojaA ]
que el nombre de la hoja B es [ HojaB ]
que un registro está compuesto por las columnas A a AH
que los datos del registro están situados entre J y V
que la celda de partida para el archivo es A5
que la columna [ J ] nunca está vacía
que la columna [ U ] posee un formato hora estándar [ hh:mm:ss ]
que una vez archivados los datos, la fila completa de la hoja A será destruida
un ejemplo de código a colocar detrás de la hoja A:
Option Explicit ' Const HojaTrab = "HojaA" Const HojaArch = "HojaB" ' Private Sub Worksheet_Change(ByVal Target As Range) Dim Region As Range, Rango As String, Posicion As Long, Tiempo As Date ' No muestra el procesamiento Application.ScreenUpdating = False ' Encuentra la última línea Posicion = Range("J2:J65535").End(xlDown).Row ' Busca intersección válida Set Region = Application.Intersect(Range("U1:U" & Posicion), Target) If Region Is Nothing Then 'MsgBox "El objetivo no está en el rango deseado." Else ' MsgBox "El objetivo está en el rango deseado." ' Si el tiempo es mayor a 8 horas Tiempo = Target.Value If (Tiempo > "08:00:00") Then ' Desactiva evento Application.EnableEvents = False ' Define rango a copiar Rango = "J" & Target.Row & ":V" & Target.Row ' Selecciona el rango a copiar Range(Rango).Select ' Con la selección With Selection ' Coloca en el portapapeles .Copy ' Llama a función CopiarHaciaArchivo End With ' Desactiva el copiar/pegar Application.CutCopyMode = False ' Selecciona la celda deseada Target.Select ' Destruye la fila que ha sido archivada Target.EntireRow.Delete ' Reactiva los eventos Application.EnableEvents = True End If End If ' Actualiza la visualización activada Application.ScreenUpdating = True End Sub ' Function CopiarHaciaArchivo() ' Rango [ J , V ] en rango [ A , AH ] ' Disparador según condición hora, columna [ U ] ' Caso de partida de almacenamiento Hoja B [ A5 ] Dim Rango As String, Posicion As Long ' Define la primera línea libre Posicion = Sheets(HojaArch).Range("A5:A65535").End(xlDown).Row + 1 Rango = "A" & Posicion ' Copia los datos en la línea Sheets(HojaArch).Range(Rango).PasteSpecial Rango = "A" & (Posicion + 1) ' Selecciona la siguiente celda Sheets(HojaArch).Select ActiveSheet.Range(Rango).Select ' Vuelve a la HojaA Sheets(HojaTrab).Select End Function '
Este código funciona en mi entorno, ¡ten cuidado!
Lupin-
Alain3 AutorHola,
No viendo cómo enviarles una copia del programa, intentaré aclararles mis intenciones.
El verdadero nombre de la hoja "A" es "HKM GMN".
El verdadero nombre de la hoja "B" es "Archivage".
Las filas de la tabla en su totalidad se extienden bien entre "A" y "AH".
Los datos a archivar están bien comprendidos entre "J" y "V".
La celda de inicio de la hoja "Archivage" es "A5".
La columna "J" nunca está vacía.
La columna "U" que activa el archivo es efectivamente una hora "hh:mm".
Una vez realizado el archivo, los datos de la hoja "HKM GMN" no deben ser eliminados, sino solo copiados.
Aquí hay un pequeño ejemplo de datos entre las columnas "J" y "V":
44536 10-10 23:52 10-10 23:45 9 8 -00:07 11-10 00:11 11-10 01:39 + 00:28.
Explicaciones:
44536 = n° de tren.
10-10 = fecha teórica de llegada.
23:52 = hora teórica de llegada.
10-10 = fecha real de llegada.
23:45 = hora real de llegada.
9 = código de retraso.
8 = idem.
-00:07 = diferencia entre llegada teórica y llegada real, una fórmula ocupa este dato y también debe ser copiada.
11-10 = fecha teórica de salida.
00:11 = hora teórica de salida.
11-10 = fecha real de salida.
01:39 = hora real de salida.
+ 00:28 = diferencia entre salida teórica y salida real, una fórmula ocupa este dato y también debe ser copiada.
Con la esperanza de haber resuelto sus incertidumbres, quedo a su disposición para más información.
Cordialmente,
Alain.
-
-
Usuario anónimoHola,
Falta una información:
como mencionó JvDo:
... ¿puede una zona archivada ser archivada nuevamente?
Si no, ¿cómo las diferencias?
cito:
... Una vez realizada la archivación, los datos de la hoja "HKM GMN" no deben ser eliminados, sino solo copiados.
¿Existe una columna que permita saber si ha habido archivado?
Lupin-
Alain3 AutorHola,
¡Y gracias por su paciencia!
Sería bueno, efectivamente, poder re-archivar zonas de datos para corregir posibles errores.
No existe una columna prevista para marcar el archivado, pero puedo intercalar fácilmente una entre las columnas "V" y "W" de la página "HKM GMN", es decir, fuera de la zona de archivado. La aparición de una letra "A" en esta columna para marcar el archivado debería ser suficiente. Por supuesto, el re-archivado debe "sobrescribir" la antigua fila errónea en la hoja "archivo".
La tabla de la página "HKM GMN" se extenderá entonces desde la columna "A" hasta "AI". La zona a archivar permanece sin cambios.
Hasta pronto y gracias de nuevo.
Alain
-
-
Usuario anónimoHola,
¡estás agregando otra condición que lo cambia todo!
Cito:
Por supuesto, el rearchivamiento debe "sobrescribir" la antigua línea errónea en la hoja "archivo".
---------------
Considerando que la primera especificación es archivar a partir de A5, ahora hay que localizar el archivo para reescribir.
Por lo tanto, se necesita un campo clave, especificar una columna no vacía
y siempre distinta (valores diferentes) que servirá de
"clave primaria" para las 2 hojas.
Esto facilitará la consulta para localizar el archivo, podrá ser
codificada (modificada) al inicio del programa.
Lupin-
Alain3 AutorHola,
He recibido bien su último mensaje, bastante técnico, ¡no entiendo todas las sutilezas! Lo importante es que ustedes sepan de qué se trata. No imaginaba que mi última solicitud iba a alterar toda la programación. Simplemente intentaba responder a su mensaje anterior.
Hagan lo que consideren mejor...
Estoy a su disposición para cualquier especificación complementaria.
Alain3.
-
-
Usuario anónimoHola,
Entonces esto es lo que da :
El código a colocar detrás de la hoja :
Opción Explícita ' Const Cod_Archivo = "A" Const HojaTrabajo = "HKM GMN" Const HojaArch = "Archivado" ' Private Sub Worksheet_Cambio(ByVal Target As Range) Dim Región As Range, Posición As Long, Tiempo As Date Dim Dirección As String, Rango As String, NbrArc As Long Dim Valor As Variant Aplicación.ActualizaciónDePantalla = False Posición = Rango("J2:J65535").Fin(xlAbajo).Fila Establecer Región = Aplicación.Intersección(Rango("U1:U" & Posición), Target) Si Región Es Nada Entonces 'MsgBox "El objetivo no está en el rango deseado." Sino 'MsgBox "El objetivo está en el rango deseado." Tiempo = Target.Value Si (Tiempo > "08:00:00") Entonces Valor = Rango("Ai" & Target.Fila).Valor Valor = Mid(Valor, (Len(Cod_Archivo) + 1)) Valor = Val(Valor) Si (Valor > 0) Entonces Valor = Rango("AJ" & Target.Fila).Valor Sino Valor = 0 Fin Si Aplicación.HabilitarEventos = Falso Rango = "J" & Target.Fila & ":V" & Target.Fila Rango(Rango).Seleccionar Con Selección .Copiar Dirección = CopiaHaciaArchivo(Valor) Si (Dirección <> "") Entonces Rango("AJ" & Target.Fila).Valor = Dirección Dirección = Mid(Rango("Ai" & Target.Fila).Valor, (Len(Cod_Archivo) + 1)) Si (Dirección <> "") Entonces Rango("Ai" & Target.Fila).Valor = Cod_Archivo & (Dirección + 1) Sino Rango("Ai" & Target.Fila).Valor = Cod_Archivo & "1" Fin Si Sino Rango("AJ" & Target.Fila).Valor = "" Fin Si Fin Con Aplicación.CortarCopiarModo = Falso CeldaActiva.Offset(1, 0).Seleccionar Target.Seleccionar Aplicación.HabilitarEventos = Verdadero Fin Si Fin Si Aplicación.ActualizaciónDePantalla = Verdadero Fin Sub ' Función CopiaHaciaArchivo(ByVal RgTmp As Variant) Como Cadena Dim Rango As String, Posición As Long Posición = Hojas(HojaArch).Rango("A4:A65535").Fin(xlAbajo).Fila + 1 Si (RgTmp = 0) Entonces Rango = "A" & Posición Sino Rango = RgTmp Fin Si Hojas(HojaArch).Rango(Rango).PegarEspecial Rango = "A" & (Posición + 1) Hojas(HojaArch).Seleccionar Rango.Activa Hojas(HojaTrabajo).Seleccionar Si RgTmp = 0 Entonces CopiaHaciaArchivo = "A" & Posición Sino CopiaHaciaArchivo = RgTmp Fin Si Fin Función '
si intentas hacer un copiar pegar en una celda de la columna U, el evento se activa y falla, normal no hay gestión de eventos lo que es muy pesado...
si necesitas detener la macro, tendrás que desactivar los eventos
necesitarás esto para reactivarlos :
Sub ActivaEvento() Aplicación.HabilitarEventos = Verdadero Fin Sub '
y para desactivar la activación de eventos :
Sub DesactivaEvento() Aplicación.HabilitarEventos = Falso Fin Sub '
Columna [ AI ], la letra A codificada en la constante [ Cod_Archivo ]
seguida de un número que indica la cantidad de veces archivado.
Columna [ AJ ], dirección (letra número) de la línea archivada
diviértete :-)
Lupin -
Usuario anónimoHola,
El código debe colocarse detrás de la hoja HKM GMN
a.)
n.b. Valida el nombre de las hojas al inicio del código,
el compilador (intérprete) es sensible a las mayúsculas.
b.)
para copiar y pegar, ten cuidado al saltar de línea en el editor del foro, este debería aparecer en rojo en el editor de VBA.
en el editor de VBA, encontramos una ventana de código a la derecha
y 2 ventanas a la izquierda, la de arriba muestra la lista de objetos
del proyecto. Podemos encontrar 4 tipos de objetos
Hojas (Sheets)
Libro (ThisWorkbook)
Función (Módulo)
Módulo de clase (ClassModule)
hay que localizar el objeto Hoja HKM GMN, hacer doble clic
el editor abrirá entonces la ventana de la derecha en la hoja de código
correspondiente al objeto.
c.)
las dos pequeñas rutinas para activar/desactivar los eventos
deben ser colocadas en un módulo para ser accesibles desde el menú
Excel ->> //Herramientas/Macro/Máquinas...
buena suerte
Lupin-
Alain3 AutorHola,
He colocado el programa detrás de la hoja "HKM GMN".
En el primer intento, no pasó nada con una hora de disparo inferior a las 08:00. Con una hora de disparo superior a las 08:00, el programa responde: error de compilación, error de sintaxis. El programa se cierra después de seleccionar la zona a copiar. He notado en la programación un "close condicional tiempo" "si 08:00 entonces...". ¿Qué pasa con eso?
En el segundo intento, corregí la mayúscula del inicio del programa
y FeuilleArch = "Archivage" se convirtió en FeuilleArch="ARCHIVO" como en el programa. Ahí, el programa ya no se cierra, pero no pasa nada.
Cordialmente,
Alain3
-
-
Usuario anónimore:
esto es lo que hay que entender:
efectivamente, omití modificar el nombre de la hoja de archivo,
mea culpa, ¡todas mis disculpas!
una vez que el programa ha fallado, es casi seguro que los
eventos están desactivados debido a la línea:Application.EnableEvents = False
es necesario reactivar los eventos del libro utilizando la rutina:Sub ActiveEvenement() Application.EnableEvents = True End Sub '
esta debe pegarse en un módulo para ser accesible desde el menú de Excel.
Menú de Excel ->> //Herramientas/Macro/Mácros.../ActiveEvenement
Lupin-
Alain3 AutorBuenas noches,
La macro de reactivación funciona.
Después de haber transformado "Archive" en "ARCHIVE" en la programación, el depurador se detiene en: (Hoja ARCHIVE) como se muestra a continuación y da como código: "error de compilación variable no definida".
El programa se detiene después de la selección del área a copiar.
Function CopiarHaciaARCHIVE(ByVal PlgTmp As Variant) As String
Dim Rango As String, Posición As Long
Posición = Sheets(HojaARCHIVE).Range("A4:A65535").End(xlDown).Row + 1.
Atentamente,
Alain3.
-
-
Usuario anónimore:
entonces, no se deben modificar los nombres de las constantes:
Function CopieVersARCHIVE(ByVal PlgTmp As Variant) As String
Dim Plage As String, Position As Long
Position = Sheets(FeuilleARCHIVE).Range("A4:A65535").End(xlDown).Row + 1.
donde debe permanecer:
Function CopieVersArchive(ByVal PlgTmp As Variant) As String
Dim Plage As String, Position As Long
Position = Sheets(FeuilleArch).Range("A4:A65535").End(xlDown).Row + 1
es más bien en la definición de la constante donde se debe modificar el nombre
de la hoja:
al principio del código, tienes la siguiente expresión:
Const FeuilleTrav = "HKM GMN"
Const FeuilleArch = "Archivage"
'
deberá ser más bien:
Const FeuilleTrav = "HKM GMN"
Const FeuilleArch = "ARCHIVE"
'
Lupin -
Usuario anónimore:
Creo que lo más sencillo será probar mi ejemplo
en su entorno, aquí funciona perfectamente
https://www.oricom.ca/404/
este enlace es solo temporal, lo siento :-(
¿Qué sucede en su caso y si falla, verifique la
versión exacta de Excel!
Excel 2002 10.2614.2625
Verifique las opciones regionales, ¿cuáles son?
De hecho, dirigir una hoja desde otra hoja siempre es
más delicado que hacerlo desde un módulo.
Lupin -
Usuario anónimoHola,
Todo el placer es mío :-)
Sé que si la instrucción:
Sheets(FeuilleArch).Range("A4:A65535").End(xlDown).Row + 1
no funciona bien!
Asegúrate de que de A1 a A5 las celdas estén no vacías en la hoja de archivo y modifica por:
Sheets(FeuilleArch).Range("A1:A65535").End(xlDown).Row + 1
Lupin -
Usuario anónimo
al intentar modificar la línea:
Const FeuilleArch = "Archivage"
por:
Const FeuilleArch = "Archive"
la rutina falló exactamente en el mismo lugar que usted!
Así que volví a establecer el nombre de la constante modificándolo:
Bajo VBE:
//Menú/Edición/Reemplazar
FeuilleArch
Por
FeuilleArchive
Una vez que cambié el nombre de la constante en todo el programa
me aseguro de que el compilador está bien enganchado al nombre de la
constante modificando la mayúscula de una letra:
ej:
de Const FeuilleArchive = ...
modifico
a Const FeuilleArcHive = ...
En el programa el nombre debe seguir automáticamente sin
otras intervenciones.
le ahorro el porqué y el cómo, simplemente sepa
que el compilador (el intérprete) ¡tiene memoria!
Lupin -
titi14200Bonjour,
me gustaría saber si es posible crear una macro para archivar todos los datos de una fila en la que una celda está asignada a una fecha de cita y que esta última haya expirado.
me explico, soy artesano y en el marco de mi trabajo tomo mis citas en excel en una tabla asignando una referencia, un nombre, una dirección y un número de teléfono en cada fila de cita, pero no siempre tengo tiempo para asistir a mi cita y me gustaría que todas mis citas perdidas se registraran en una hoja anexa y así poder retomar una cita con las personas afectadas...
¿Es posible? -
titi14200¿Es posible hacer aparecer la fecha del día en Excel? Porque una simple comparación sé hacer, pero no logro hacerlo a partir de la fecha del día sin tener que ingresarla manualmente.
Gracias por sus respuestas. -
RenéHola,
tengo una tabla con dos hojas y varias columnas.
en la primera hoja tengo una columna para poner una "x"
y me gustaría que en la segunda hoja se agregue
la fila donde he puesto mi "x" sin saltar líneas.
¿cómo puedo hacerlo?
si quieres, puedo enviarte por correo un ejemplo de la tabla.
hasta pronto
René