Excel función HOY() no volatil

02/11/2006 - 20:35 por Pablo Fdez. | Informe spam
Hola a todos.
Estoy empleando una macro de KL para fijar una fecha en una columna cuando
se aporta un dato en otra columna.
Ejemplo:

Col A Col B
dato 1 Fecha
dato 2 Fecha
dato 3 Fecha

La fecha de filas anteriores no debe cambiar cuando se aportan nuevos
datos.Todo funciona correctamente cuando el dato se aporta manualmente
pero cuando se arrastra y autorellenan las filas posteriores ( Col
A). la fecha del dato que se arrastra tambien cambia. ¿ como se puede
evitar esto?
Los datos de la Col A son números correlativos y se autorellenan en
diferentes momentos del día.

Este es el código

'Inicio codigo--
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, c As Range
On Error Resume Next
Set rng = Intersect(Target, [A:A])
On Error GoTo 0
If rng Is Nothing Then Exit Sub
For Each c In rng
c.Offset(, 1) = Now
' sustituye "Now" por "Date" si solo quieres la fecha
Next c
[B:B].EntireColumn.AutoFit
End Sub
'Fin codigo--

Saludos
Pablo Fdez.

Preguntas similare

Leer las respuestas

#6 Pablo Fdez.
04/11/2006 - 03:36 | Informe spam
"Héctor Miguel" wrote:

hola, Pablo !

> Entiendo que solo me queda "capar" el Auto-relleno o condicionar el evento change
> puedes adelantarme un modo de hacerlo?
> En caso de introducir los datos -uno a uno- necesito un aviso (quizas un MsgBox)
> que indique si el dato introducido no es correlativo al anterior (los incrementos son =1)

1) si la columna 'A' tiene el [unico ?] objetivo de una numeracion correlativa/consecutiva/...
y si en la columna 'B' se pone la fecha para identificar 'cuando' se dio una entrada de datos 'reales'...

2) podriamos suponer/asumir/... que los datos 'reales' se dan de entrada en las columnas 'C' y posteriores -?-

3) cual seria el sentido de 'atrapar' una fecha en la columna 'B' por el solo hecho de auto-rellenar la numeracion en 'A' -?-
o... existe la posibilidad de que numeraciones correlativas YA ENTRADAS [en la columna 'A'] pudieran ser... 'modificadas' -?-

[creo que] con un poco mas de detalles de cual es la situacion 'real' que tratas de 'controlar'...
podrian surgir otro tipo de propuestas -?-

comentas [si hubiera] algun otro dato 'relevante' ?
saludos,
hector.

Hola Hector.


Te expongo un caso real.
En un proceso productivo se debe registar el nº de lote (columna A) en el
momento que sale de la cadena de producción -Fecha y hora- ( columna B) y su
aceptación -Si o No- (columna C). Tambien se debe comprobar si los lotes
tienen algún salto en su numeración.
Se debe conocer la Fecha y hora que el nº de lote y su aceptación se realiza.
La fecha (B) debe permanecer inalterable una vez introducido el nº de lote
(A).
Como los nº de lote son consecutivos es sencillo arrastrar y rellenar desde
el primero de la serie (ejemplo A1) con lo que todos ellos tendrian la misma
hora, que es lo que se pretende evitar.

Los nº de lote ya entrados se pueden modificar pero tomarán la nueva fecha.

Al fin lo que pretendo es asegurar que cada lote tiene su validación
asignada en el momento correcto.

Hasta ahora el proceso es manual ( boligrafo y formulario ) y no asegura la
exactitud ni rigor de la correlación entre lote y fecha.


Espero haber clarificado algo mas sobre el tema.

Salu2
Pablo Fdez.

Respuesta Responder a este mensaje
#7 Héctor Miguel
04/11/2006 - 03:59 | Informe spam
hola, Pablo !

Te expongo un caso real.
En un proceso productivo se debe registar el nº de lote (columna A) en el momento que sale de la cadena de produccion
-Fecha y hora- (columna B) y su aceptacion -Si o No- (columna C).
Tambien se debe comprobar si los lotes tienen algun salto en su numeracion.
Se debe conocer la Fecha y hora que el nº de lote y su aceptacion se realiza.
La fecha (B) debe permanecer inalterable una vez introducido el nº de lote (A).
Como los nº de lote son consecutivos es sencillo arrastrar y rellenar desde el primero de la serie (ejemplo A1)
con lo que todos ellos tendrian la misma hora, que es lo que se pretende evitar.
Los nº de lote ya entrados se pueden modificar pero tomaran la nueva fecha.
Al fin lo que pretendo es asegurar que cada lote tiene su validacion asignada en el momento correcto.
Hasta ahora el proceso es manual (boligrafo y formulario) y no asegura la exactitud ni rigor de la correlacion entre lote y fecha.
Espero haber clarificado algo mas sobre el tema.



1) si te parece 'apropiado' que la 'validacion' de la fecha [columna 'B'] el codigo 'la ponga' [sola y exclusivamente]...
-> cuando se de entrada a la validacion [si o no] en la columna 'C'
y asumiendo que no van a 'validar' dos o mas productos simultaneamente [sino uno por uno]...

2) prueba con las siguientes adaptaciones al codigo 'original'... [en el modulo de codigo de 'esa' hoja]:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub ' solo cuando se modifiquen celdas 'de a una por una'
If Target.Column <> 3 Then Exit Sub ' solo cuando la celda modificada sea de la columna C'
If Target.Row = 1 Then Exit Sub ' solo cuando la fila de la columna C sea posterior a la fila 1
Target.Offset(, -1) = Now ' ponemos fecha y hora en la columna 'B' de la fila modificada
Target.Offset(, -1).EntireColumn.AutoFit ' ajustamos el ancho de la columna B
End Sub

si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#8 Pablo Fdez.
04/11/2006 - 05:00 | Informe spam
"Héctor Miguel" wrote:

hola, Pablo !

> Te expongo un caso real.
> En un proceso productivo se debe registar el nº de lote (columna A) en el momento que sale de la cadena de produccion
> -Fecha y hora- (columna B) y su aceptacion -Si o No- (columna C).
> Tambien se debe comprobar si los lotes tienen algun salto en su numeracion.
> Se debe conocer la Fecha y hora que el nº de lote y su aceptacion se realiza.
> La fecha (B) debe permanecer inalterable una vez introducido el nº de lote (A).
> Como los nº de lote son consecutivos es sencillo arrastrar y rellenar desde el primero de la serie (ejemplo A1)
> con lo que todos ellos tendrian la misma hora, que es lo que se pretende evitar.
> Los nº de lote ya entrados se pueden modificar pero tomaran la nueva fecha.
> Al fin lo que pretendo es asegurar que cada lote tiene su validacion asignada en el momento correcto.
> Hasta ahora el proceso es manual (boligrafo y formulario) y no asegura la exactitud ni rigor de la correlacion entre lote y fecha.
> Espero haber clarificado algo mas sobre el tema.

1) si te parece 'apropiado' que la 'validacion' de la fecha [columna 'B'] el codigo 'la ponga' [sola y exclusivamente]...
-> cuando se de entrada a la validacion [si o no] en la columna 'C'
y asumiendo que no van a 'validar' dos o mas productos simultaneamente [sino uno por uno]...

2) prueba con las siguientes adaptaciones al codigo 'original'... [en el modulo de codigo de 'esa' hoja]:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub ' solo cuando se modifiquen celdas 'de a una por una'
If Target.Column <> 3 Then Exit Sub ' solo cuando la celda modificada sea de la columna C'
If Target.Row = 1 Then Exit Sub ' solo cuando la fila de la columna C sea posterior a la fila 1
Target.Offset(, -1) = Now ' ponemos fecha y hora en la columna 'B' de la fila modificada
Target.Offset(, -1).EntireColumn.AutoFit ' ajustamos el ancho de la columna B
End Sub

si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.

Bueno esto ya va tomando una forma adecuada, gracias.


Ahora un paso mas... Este código sirve para 3 columnas (A, B y C), ¿como se
adaptaria el codigo para repetirlo en columnas (D, E y F) y (G, H e I) de la
misma hoja? ¿ Como proteger las columnas B, E y H ( Fecha ) de alteraciones
manuales?

Salu2
Pablo Fdez.

Respuesta Responder a este mensaje
#9 Héctor Miguel
04/11/2006 - 05:41 | Informe spam
hola, Pablo !

__ 1 __
Este codigo sirve para 3 columnas (A, B y C)
como se adaptaria el codigo para repetirlo en columnas (D, E y F) y (G, H e I) de la misma hoja?


__ 2 __
Como proteger las columnas B, E y H (Fecha) de alteraciones manuales?



1) prueba las siguientes modificaciones:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub ' solo cuando se modifiquen celdas 'de a una por una'
If Target.Row = 1 Then Exit Sub ' solo cuando la fila de la columna C sea posterior a la fila 1
Select Case Target.Column ' revisamos cual es la columna que se ha modificado
Case 2, 5, 8 ' si se trata de las columnas 2/5/8 [B/E/H] ...
Target.Offset(, -1) = Now ' ponemos fecha y hora en la columna 'anterior' a la de la fila modificada
Target.Offset(, -1).EntireColumn.AutoFit ' ajustamos el ancho de la columna 'apropiada'
End Select
End Sub

2) opciones:
a) proteger la hoja y permitir que por codigo SI se puedan modificar las celdas 'bloqueadas'
b) impedir en el evento '_selectionchange' que el usuario seleccione de las columnas 'protegidas'
c) comentar que otros -posibles- 'imponderables' esperarias de parte del usuario -???-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#10 Pablo Fdez.
04/11/2006 - 06:36 | Informe spam
"Héctor Miguel" wrote:

hola, Pablo !

__ 1 __
> Este codigo sirve para 3 columnas (A, B y C)
> como se adaptaria el codigo para repetirlo en columnas (D, E y F) y (G, H e I) de la misma hoja?
__ 2 __
> Como proteger las columnas B, E y H (Fecha) de alteraciones manuales?

1) prueba las siguientes modificaciones:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub ' solo cuando se modifiquen celdas 'de a una por una'
If Target.Row = 1 Then Exit Sub ' solo cuando la fila de la columna C sea posterior a la fila 1
Select Case Target.Column ' revisamos cual es la columna que se ha modificado
Case 2, 5, 8 ' si se trata de las columnas 2/5/8 [B/E/H] ...
Target.Offset(, -1) = Now ' ponemos fecha y hora en la columna 'anterior' a la de la fila modificada
Target.Offset(, -1).EntireColumn.AutoFit ' ajustamos el ancho de la columna 'apropiada'
End Select
End Sub

2) opciones:
a) proteger la hoja y permitir que por codigo SI se puedan modificar las celdas 'bloqueadas'
b) impedir en el evento '_selectionchange' que el usuario seleccione de las columnas 'protegidas'
c) comentar que otros -posibles- 'imponderables' esperarias de parte del usuario -???-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

La opción a) es la mas lógica, el supervisor podría modificar las celdas bloqueadas.


De cualquier modo me gustaria ver un ejemplo de las dos o ambas opciones
juntas para evaluar.. y por supuesto aprender.
No se me ocurren mas restricciones al usuario.

Salu2
Pablo Fdez.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida