Foros del Web » Soporte técnico » Ofimática »

Problema con los controles

Estas en el tema de Problema con los controles en el foro de Ofimática en Foros del Web. Tengo unos controles para copiar celdas (que muy amablemente me dió 3pies) pero me surgió un problemilla y es que si hago click en el ...
  #1 (permalink)  
Antiguo 21/03/2006, 05:45
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Problema con los controles

Tengo unos controles para copiar celdas (que muy amablemente me dió 3pies) pero me surgió un problemilla y es que si hago click en el control me copia la celda pero si modifico la celda tengo que volver a hacer click en el control, y claro la gente se le puede olvidar volver a ir al control a hacer click. hay alguna forma de que no tenga que hacer click en el control cada vez que modifique algo en esa celda? muchas gracias
  #2 (permalink)  
Antiguo 21/03/2006, 05:59
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
No entiendo muy bien a qué te refieres. ¿Podrías colgar ese fichero, por ejemplo en picatela.com?. La ruta del fichero siempre es: picatela.com/files/tu_archivo

Editado:
---------
Ya he entendido lo que te ocurre. Bájate este fichero, y échale un vistazo. Creo que era lo que buscabas.

En realidad, se podría haber puesto todo dentro del evento Change, de la Hoja1, pero lo he puesto separado, para que veas, que si quitas lo que hay en Hoja1, a la fuerza hay que cliquear en el botón, para que se copie y pegue el contenido de B5.

Salu2

Última edición por 3pies; 21/03/2006 a las 06:27
  #3 (permalink)  
Antiguo 21/03/2006, 06:31
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Por ejemplo yo tengo este código para copiar una fila de celdas:

Private Sub CheckBox1_Click()
Application.ScreenUpdating = False
If CheckBox1.Value = True Then
Range("B16:I16").Select
Selection.Copy

Range("B37:I37").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("B16").Select

Else
Range("B37:I37").Select
Selection.ClearContents
Range("B16").Select

End If
Application.ScreenUpdating = True
End Sub

Con este código copio de B16 a I16 en las celdas B37 a I37, bien yo los controles que tengo son casillas de verificación, entonces cuando hago click en esa casilla (que es el control) pues me realiza la copia. Problema: que puede que alguien rellene las celdas B16 a I16 y haga click en la casilla de verificación pero después de una hora, dice "cachis en vez de ser 1.000€ son 2.000€" entonces modifica la casilla (por ejemplo D16) y cierra el documento de excel porque la casilla de verificación ya la había activado hacía una hora pero claro el código copio lo que había en esas casillas cuando se hizo click en el control, no lo que agregó después. Lo que yo no sé es si existe alguna forma de que haga la copia sin necesidad de hacer click en el botón cada vez que se haga una modificación? espero que me puedas ayudar muchas gracias
  #4 (permalink)  
Antiguo 21/03/2006, 06:33
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Mira mi respuesta anterior, ...la edité justo antes de que pusieras tu último post.

Editado:

Leyendo tu pregunta, ...hay un aspecto, un poco complicado (o al menos, a mí me lo parecía), y es definir en lugar de una sola celda, un rango, para que si se modifica alguna celda del mismo, se ejecute la macro. Después de buscar en la red, y probar varias cosillas, al final he dado con esto (supongo que tienes delante el Ejemplo-1.xls que he colgado en el post anterior):

En el proyecto VBA, Hoja1, pone:
Código:
Sub Worksheet_Change(ByVal Target As Range)
'Miramos si el rango B5, cambia, para llamar al macro "Copiar"
If Target.Row = 5 And Target.Column = 2 Then
    Call Copiar
End If
End Sub
De esa forma, si alguien modifica la celda B5 (fila=5, columna=2), se llama a la macro "Copiar".
En tu caso, quieres que si se modifica una celda del rango comprendido entre B16 e I16, haga lo mismo. En ese caso, cambia lo anterior, por esto otro:
Código:
Sub Worksheet_Change(ByVal Target As Range)
'Miramos si el rango d B6 a I16, cambia, para llamar al macro "Copiar"
'(esto no es mío, ya que lo he sacado después de escarbar un poco en la red):
If Not Intersect(Target, Range("B16:I16")) Is Nothing Then
    Call Copiar
End If
End Sub
Salu2

Última edición por 3pies; 21/03/2006 a las 08:59
  #5 (permalink)  
Antiguo 21/03/2006, 09:25
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
El problema es que en el ejemplo 1 me copia el contenido automáticamente no espera a que yo haga click en el control.
  #6 (permalink)  
Antiguo 21/03/2006, 09:55
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Bueno, efectivamente. Pero en realidad eso es lo que quieres ¿no?. Si cambias un dato, que automáticamente se copie. Por lo cual, el botón del macro (no el macro), podrías quitarlo. Así el usuairo no tiene que interactuar con él.

el problema es que como no sé como tienes construida la hoja, no sé donde solicitas datos al usuario. En el ejemplo que colgué, si metes datos en H1, H2, D4, etc, etc, no hace nada. debes pulsar el botón para que se copien los datos. Si solo tienes ese área donde los usuarios meten datos (el rango de B16 a I16), borra el botón. Cada vez que un usuairo cambien un dato de ese rango, se copiará en propio rango.
  #7 (permalink)  
Antiguo 21/03/2006, 13:25
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Le estado dando vueltas, y bueno cada hoja tiene varias macros, pero por ejemplo de la que te había hablado yo puse lo siguiente (todo ello en el editor de la misma hoja):

Private Sub CheckBox1_Click()
'Ocultamos el proceso, para que no se vean las operaciones
Application.ScreenUpdating = False
'Si el checkbox lo ponemos como true (ON), que haga lo siguiente
If CheckBox1.Value = True Then
'Seleccionamos el rango que queremos copiar
Range("B16:I16").Select
'Lo copiamos
Selection.Copy
'Seleccionamos el rango de destino de la copia
Range("B37:I37").Select
'Lo pegamos
ActiveSheet.Paste
'Desactivamos el área de selección de copia y pegado
Application.CutCopyMode = False
'Nos desplazamos a la celda A1
Range("B16").Select
'Si el checkbox está como false (OFF), que borre el contenido de B1 a B3
Else
'Seleccionamos el rango que queremos borrar
Range("B37:I37").Select
'Borramos el contenido
Selection.ClearContents
'Nos desplazamos a la celda A1
Range("B16").Select
End If
'Mostramos el proceso
Application.ScreenUpdating = True
End Sub

Sub Worksheet_Change(ByVal Target As Range)
'Miramos si el rango d B6 a I16, cambia, para llamar al macro "Copiar"
'(esto no es mío, ya que lo he sacado después de escarbar un poco en la red):
If Not Intersect(Target, Range("B16:I16")) Is Nothing Then
Call CheckBox1_Click
End If
End Sub

Pero no va, puse el codigo de la macro que me va bien. Pero con el nuevo código no a pesar de que llamo a la macro que me afecta si hay algún cambio en esas celdas.
Muchas gracias
  #8 (permalink)  
Antiguo 22/03/2006, 03:07
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Antes de nada, decirte que cuando pegues en un post, código, pon delante del mismo, la etiqueta [_CODE_], y al finalizar el código, pon esto [_/CODE_], pero omitiendo lo que está en rojo (los guiones bajos). De esa forma, el código aparecerá como en este ejemplo, que es mucho más legible, que no intercalado con el resto del texto de la pregunta:
Código:
Aquí iría tu código
En realidad, para lo que quieres hacer, no necesitas el checkbox. El ejemplo aquel que colgué, era para que vieras el funcionamiento al hacer clic en ese control (checkbox), y lo que sucedía, cuando estaba en ON, y cuando estaba en OFF, siempre y cuando cliquearas en él.

Te puedes ahorrar todo eso, porque solo necesitas que cuando alguien inserte un dato, cambie un dato, o borre un dato, del rango comprendido entre B16 e I16, todo ese rango se copie en el rango B37 a I37. Aquí tienes la solución a tu problema (salva el fichero en tu PC). Fíjate además, que cuando se copia y pega, la celda activa vuelve a ser aquella en la que originalmente estábamos, y no se vuelve después de copiar y pegar, a la celda B16, como inicialmente estaba pensado (si se vuelve a B16, es un incordio, porque cada vez que cambias B16, C16, D16, etc, se copia el rango, se pega en el destino, se vuelve a la primera celda del rango copiado, ...un incordio, vamos, ...incordio que ya está solucionado, claro).

Salu2

Última edición por 3pies; 22/03/2006 a las 03:41
  #9 (permalink)  
Antiguo 22/03/2006, 05:04
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
La cuestión es que necesito el checkbox porque solamente se copia cuando alguien activa el checkbox, y una vez activado este cualquier modificación en las celdas origen se refleja en las celdas destino.Por cierto poque pones parte del código en un módulo y otra parte en la hoja? no es lo mismo ponerlo todo en la hoja?
  #10 (permalink)  
Antiguo 22/03/2006, 05:41
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Lo del módulo 1 es del otro día, creo, que estuve haciendo pruebas con la grabadora de macros. Se puede borrar, ya que todo está en la hoja1.

"Amoavé!"... Quieres que cada vez que alguien cliquee sobre ese checkbox, se copie un rango del celdas, en otro lado, ¿verdad?. Vale. Hasta ahí, de acuerdo. Pero, quieres también que cada vez que un usuario cambia un dato de ese rango de origen, se copie de nuevo el rango, en el destino ¿verdad?.

Pues entonces, creo que esto es lo que necesitas. A ver si por fin lo conseguimos...

Salu2
  #11 (permalink)  
Antiguo 22/03/2006, 05:58
Avatar de niconico  
Fecha de Ingreso: enero-2006
Mensajes: 166
Antigüedad: 18 años, 3 meses
Puntos: 0
Perfecto era eso exactamente, muchas gracias por cierto me pasaron una herramienta en excel y tiene bloqueado el editor de visual, yo intenté bloquear el mío pero sólo puedo bloquear las celdas o el libro, no sabrás por casualidad como se bloquea el editor de visual?
  #12 (permalink)  
Antiguo 22/03/2006, 06:06
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
posible mejora

No quería meterme ya que considero que 3pies tiene muy buenos consejos y controla bastante más que yo de excel, pero estaba interesado en el tema y he visto que no terminabais de dar con la solución. He probado lo que comenta 3pies y sino me equivoco tampoco será exactamente lo que niconico está buscando. Sin embargo, con alguna modificación estaría hecho. Bueno, para mi aplicación si .

Dim Evita_copia As Boolean

Private Sub CheckBox1_Click()
Evita_copia = False
'Ocultamos el proceso, para que no se vean las operaciones
Application.ScreenUpdating = False
'Creamos la variable "posicion", que contendrá el rango actual donde estamos situados,
'es decir, si estamos en F16, la variable "posicion" contendrá esa celda
posicion = ActiveCell.Address
'Si el checkbox lo ponemos como true (ON), que haga lo siguiente
If CheckBox1.Value = True Then
'Seleccionamos el rango que queremos copiar
Range("B16:I16").Select
'Lo copiamos
Selection.Copy
'Seleccionamos el rango de destino de la copia
Range("B37:I37").Select
'Lo pegamos
ActiveSheet.Paste
'Desactivamos el área de selección de copia y pegado
Application.CutCopyMode = False
'Nos desplazamos a la celda de origen, es decir, allí donde
'estábamos inicialmente (por eso hemos guardado en "posicion", la celda)
Range(posicion).Select
'Si el checkbox está como false (OFF), que borre el contenido de B1 a B3
Else
Evita_copia = True
'Seleccionamos el rango que queremos borrar
Range("B37:I37").Select
'Borramos el contenido
Selection.ClearContents
'Nos desplazamos a la celda de origen, es decir, allí donde
'estábamos inicialmente (por eso hemos guardado en "posicion", la celda)
Range(posicion).Select
End If
'Mostramos el proceso
Application.ScreenUpdating = True
End Sub

