Saltar al contenido

Recommended Posts

publicado (editado)

Hola, estoy intentado hacer mi primera macro.

Primeramente quiero hacer una cosa que creo que es sencilla, tengo dos hojas, hoja1 donde trabajo con la tabla de cosas que tengo en activo, y la hoja2 donde quiero que pasen las filas que digamos que ya he terminado

la celda G es donde al escribir o pegar una celda que tenga información, se da por hecho que esta acabada, entonces quiero que automáticamente, al  ver algo escrito en esta celda, se haga un CUT&PASTE de la hoja 1 a la 2. En G evidentemente es a partir de G2, ya que en G1 estaría el encabezado de la tabla.

Al preguntar esto a chatgpt me recomendo esto

****

****

Para lograr lo que necesitas, puedes utilizar el evento Worksheet_Change en VBA, que se activa cada vez que se realiza un cambio en una hoja específica. Aquí te muestro cómo podrías implementar esta funcionalidad:

Abre el Editor de Visual Basic en Excel presionando Alt + F11 y luego inserta el siguiente código en la hoja de Excel donde deseas monitorear los cambios:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wsSource As Worksheet
    Dim wsDestination As Worksheet
    Dim changedCell As Range
    Dim lastRow As Long

    ' Define las hojas de origen y destino
    Set wsSource = ThisWorkbook.Sheets("Hoja1") ' Cambia "Hoja1" al nombre de tu hoja de origen
    Set wsDestination = ThisWorkbook.Sheets("Hoja2") ' Cambia "Hoja2" al nombre de tu hoja de destino

    ' Define el rango de la celda que activa el evento
    Set changedCell = Intersect(Target, wsSource.Range("A:A")) ' Observa los cambios en la columna A, cambia según tu necesidad

    ' Si la celda que cambió está en el rango observado
    If Not changedCell Is Nothing Then
        ' Encuentra la última fila en la hoja de destino
        lastRow = wsDestination.Cells(wsDestination.Rows.Count, "A").End(xlUp).Row + 1

        ' Copia la fila entera a la hoja de destino
        wsSource.Rows(changedCell.Row).Copy wsDestination.Rows(lastRow)
    End If
End Sub

Este código monitorea los cambios en la Hoja1.

Asegúrate de ajustar los nombres de las hojas ("Hoja1" y "Hoja2") según los nombres reales de tus hojas. Además, puedes modificar columnaTrigger para ajustarlo a la columna específica donde deseas detectar el cambio.

 

****

****

 

Como digo es mi primera macro y tengo dudas varias.

Esta macro quedaria siempre activa o debo de ejecutarla de algun modo, quiero que este siempre activa

Si cambiara el nombre de los libros, deberia cambiar el codigo de la macro?

El proceso de ALT+F11, escribir codigo y ya esta. o debo de guardarla de algun modo, ejecutarla por primera vez o no se.

Intentes seguir las indicaciones y algo debi hacer mal, porque no consegui nada.

 

Gracias por la atención, un saludo.

 

 

Editado el por adryan
publicado
hace 9 minutos , adryan dijo:

Esta macro quedaria siempre activa o debo de ejecutarla de algun modo, quiero que este siempre activa

Si cambiara el nombre de los libros, deberia cambiar el codigo de la macro?

El proceso de ALT+F11, escribir codigo y ya esta. o debo de guardarla de algun modo, ejecutarla por primera vez o no se.

Como te dice la IA, la macro se ejecutará cada que cambie algo en la hoja activa, esta parte "luego inserta el siguiente código en la hoja de Excel donde deseas monitorear los cambios:" se hace dando doble clic sobre la hoja donde quieres los cambios, es decir; al dar Alt + F11 del lado izquierdo ves la hojas en forma de lista que conforman el libro, al dar doble clic sobre una de ellas te "abre" ahí mismo del lado derecho una ventana en blanco que es donde debes de pegar el código que te han proporcionado. Una vez pegado el código estará siempre activa y hará lo que quieres cada que cambies algo en esa hoja. Solo guarda los cambios en tu libro naturalmente.

En resumen, para que se ejecute un código algo debe de ocurrir en tu libro, hay otras forma de hacerlo pero lo que te recomendaron es útil.

Si cambias el nombre del libro donde esta esa macro, la macro se mantiene ahí. Si das un "guardar como" debes asegurarte que sea en un libro habilitado para macros, si copias el libro la macro se replica en la copia. Un escenario donde la macro no se "pegue" en otro libro sería que solo copies la hoja de un libro a otro.

