Macro para copiar información de una hoja a otra hoja en las celdas que le corresponda
Estoy buscando alguna opción de macro, para con un botón poder pasar la información de una hoja llamada CAPTURA a una hoja llamada INFORMACIÓN y que esta se acomode en las filas de acuerdo al # de folio, y también es las columnas y celdas que le corresponda, aquí dejo un par de imágenes de ejemplo de lo que estoy intentando.
Esta es la hoja de CAPTURA
esta es la hoja de INFORMACION
En las imágenes se puede ver el ejemplo de que lo que estaba en hoja CAPTURA se ha vaciado en la hoja INFORMACIÓN en el folio que le corresponde y en la columna que le corresponde.
Este seria el código del botón:
Private Sub CommandButton1_Click() Dim CAPTURA As Worksheet: Set CAPTURA = Sheets("CAPTURA") Dim INFORMACION As Worksheet: Set INFORMACION = Sheets("INFORMACION") Dim Folio As String: Folio = CAPTURA.Cells(1, 2).Text Dim Nombre As String: Nombre = CAPTURA.Cells(2, 2).Value2 Dim Departamento As String: Departamento = CAPTURA.Cells(3, 2).Value 'etc etc' Dim FolioRow As Integer Dim FolioRng As Range If Trim(Folio) <> "" Then With INFORMACION.Range("A:A") Set FolioRng = .Find(What:=Folio, _ After:=.Cells(.Cells.Count), _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not FolioRng Is Nothing Then FolioRow = FolioRng.Row INFORMACION.Cells(FolioRow, 2).Value = Nombre INFORMACION.Cells(FolioRow, 3).Value = Departamento 'etc etc' MsgBox "Registro agregado correctamente.", vbInformation, "Agregado..." Else MsgBox "El número de Folio no se encontró.", vbExclamation, "Folio no existe..." End If End With Else MsgBox "Debe poner el número de Folio", vbExclamation, "Falta Folio..." End If End Sub
Y así es como funciona: Video demo
Andy
Hola buen día Andy, gracias por tu tiempo y respuesta
He observado la macro y el video, y funciona de acuerdo a lo que planteas, pero aun tengo dudas ya que el ejemplo que me mandas trabaja sobre algo fijo, es decir solo viene FOLIO, NOMBRE, DEPARTAMENTO, y en el ejemplo que publique, vienen 6 artículos después de nombre, folio, departamento y fecha, estos ARTÍCULOS son FIJOS solo en la hoja INFORMACIÓN
Pero en la hoja de CAPTURA no son fijos a veces aparecerá que solo captures 3 de ellos como en el ejemplo CANICAS, YOYOS, PISTOLAS, y esos deberán guardarse en su folio y en su respectiva columna, habrá otros casos que la captura en pantalla solo mostrara otros artículos como TROMPOS, PELOTAS y ya no aparecerá a capturar canicas, yoyos, pistolas, este es un ejemplo de solo 6 artículos, yo después lo aplicare a uno de 900 artículos, es por eso que me interesa el ejemplo publicado.
Nuevamente agradezco tu tiempo, espero haberme explicado mejor, y me serviría de mucho nuevamente tu aportación.
Saludos.
¿900? Olé
Creo que tienes un problema de estructura. En una base de datos real tu estructura no tendría sentido. Yo no conozco la situación y/o el objetivo de lo que sea que estés haciendo, pero me atrevo a decir que tienes la estructura de tu base invertida o mal gestionada. ¿No sería mejor que los "Articulos" sean eso, "Articulos", en lugar de encabezados?
La teoría de las tablas, en palabras simples, es que sean mas largas que anchas.
Si me permite una sugerencia de estructura poniendo de lado la programación por ahora.
Como lo explicas pareciera que tendrás una columna con 900 artículos de los cuales solo vas usar unos cuantos por cada "Folio" y harás mucho "scroll" para encontrar el que buscas. Sin contar que la misma cantidad de artículos estarán también en una fila, a modo de encabezado (esto suena a una mala idea).
Yo tengo un proyecto parecido, se trata de una tienda, que registra ordenes, la tienda cuenta con muchos productos, y una orden puede contener varias cantidades, de varios productos.
Si traduzco mi proyecto al tuyo seria así:
Orden = Folio
Producto = Articulo
De la manera que registro la Orden (el Folio en tu caso) es poniendo el nombre del producto (en realidad lo que utilizo es el ID del producto) y entre paréntesis la cantidad en cuestión, y cada producto de la orden se colocará en la próxima columna disponible, en lugar de buscar en 900 columnas, a cual de ellas corresponde. Y la manera en que se escogen los productos para la orden, es de una lista desplegable, mas cómodo que hacer "Scroll" por toda la hoja de Excel, a parte de que las listas pueden ser filtrables al escribir el nombre, lo que facilita mas aun la búsqueda del Producto/Articulo que necesitas.
Como una imagen vale mas que mil palabras, aquí te dejo un ejemplo de como luce mi proyecto:
Y así es como luciría el tuyo siguiendo este concepto:
Este método también contribuye a una mejor legibilidad de los datos.
Si no es posible, o ya es muy tarde para cambiar la estructura de tu proyecto, entonces me temo que no podre ayudarte mucho ya que me harías trabajar de gratis en algo a lo que no le encuentro sentido. (A menos de que yo haya entendido todo mal, entonces ignora esta carta de amor jajaja)
Carta de lo que sea pero muy interesante jajjaja,
nuevamente agradezco tú tiempo y tienes razón no estaría bien trabajar de gratis en algo que parece no tener sentido,
es por eso que si me das oportunidad me gustaría compartirte el libro en el que estoy trabajando para poder hacerme entender mejor, tal vez mi planteamiento este bien, tal vez este muy muy mal jajjaja, en ese libro de momento solo tengo la hoja de captura y la hoja de listado de artículos, ya no escribiré más, ya que para ser más claro ocuparía mostrarte el archivo, tu me dices si es posible y como para enviarte el archivo.
Gracias
Puedes subirlo a algún Drive como Google Drive, One Drive, Dropbox, el que tu quieras y me compartes el enlace, así lo puedo descargar.
Ya seria para mañana en la tarde, por hoy solo mirare Brasil vs Paraguay y luego me duermo ja
Excelente, hay que ver el partido, y aparte el archivo lo tengo en el trabajo, mañana te comparto un link.
Buen día Andy, te paso el link del archivo.
https://drive.google.com/file/d/188QbEwNkRva4m_s9PoQSvPHDZaxyrHaC/view?usp=sharing
De momento el libro consta de 5 hojas CAPTURA, BASE DE DATOS, PDS, LISTO, HOJA3 (oculta), las 2 que me interesan son la de CAPTURA y la de BASE DE DATOS, para poder enviar a la base de datos lo que esta en CAPTURA, podrás ver que en la hoja de BASE DE DATOS es una hoja muy larga a lo horizontal y no me afecta para nada, lo único que busco es que cada articulo se guarde donde le corresponde, después mediante otras hojas de REPORTES "que aun no existen" jajaja mandare a traer reportes específicos.
En BASE DE DATOS viene señalado en color azul la fila 30 ya que hace referencia a lo que esta en la hoja CAPTURA al momento de que abras el libro, ahí podrás ver como cada articulo se guarda en la columna que le corresponde de acuerdo al folio, planta, departamento.
Espero explicarme bien.
Saludos, y espero que le hayas apostado a BRASIL.
Ya te hice una macro en un modulo que se llama AndyMachin. No pude hacer el botón directamente ya que la hoja estaba protegida con contraseña. Solo debes copiar la macro al botón que quieras o llamarla con Call
Esta es la macro:
Sub Evento_Del_Boton() Dim i As Integer Dim CAPTURA As Worksheet: Set CAPTURA = Sheets("CAPTURA") Dim BASEDATOS As Worksheet: Set BASEDATOS = Sheets("BASE DE DATOS") Dim MatName As String, MatQty As Integer, MatRng As Range Dim Folio As String: Folio = CAPTURA.Cells(3, 43).Value2 Dim FolioRow As Integer Dim FolioRng As Range If Trim(Folio) <> "" Then With BASEDATOS.Range("A:A") Set FolioRng = .Find(What:=Folio, After:=.Cells(.Cells.Count), LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) End With If Not FolioRng Is Nothing Then FolioRow = FolioRng.Row BASEDATOS.Cells(FolioRow, 2).Value2 = CAPTURA.Cells(3, 18).Value2 BASEDATOS.Cells(FolioRow, 3).Value2 = CAPTURA.Cells(4, 18).Value2 BASEDATOS.Cells(FolioRow, 4).Value2 = CAPTURA.Cells(5, 18).Value2 BASEDATOS.Cells(FolioRow, 5).Value2 = CAPTURA.Cells(6, 18).Value2 BASEDATOS.Cells(FolioRow, 6).Value2 = CAPTURA.Cells(34, 29).Value2 BASEDATOS.Cells(FolioRow, 7).Value2 = CAPTURA.Cells(34, 4).Value2 For i = 10 To 31 If CAPTURA.Cells(i, 3).Value = "" Then Exit For MatName = CAPTURA.Cells(i, 3).Value2 MatQty = CAPTURA.Cells(i, 46).Value2 With BASEDATOS.Cells(1, 1).EntireRow Set MatRng = .Find(What:=MatName, After:=.Cells(.Cells.Count), LookAt:=xlWhole, _ SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) End With If Not MatRng Is Nothing And MatQty > 0 Then BASEDATOS.Cells(FolioRow, MatRng.Column).Value2 = MatQty End If Next i MsgBox "Registro agregado correctamente.", vbInformation, "Agregado..." Else MsgBox "El número de Folio no se encontró.", vbExclamation, "Folio no existe..." End If Else MsgBox "Debe poner el número de Folio", vbExclamation, "Falta Folio..." End If End Sub
Y aquí esta el gran libro de 57 MB (incluso siendo Binario)
¿Si sabias que tu libro excel pesa 57 MB verdad? Y nisiquiera tiene tanta información, creo que pesa tanto porque las dos hojas en cuestión están exageradamente cargadas de columnas. Por ejemplo, combinaste 49 celdas para escribir "VALE DE MATERIAL"
Esto me recordó cuando iba de chico al doctor y me decían, abre la boca y di AAAAAAAAA:
Tengo un Excel, también binario, con un millón y medio de registros y pesa 58MB.
58MB millón y medio de registros vs 57MB 42 mil registros (en solo dos columnas).
Creo que deberías reconsiderar mi propuesta de mejorar la estructura de tu libro. Ahora pesa eso, imagínate cuando llenes todos los folios, sera imposible trabajar en él.
- Compartir respuesta