No logro que una macro me ejecute un evento. ¿Me pueden ayudar?

Estimados expertos:

Una vez más me pongo en contacto con ustedes, espero se compadezcan de mi y me puedan ayudar.

Tengo dos macro:

1) En la Hoja1 la siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B7:B29")) Is Nothing Then
ActiveSheet.Unprotect
Target.Locked = True
ActiveSheet.Protect
End If
End Sub

End Sub

2) En un módulo la siguiente:

Sub Confirmar()
Dim Resp As Byte
Resp = MsgBox("¿Desea bloquear las celdas modificadas al cerrar el libro?", _
vbQuestion + vbYesNo, "EXCELeINFO")
If Resp = vbYes Then
MsgBox "Eligió bloquear. No podrá volver a editarlas", vbExclamation, "EXCELeINFO"
'Aquí se ejecutaría el código
Else
MsgBox "Eligió no bloquear. Podrá editarlas al abrir nuevamente el archivo", vbCritical, "EXCELeINFO"
End If
End Sub

Cuando ejecuto cualquiera de las dos, funcionan correctamente, pero cuando llamo desde un botón de formulario al MsgBox, funciona el Msg, pero no me ejecuta la macro correctamente y por lo tanto me bloquea las celdas aunque le diga que NO.

Podrían ayudarme? Desde ya, muchas gracias

1 respuesta

Respuesta
1

En primer lugar te recomiendo que leas el párrafo titulado: Cómo ejecutar una macro desde la sección Macros de mi sitio.

El evento Change solo se ejecuta si 'cambias' el contenido de una celda manualmente.

Es decir que estás ingresando un dato ... das Enter y allí se ejecuta el evento.

Por lo tanto allí es donde debes 'llamar' a la subrutina.

Ej:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B7:B29")) Is Nothing Then

Dim Resp As Byte
Resp = MsgBox("¿Desea bloquear las celdas modificadas al cerrar el libro?", _
vbQuestion + vbYesNo, "EXCELeINFO")
If Resp = vbYes Then
MsgBox "Eligió bloquear. No podrá volver a editarlas", vbExclamation, "EXCELeINFO"
ActiveSheet.Unprotect
Target.Locked = True
ActiveSheet.Protect
Else
MsgBox "Eligió no bloquear. Podrá editarlas al abrir nuevamente el archivo", vbCritical, "EXCELeINFO"
End If

End if

End Sub

Probala y comentame

Hola Elsa, tenía la esperanza que fueras vos quién me respondiera. Muchas gracias de antemano.

Te cuento que tu libro, ya lo tengo como libro de cabecera, lo leí 20 veces en lo que va de estas dos semanas, pero no logro terminarlo.

Te cuento que no puedo ejecutar la macro que me armaste, por lo siguiente:

Private Sub Worksheet_Change(ByVal Target As Range) es para una Hoja y no para un módulo, por lo tanto como yo quiero ejecutarlo desde un botón que se localice en la página, no tengo manera de que funcione, hice mil pruebas.

Por otro lado, me dí cuenta que la orden de bloquear debe estar relacionada con la respuesta SI y si responde que NO, no debe bloquear la celda y con la que yo te pasé originalmente, desbloquea y bloquea luego de ingresar el dato.

Decime dónde coloco el código y como lo hago.

Muchas gracias nuevamente,

Marisa

Perdona, pero creo que no tenés mi libro sino solo las páginas de la web... el manual tiene + de 200 páginas... aclaro esto para que nadie se confunda pensando de que no podrá resolver esta cuestión leyendo el MANUAL...

Mañana trataré de ocuparme de lo tuyo.

Sdos!

Elsa

Creo que tenés que replantearte tu tarea. Originalmente, la idea era que al tipear un dato (validado) en un grupo de 4 celdas, el resto se tenía que bloquear,.

Por eso se trabajó en su momento con el evento Change de la hoja. Y el rango controlado era desde C2 en grupitos de 4 con un espacio de 2 celdas entremedio.

Ahora... estás intentando bloquear un rango de celdas al presionar un botón, no al introducir un cambio en una celda ... entonces la macro va en el nuevo botón.

Dibujalo, clic derecho, Asignar macro y asignale ésta que ya estará en un módulo:

Sub Confirmar()
Dim Resp As Byte
Resp = MsgBox("¿Desea bloquear las celdas modificadas al cerrar el libro?", _
vbQuestion + vbYesNo, "EXCELeINFO")
If Resp = vbYes Then
MsgBox "Eligió bloquear. No podrá volver a editarlas", vbExclamation, "EXCELeINFO"
Activesheet.Unprotect

range("B7"B29").Locked = True 'AJUSTA TU RANGO
ActiveSheet.Protect
Else
MsgBox "Eligió no bloquear. Podrá editarlas al abrir nuevamente el archivo", vbCritical, "EXCELeINFO"
End If
End Sub

Sdos

Elsa

http://aplicaexcel.galeon.com/manuales.htm

Hola Elsa:

Sabía que no era el libro completo y me gustaría comprarlo, pero veo que hay varias versiones y considerando que no se nada de VBS aconséjame cuál debería comprar, porque ahora quiero aprenderlo, ya es una cuestión de orgullo, jajajaja.

Te cuento que me dá error de compilación y me aclara error de sintaxis y me marca en rojo las letras la siguiente línea: range("B7"B29").Locked = True

Saqué las diéresis del medio y la corregí por range("B7:B29").Locked = True, tampoco funcionó.

Busqué en la ayuda y modifiqué el objeto range por la siguiente sintaxis: Range("B7:B29").Activate y tampoco funcionó.

Funciona perfecto cuando no la quiero bloquear, pero al bloquearla es cuando me dá el error.

Espero puedas ayudarme.

Un beso y muchas gracias.

Marisa

No debiera darte inconvenientes si desproteges la hoja antes.

Pero sería mejor que vea el libro, quizás tu rango tenga algo que no me lo estás indicando o no se desprende de la consulta.

Y allí te amplío lo que comento aquí: que el mejor manual para aprender VBA es el de Programación VBA 2007+ ;)

Sdos!

Hola Elsa, estoy en un sitio dónde la conexión es muy mala y no puedo abrir mi mail para enviarte el archivo. De casualidad y peleando mucho logré abrir este, así que voy a explicarte aquí mi necesidad y paso por Bluetooth el archivo al celular y lo envío a tu mail desde él. No obstante voy a tratar de explicarte lo más detallado posible, tal vez no lo haya hecho correctamente al inicio.

En las planillas hay celdas que están combinadas y posiblemente allí esté haciendo lío.

Vas a ver que el archivo tiene varias planillas, TODAS DEBEN ESTAR BLOQUEADAS, sobre todo las 5 primeras que, como verás corresponden a preguntas que los usuarios deben responder.

Ahora bien, son dos usuarios diferentes los que completan las columnas B y E respectivamente, en dos tiempos. Es decir, el primer usuario recibe la planilla y responderá en la columna B pudiendo modificar solo esa columna por eso la hoja debe estar bloqueada cuando la recibe, pero editables las columnas B y E. Este podrá modificarla cuantas veces quiera, hasta que decida enviarla al 2º usuario y es allí dónde DEBE quedar bloqueada con el objetivo de asegurarse que el 2º usuario no pueda modificar la información de esta columna completada por el 1º usuario.

Cuando el 2º usuario reciba la planilla sólo podrá modificar la columna E que originalmente estaba editable y lo mismo que en el 1º caso este podrá modificar la columna cuantas veces quiera, hasta que decida bloquearla para realizar su informe. Una vez bloqueadas ambas columnas, sólo el administrador (por ahora yo) podrá tener la posibilidad de desbloquear la planilla a través de una contraseña.

Esto sucede de igual forma en las 5 primeras Sheet, en todas se repite la columna B para el 1º usuario pero puede variar la columna para el 2º usuario. El resto de las hojas, se arman solas en función de la carga de estas primeras 5. De hecho hay varias planillas que están ocultas y que llegado el momento se protegerán (por ahora sólo están ocultas) y las 2 últimas planillas también estarán ocultas para estos dos primeros usuarios.

Tal vez el problema es que como no sé nada de VBS me haya complicado bastante en el armado de esta herramienta, pero ahora ya está y sólo me falta esto último.

Ni bien pueda conectarme mañana correctamente cuando vuelva a mi casa hago la transferencia para comprar el libro, por favor enviame los datos a través del mail y el monto final en $ para hacerlo correctamente.

Muchas gracias y espera el archivo por mail.

Un saludo,

Marisa

A mi se me quedaron unas comillas demás, veo que lo ajustaste correctamente cambiando además el rango solo hasta la fila 18 xq luego se presentan rangos combinados que no corresponden a la tabla en sí.

Pero a vos se te perdió el UNprotect... quedando solo en Protect por eso ya no puede bloquear estando protegida.

Te lo estoy enviando a tu correo, espero te llegue... sino cuando regreses al trabajo.

Sdos

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas