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

#11 Héctor Miguel
04/11/2006 - 07:54 | Informe spam
hola, Pablo !

La opcion a) es la mas logica, el supervisor podria 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.



te paso una combinacion de codigos que [espero] resultara +/- 'amigable' [solo] para el supervisor :))
la preparacion de la hoja es +/- como sigue:

1) selecciona TODAS las celdas/filas/columnas de la hoja que el usuario SI vaya a tener 'permiso' para modificarlas
ve a [menu] formato / celdas... [o su atajo {ctrl}+1] / [apartado] proteccion y DESMARCA la casilla de 'bloqueada'

2) [el caso contrario]... asegurate de que las celdas/columnas 'prohibidas' SI esten 'MARCADAS' en dicha casilla <= OJO

3) copia/pega los siguientes procedimientos en los modulos de codigo 'indicados'...

a) el modulo de codigo del libro [ThisWorkbook]
Private Sub Workbook_Open()
Worksheets("hoja1").Protect _
PassWord:="aBc", _
UserInterfaceOnly:=True
Bloquear_fechas
End Sub

b) en el modulo de codigo de 'esa' hoja [estoy suponiendo que se trata de la 'hoja1'] -?-
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 3, 6, 9 ' si se trata de las columnas 3/6/9 [C/F/I] ...
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

c) en un modulo de codigo 'general'
Option Private Module
Sub Bloquear_fechas(Optional ByVal Permiso As Boolean)
Worksheets("hoja1").EnableSelection = IIf(Permiso, xlNoRestrictions, xlUnlockedCells)
End Sub
Sub Modificar_fechas()
Bloquear_fechas InputBox("Clave de autorizacion...", "") = "clavE sEcrEta"
End Sub

4) el 'funcionamiento' de estos 'trucos' sera +/- el siguiente:
a) al abrirse el libro se protege y NO se permite seleccionar ninguna de las celdas 'protegidas' [punto 2]
b) las macros del modulo 'general' NO son 'accesibles' para el usuario [el modulo esta declarado como 'Private']
c) quien conozca el nombre de la segunda macro [Modificar_fechas] que se supone sera SOLO el adminstrador...
SI puede activarla/usarla/... desde las opciones de macros [menu: herramiientas / macro / macros... o... {Alt}+[F8} :D
d) cuando necesite SELECCIONAR/modificar/... las celdas de las columnas 'protegidas' solo nececitara proveer la 'clave'
-> clavE sEcrEta [TAL y como la espera el codigo para evaluar que sea la clave 'autorizada'] :))
e) cuando necesite REVERTIR el permiso para modificar las celdas bloqueadas... solo necesita repetir la macro SIN clave ;)
f) si prefieres que NO se 'vea' la clave introducida por el InputBox... sera necesario utilizar un formulario [UserForm] :D

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

hola, Pablo !

> La opcion a) es la mas logica, el supervisor podria 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.

te paso una combinacion de codigos que [espero] resultara +/- 'amigable' [solo] para el supervisor :))
la preparacion de la hoja es +/- como sigue:

1) selecciona TODAS las celdas/filas/columnas de la hoja que el usuario SI vaya a tener 'permiso' para modificarlas
ve a [menu] formato / celdas... [o su atajo {ctrl}+1] / [apartado] proteccion y DESMARCA la casilla de 'bloqueada'

2) [el caso contrario]... asegurate de que las celdas/columnas 'prohibidas' SI esten 'MARCADAS' en dicha casilla <= OJO

3) copia/pega los siguientes procedimientos en los modulos de codigo 'indicados'...

a) el modulo de codigo del libro [ThisWorkbook]
Private Sub Workbook_Open()
Worksheets("hoja1").Protect _
PassWord:="aBc", _
UserInterfaceOnly:=True
Bloquear_fechas
End Sub

b) en el modulo de codigo de 'esa' hoja [estoy suponiendo que se trata de la 'hoja1'] -?-
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 3, 6, 9 ' si se trata de las columnas 3/6/9 [C/F/I] ...
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

c) en un modulo de codigo 'general'
Option Private Module
Sub Bloquear_fechas(Optional ByVal Permiso As Boolean)
Worksheets("hoja1").EnableSelection = IIf(Permiso, xlNoRestrictions, xlUnlockedCells)
End Sub
Sub Modificar_fechas()
Bloquear_fechas InputBox("Clave de autorizacion...", "") = "clavE sEcrEta"
End Sub

4) el 'funcionamiento' de estos 'trucos' sera +/- el siguiente:
a) al abrirse el libro se protege y NO se permite seleccionar ninguna de las celdas 'protegidas' [punto 2]
b) las macros del modulo 'general' NO son 'accesibles' para el usuario [el modulo esta declarado como 'Private']
c) quien conozca el nombre de la segunda macro [Modificar_fechas] que se supone sera SOLO el adminstrador...
SI puede activarla/usarla/... desde las opciones de macros [menu: herramiientas / macro / macros... o... {Alt}+[F8} :D
d) cuando necesite SELECCIONAR/modificar/... las celdas de las columnas 'protegidas' solo nececitara proveer la 'clave'
-> clavE sEcrEta [TAL y como la espera el codigo para evaluar que sea la clave 'autorizada'] :))
e) cuando necesite REVERTIR el permiso para modificar las celdas bloqueadas... solo necesita repetir la macro SIN clave ;)
f) si prefieres que NO se 'vea' la clave introducida por el InputBox... sera necesario utilizar un formulario [UserForm] :D

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

Hola de nuevo Hector