Sub Worksheet_Change(ByVal Target As Range)
'Miramos si el rango de B6 a I16, cambia, para llamar al evento Click del CheckBox1
'(esto no es mío, ya que lo he sacado después de escarbar un poco en la red):
If Not Intersect(Target, Range("B16:I16")) Is Nothing And Not Evita_copia Then
'Ocultamos el proceso, para que no se vean las operaciones
Application.ScreenUpdating = False
'Creamos la variable "posicion", que contendrá el rango actual donde estamos situados,
'es decir, si estamos en F16, la variable "posicion" contendrá esa celda
posicion = ActiveCell.Address
'Seleccionamos el rango que queremos copiar
Range("B16:I16").Select
'Lo copiamos
Selection.Copy
'Seleccionamos el rango de destino de la copia
Range("B37:I37").Select
'Lo pegamos
ActiveSheet.Paste
'Nos desplazamos a la celda de origen, es decir, allí donde
'estábamos inicialmente (por eso hemos guardado en "posicion", la celda)
Range(posicion).Select
'Desactivamos el área de selección de copia y pegado
Application.CutCopyMode = False
'Mostramos el proceso
Application.ScreenUpdating = True
End If
End Sub

he añadido lo que está en rojo al código de 3pies para evitar que cuando no esté el tic activo te ejecute la copia de los datos, que según he leido también te interesaba, ¿no?.
Espero que sea esto lo que necesitas.
Un saludo
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #13 (permalink)  
Antiguo 22/03/2006, 06:21
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Cita:
Iniciado por potypoty
No quería meterme ya que considero que 3pies tiene muy buenos consejos y controla bastante más que yo de excel, pero estaba interesado en el tema y he visto que no terminabais de dar con la solución.
Mentira, tú controlas más que yo, segurísimo. Hace mucho tiempo que no me pongo a hacer cosillas con Excel.

Por lo demás, comentarte que es muy buena la observación que haces. Con eso queda demostrado lo que comentaba en mi párrafo anterior

Salu2
  #14 (permalink)  
Antiguo 22/03/2006, 06:30
 
Fecha de Ingreso: noviembre-2005
Mensajes: 170
Antigüedad: 18 años, 5 meses
Puntos: 1
agradecido

te agradezco mucho el cumplido , pero lo único que demuestra el párrafo anterior es que yo he tenido problemas distintos a los tuyos y les he puesto unos parches, que a veces son un poco chapuceros . He aprendido Excel y VBA casi totalmente por mi cuenta y no en demasiado tiempo y por ello desconozco muchas funciones que seguro que hacen las cosas más fáciles y que por lo que he visto tú ya has utilizado.

Dejémoslo en que ambos sabemos suficiente de excel y VBA como para poder ayudar a otros , a nuestra manera.
__________________
El sabio no dice nunca todo lo que piensa,
pero siempre piensa todo lo que dice.
Aristóteles :pensando:
  #15 (permalink)  
Antiguo 22/03/2006, 06:37
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Además demuestras buenas maneras, porque siempre declaras las variables, ...no como yo, que soy un poco perro.

Bueno, la verdad es que hay veces que cuando la cosa es complicada, solicito la ayuda de google, como por ejemplo, para lo del tema:
Código:
'(esto no es mío, ya que lo he sacado después de escarbar un poco en la red):
If Not Intersect(Target, Range("B16:I16")) Is Nothing And Not Evita_copia Then
Yo también he tenido que aprender de forma autodidacta, a base de "prueba-error".

Salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:31.