Si el proceso del ALT + F11 ya esta (Y YA PEGASTE EL CÓDIGO) para probarla basta con dar F5 o irte a tu hoja y hacer un cambio. Analiza si así es como quieres que se "dispare" tu macro, sino te acomoda puedes hacer que se ejecute por medio de un botón. Eso es sencillo insertando un módulo, pegas ahí la macro y en la hoja insertas un botón que haga referencia a ese módulo. Pero si por la poca experiencia te parece complicado, puedes consultar aquí en el foro como insertar un módulo o replicar esta pregunta en la IA.

Saludines.

publicado (editado)
hace 19 horas, Israel Cassales dijo:

Como te dice la IA, la macro se ejecutará cada que cambie algo en la hoja activa, esta parte "luego inserta el siguiente código en la hoja de Excel donde deseas monitorear los cambios:" se hace dando doble clic sobre la hoja donde quieres los cambios, es decir; al dar Alt + F11 del lado izquierdo ves la hojas en forma de lista que conforman el libro, al dar doble clic sobre una de ellas te "abre" ahí mismo del lado derecho una ventana en blanco que es donde debes de pegar el código que te han proporcionado. Una vez pegado el código estará siempre activa y hará lo que quieres cada que cambies algo en esa hoja. Solo guarda los cambios en tu libro naturalmente.

En resumen, para que se ejecute un código algo debe de ocurrir en tu libro, hay otras forma de hacerlo pero lo que te recomendaron es útil.

Si cambias el nombre del libro donde esta esa macro, la macro se mantiene ahí. Si das un "guardar como" debes asegurarte que sea en un libro habilitado para macros, si copias el libro la macro se replica en la copia. Un escenario donde la macro no se "pegue" en otro libro sería que solo copies la hoja de un libro a otro.

Si el proceso del ALT + F11 ya esta (Y YA PEGASTE EL CÓDIGO) para probarla basta con dar F5 o irte a tu hoja y hacer un cambio. Analiza si así es como quieres que se "dispare" tu macro, sino te acomoda puedes hacer que se ejecute por medio de un botón. Eso es sencillo insertando un módulo, pegas ahí la macro y en la hoja insertas un botón que haga referencia a ese módulo. Pero si por la poca experiencia te parece complicado, puedes consultar aquí en el foro como insertar un módulo o replicar esta pregunta en la IA.

Saludines.

Gracias, mas o menos siguiendo tus pasos lo he  conseguido, la cosa que no se muy bien que he hecho. por que he copiado el codigo en dos sitios, en la hoja 1 haciendo doble click, y en el apartado modulo que me dice chatgpt que cree.

he comprobado que el codigo hay dos cosas que no hace, una es que solo me copia la fila si escribo, pero no si la pego y ya esta escrita, y luego me gustaria que una vez que pega la fila en la hoja 2, la borre de la hoja 1. vamos que mas que un copia y pega me haga un corta y pega.

probe a en el codigo cambiar copy por cut, pero la hoja entro en error y tuve que volver atras.

 

***

EDIT: ya he visto que lo que vale es lo del doble clic, no se cual es la diferencia con lo otro de crear un modulo

ayudamacroFUNCIONAAMEDIA.xlsm

Editado el por adryan
publicado
hace 59 minutos , adryan dijo:

EDIT: ya he visto que lo que vale es lo del doble clic, no se cual es la diferencia con lo otro de crear un modulo

La diferencia es que uno se ejecuta cuando la hoja cambia y la que pegaste en el modulo necesitas indicarle cuándo se va a ejecutar, puede ser una combinación de teclas, crear un botón que la ejecute al dar clic y varias ideas que se te podrían ocurrir.

publicado
hace 1 hora, Israel Cassales dijo:

La diferencia es que uno se ejecuta cuando la hoja cambia y la que pegaste en el modulo necesitas indicarle cuándo se va a ejecutar, puede ser una combinación de teclas, crear un botón que la ejecute al dar clic y varias ideas que se te podrían ocurrir.

Muchas gracias sigo avanzando, la verdad que me he desbloqueado respecto ayer, diciciendole a chatgpt que aplique borrar despues me esta lanzando un codigo que borra despues de copiar, el problema es que no consigo que este quede activo siempre, por tanto al pegar filas en la tabla no automatiza.

Que marca en el codigo que este siempre activa o necesita activarse?

 