Esto avanza bien.. pero .. se complica.
a) Tras ejecutar la macro Modificar_fechas la clave no deberá ser visible (
no MsgBox) y aun hay que desproteger el libro pues las columnas están
bloqueadas ¿se puede desproteger la hoja automaticamente al teclear la "clavE
sEcrEta" y protegerla de nuevo al revertir el permiso de modificación?
Tambien he observado que solamente seleccionando con doble clik cualquier
celda de la columna de datos, al abandonarla se actualiza la fecha, ¿podemos
eliminar el doble click?
Salu2
Pablo Fdez.

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

Esto avanza bien.. pero .. se complica.
a) Tras ejecutar la macro Modificar_fechas la clave no debera ser visible (no MsgBox)
y aun hay que desproteger el libro pues las columnas estan bloqueadas
se puede desproteger la hoja automaticamente al teclear la "clavE sEcrEta"
y protegerla de nuevo al revertir el permiso de modificacion?
Tambien he observado que solamente seleccionando con doble clik cualquier celda de la columna de datos
al abandonarla se actualiza la fecha, podemos eliminar el doble click?



conserva los codigos en el evento '_change' de la hoja... modifica/agrega/... los siguientes...
corres pruebas... y comentas +/- 'como vamos' ?

saludos,
hector.

1) dise#a un un userform que contenga SOLO un cuadro de texto y las siguientes lineas de codigo...
-> en el modulo de codigo del formulario...
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Or KeyCode = vbKeyEscape Then Unload Me
End Sub
Private Sub UserForm_Terminate()
Respuesta = TextBox1
End Sub

-> IMPORTANTE: en la ventana de las propiedades del control [p.e.] TextBox1
-> establece la propiedad 'PasswordChar' con el caracter que aparecera al introducir datos en el textbox [p.e. el asterisco]
-> una vez entrada la clave [O NO], el supervisor podra 'terminar' con el formulario pulsando ya sea {enter} o {escape}

2) cambia en el modulo de codigo del libro el evento '_open' a lo siguiente...
Private Sub Workbook_Open()
Bloquear_fechas
End Sub

3) copia/pega las siguientes instrucciones en un modulo de codigo general...
Option Private Module
Public Const Clave As String = "clavE sEcrEta" ' <= cambiala por la que necesites :) '
Public Respuesta As String
Sub Bloquear_fechas(Optional ByVal Permiso As Boolean)
With Worksheets("hoja1")
If Permiso Then .UnProtect "aBc": Exit Sub
.Protect _
PassWord:="aBc", _
UserInterfaceOnly:=True
.EnableSelection = xlUnlockedCells
End With
End Sub
Sub Modificar_fechas()
UserForm1.Show
Bloquear_fechas Respuesta = Clave: Respuesta = ""
End Sub

4) AGREGA el siguiente procedimiento en el modulo de codigo de 'esa' hoja...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
Respuesta Responder a este mensaje
#14 Pablo Fdez.
05/11/2006 - 05:51 | Informe spam
"Héctor Miguel" wrote:

hola, Pablo !

> Esto avanza bien.. pero .. se complica.
> a) Tras ejecutar la macro Modificar_fechas la clave no debera ser visible (no MsgBox)
> y aun hay que desproteger el libro pues las columnas estan bloqueadas
> se puede desproteger la hoja automaticamente al teclear la "clavE sEcrEta"
> y protegerla de nuevo al revertir el permiso de modificacion?
> Tambien he observado que solamente seleccionando con doble clik cualquier celda de la columna de datos
> al abandonarla se actualiza la fecha, podemos eliminar el doble click?

conserva los codigos en el evento '_change' de la hoja... modifica/agrega/... los siguientes...
corres pruebas... y comentas +/- 'como vamos' ?

saludos,
hector.

1) dise#a un un userform que contenga SOLO un cuadro de texto y las siguientes lineas de codigo...
-> en el modulo de codigo del formulario...
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Or KeyCode = vbKeyEscape Then Unload Me
End Sub
Private Sub UserForm_Terminate()
Respuesta = TextBox1
End Sub

-> IMPORTANTE: en la ventana de las propiedades del control [p.e.] TextBox1
-> establece la propiedad 'PasswordChar' con el caracter que aparecera al introducir datos en el textbox [p.e. el asterisco]
-> una vez entrada la clave [O NO], el supervisor podra 'terminar' con el formulario pulsando ya sea {enter} o {escape}

2) cambia en el modulo de codigo del libro el evento '_open' a lo siguiente...
Private Sub Workbook_Open()
Bloquear_fechas
End Sub

3) copia/pega las siguientes instrucciones en un modulo de codigo general...
Option Private Module
Public Const Clave As String = "clavE sEcrEta" ' <= cambiala por la que necesites :) '
Public Respuesta As String
Sub Bloquear_fechas(Optional ByVal Permiso As Boolean)
With Worksheets("hoja1")
If Permiso Then .UnProtect "aBc": Exit Sub
.Protect _
PassWord:="aBc", _
UserInterfaceOnly:=True
.EnableSelection = xlUnlockedCells
End With
End Sub
Sub Modificar_fechas()
UserForm1.Show
Bloquear_fechas Respuesta = Clave: Respuesta = ""
End Sub

4) AGREGA el siguiente procedimiento en el modulo de codigo de 'esa' hoja...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub

Gracias Hector, has sido una enorme, y rápida ayuda; estas respuestas solucionan casi totalmente mi problema. Trabajaré sobre el UserForm para darle forma.


Gracias nuevamente
Salu2
Pablo Fdez.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida