| ||||
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 |
| ||||
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 |
| ||||
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:
De esa forma, si alguien modifica la celda B5 (fila=5, columna=2), se llama a la macro "Copiar".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 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:
Salu2 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 Última edición por 3pies; 21/03/2006 a las 08:59 |
| ||||
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. |
| ||||
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 |
| ||||
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:
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.Aquí iría tu código 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 |
| ||||
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? |
| ||||
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 |
| ||||
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? |
| |||
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: |
| ||||
Cita: Mentira, tú controlas más que yo, segurísimo. Hace mucho tiempo que no me pongo a hacer cosillas con Excel.
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. 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 |
| |||
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: |
| ||||
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:
Yo también he tenido que aprender de forma autodidacta, a base de "prueba-error".'(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 Salu2 |