Sub CortarYEliminarFilas()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim rng As Range
    Dim cell As Range
    Dim fila As Integer

    ' Define las hojas de origen y destino
    Set ws1 = ThisWorkbook.Sheets("Hoja1")
    Set ws2 = ThisWorkbook.Sheets("Hoja2")

    ' Define el rango en la hoja 1
    Set rng = ws1.Range("G2:G80")

    ' Loop a través de cada celda en el rango
    For Each cell In rng
        ' Verifica si la celda no está vacía
        If Not IsEmpty(cell) Then
            ' Obtiene el número de fila de la celda
            fila = cell.Row
            ' Corta la fila desde la hoja 1 y pégala en la hoja 2
            ws1.Rows(fila).Cut ws2.Rows(ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1)
            ' Elimina la fila de la hoja 1
            ws1.Rows(fila).Delete
            ' Se resta 1 al contador de fila para ajustar el cambio de filas después de la eliminación
            fila = fila - 1
        End If
    Next cell

    ' Limpia la memoria
    Set ws1 = Nothing
    Set ws2 = Nothing
    Set rng = Nothing
    Set cell = Nothing
End Sub

 

publicado
hace 57 minutos , adryan dijo:

el problema es que no consigo que este quede activo siempre

Creo te estás confundiendo un poco, para que esté activa todo el tiempo la IA te recomendó pegarla como código en la hoja con el evento Private Sub Worksheet_Change(ByVal Target As Range), es decir; la macro hará lo que está programado en cada ocasión que haya un cambio en la hoja.

Eso fue cuando diste doble clic sobre la hoja y te apareció la ventana en blanco.

Por otro lado:

Hace 1 hora, adryan dijo:

Sub CortarYEliminarFilas()

La macro anterior la pusiste al insertar un módulo, entonces de manera regular no se va a ejecutar hasta que haya un evento que se lo indique, como puede ser el dar clic en un botón o en una autoforma que insertes por ejemplo. Para hacer algo simple como lo anterior, inserta una autoforma, la seleccionas y das clic derecho, en la opción asignar macro te abre una ventana y te aparecen las macros que has creado en el libro, entonces deberías ver esa que tienes creada "CortarYEliminarFilas". Se la asignas y entonces cada que des un clic en la autoforma la macro se ejecutará.

En resumen, tú decides cómo y en qué momento debe ser ejecutada la macro.

publicado
hace 1 hora, Israel Cassales dijo:

Creo te estás confundiendo un poco, para que esté activa todo el tiempo la IA te recomendó pegarla como código en la hoja con el evento Private Sub Worksheet_Change(ByVal Target As Range), es decir; la macro hará lo que está programado en cada ocasión que haya un cambio en la hoja.

Eso fue cuando diste doble clic sobre la hoja y te apareció la ventana en blanco.

Por otro lado:

La macro anterior la pusiste al insertar un módulo, entonces de manera regular no se va a ejecutar hasta que haya un evento que se lo indique, como puede ser el dar clic en un botón o en una autoforma que insertes por ejemplo. Para hacer algo simple como lo anterior, inserta una autoforma, la seleccionas y das clic derecho, en la opción asignar macro te abre una ventana y te aparecen las macros que has creado en el libro, entonces deberías ver esa que tienes creada "CortarYEliminarFilas". Se la asignas y entonces cada que des un clic en la autoforma la macro se ejecutará.

En resumen, tú decides cómo y en qué momento debe ser ejecutada la macro.

Muchas gracias deverdad, estoy aprendiendo mucho.

publicado
En 29/2/2024 at 21:45 , Israel Cassales dijo:

Creo te estás confundiendo un poco, para que esté activa todo el tiempo la IA te recomendó pegarla como código en la hoja con el evento Private Sub Worksheet_Change(ByVal Target As Range), es decir; la macro hará lo que está programado en cada ocasión que haya un cambio en la hoja.

Eso fue cuando diste doble clic sobre la hoja y te apareció la ventana en blanco.

Por otro lado:

La macro anterior la pusiste al insertar un módulo, entonces de manera regular no se va a ejecutar hasta que haya un evento que se lo indique, como puede ser el dar clic en un botón o en una autoforma que insertes por ejemplo. Para hacer algo simple como lo anterior, inserta una autoforma, la seleccionas y das clic derecho, en la opción asignar macro te abre una ventana y te aparecen las macros que has creado en el libro, entonces deberías ver esa que tienes creada "CortarYEliminarFilas". Se la asignas y entonces cada que des un clic en la autoforma la macro se ejecutará.

En resumen, tú decides cómo y en qué momento debe ser ejecutada la macro.

Finalmente lo consegui, muchagracias de nuevo!

 

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    
    Set ws1 = Worksheets("hoja1")
    Set ws2 = Worksheets("hoja2")
    
    For i = 2 To 80
        If ws1.Range("G" & i).Value <> "" Then
            ws1.Rows(i).Cut
            ws2.Rows(i).Insert Shift:=xlDown
            ws1.Rows(i).Delete
            Exit For
        End If
    Next i
End Sub
 

Conéctate para comentar

Podrás dejar un comentario después de conectarte



Conéctate ahora
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.