Ayuda URGENTE en macro

Necesito de su gentil ayuda con respecto a un trabajo que estoy desarrollando en excel con una base de datos de inventario.
Lo que me urge y ya no puedo pasar de ahí, es que tengo un textbox que pregunta la serie a buscar y todo lo que encuentre con esa serie lo pasa a una hoja con nombre de Sheet7 (posteriormente le voy a poner nombre de REPORTE), esto ya logé que lo hiciera, pero lo que no he podido lograr es que cada vez que pase los datos encontrados, me borre antes los datos que estaban en esa hoja (Sheet7) que fue de una búsqueda anterior. ¿Me puede ayudar para que cuando busque el dato que quiero antes de pasarlos a la hoja llamada Sheet7 limpie o borre los datos que ya estaban?
Quiero aclarar que las filas 1 y 2 son fijas, ya que ahí tengo encabezados, y lo que requiero es que a partir de la fila 3 en adelante se borren los datos de una búsqueda anterior.
Le anexo el código que tengo que me sirve como localizar el dato y que copie todo lo encontrado a ese dato a la hoja llamada Sheet7.
En mi archivo original tengo 3 hojas llamadas 2009, 2010 y 2011, pero el código que estoy usando solo me busca en la hoja que yo le especifico, pero quisiera que me busacara en las tres hojas, y todo lo que encuentre del dato a buscar en esas tres hojas lo copie a la hoja Sheet7.
De antemano, le agradezco su valiosa ayuda para resolver este problema del que ya no he encontrado la solución y que tengo que entregar en mi trabajo.
Private Sub BUSQUEDA_Click()
Dim ultima_fila As Long
Dim ultima_columna As Long
Dim fila As Long
Dim columna As Long
Dim fila1 As Long
Dim columna1 As Long
Dim buscar As String
Dim cadena As String
Dim encontro As Boolean
encontro = False
buscar = Application.InputBox("No. De Serie para realizar copia en la hoja REPORTE:", "Parametro Requerido", "")
If buscar <> "" Then
    buscar = UCase(buscar)
    ultima_fila = Worksheets("2010").Cells.SpecialCells(xlCellTypeLastCell).Row
    ultima_columna = Worksheets("2010").Cells.SpecialCells(xlCellTypeLastCell).Column
    fila3 = 3
    For fila = 3 To ultima_fila
        columna1 = 1
        If Worksheets("2010").Cells(fila, 15) = buscar Then
            For columna = 1 To ultima_columna
                Worksheets("Sheet7").Cells(fila3, columna1) = Worksheets("2010").Cells(fila, columna)
                columna1 = columna1 + 1
            Next columna
            fila3 = fila3 + 1
        End If
    Next fila
End If
End Sub

2 respuestas

Respuesta
1
Estuve revisando tu caso y aunque tuve que trabajar con unos datos abstractos, creo que el código que te dejo te puede ayudar; al respecto tengo las siguientes observaciones:
1. Las hojas que contienen los datos a revisar deben tener el valor que se esta buscando en la primera columna
2. La hoja desde la cual se inicia la macro debe ser la ultima del libro, y se debe lanzar la macro desde la celda a partir de la cual se quiere que se llenen los registros.
(Creo que es todo)
Me avisas si anda. Saludos
****************************************
Sub TraerRegistros()
''MODIFICADA POR FSerrano el 110519
'Desactiva la actualización de la pantalla para efectuar más rapido los calculos
Application.ScreenUpdating = False
'Controla el error cuando el dato ingresado no es un numero
On Error GoTo SALTAR
'Referencia el punto de inicio para volver a él al final de los calculos
NOMBREINICIO = ActiveSheet.Name
PUNTOINICIO = ActiveCell.Address
'elimina los datos contenidos a partir de la fila 3 hasta el final de la hoja
Range("3:" & ActiveSheet.Rows.Count).Delete
'Solicita el identificador de los registros a traer
buscar = Application.InputBox("No. de Serie para realizar copia en la hoja REPORTE:", "Parametro Requerido", "")
'si el identificador ingresado es un numero lo configura como tal
If Application.WorksheetFunction.IsNumber(buscar * 1) = True Then
    buscar = buscar * 1
End If
'restaura el controlador de errores
SALTAR:
On Error GoTo 0
'Repite el ciclo desde la primera hoja hasta la penultima
'La ultima hoja contendra el resumen y debe ser desde donde se inicia la macro
For HOJA = 1 To ActiveWorkbook.Sheets.Count - 1
    Sheets(HOJA).Activate
    ActiveSheet.Range("A1").Activate
    ActiveSheet.Cells(ActiveSheet.Rows.Count, ActiveCell.Column).Activate
    ULTIMAFILA = Selection.End(xlUp).Row
    ActiveSheet.Range("A1").Activate
    While ActiveCell.Row <= ULTIMAFILA
    If ActiveCell.Value = buscar Then
        ActiveSheet.Range(ActiveCell.Address, Selection.End(xlToRight).Address).Copy
        Sheets(NOMBREINICIO).Activate
        Range(PUNTOINICIO).Activate
        ActiveSheet.Cells(ActiveSheet.Rows.Count, ActiveCell.Column).Activate
        Selection.End(xlUp).Activate
        ActiveCell.Offset(1, 0).Activate
        Range(ActiveCell.Address).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        Sheets(HOJA).Activate
    End If
    ActiveSheet.Cells(ActiveCell.Row + 1, ActiveCell.Column).Activate
    Wend
Next HOJA
'Vuelve a la hoja inicial
Sheets(NOMBREINICIO).Activate
ActiveSheet.Range(PUNTOINICIO).Activate
'Reactiva la actualización automatica de pantalla
Application.ScreenUpdating = True
End Sub
Muchas gracias por tu pronta respuesta y el tiempo que le dedicaste, la macro que me indicas esta excelente y la voy a aplicar en otro libro que me están solicitando. Con respecto a la ayuda original, lo que hice fue que por cada vez que quieran buscar el dato de la serie, se cree una hoja llamada REPORTE y ahí me pega todo lo que encontró al respecto. Pero ahora tengo un problema con el formato de la fecha ya que no me la esta respetando.
En mi hoja 2010 en la columna I tengo la fecha de ingreso del activo, pero ya al momento de que se copia a la hoja REPORTE, no me respeta el formato de fecha y me pone solo texto. Me podrías ayudar a indicarme el código para que me respete el formato al momento de crear la hoja de REPORTE, ¿o qué solamente seleccionar toda la columna I desde A3 hasta A65500 tenga el formato de fecha cada que se cree la hoja llamada reporte? Las filas 1 y 2 de todas las hojas de mi libro es la misma, en la columna I va la fecha. De antemano, te agradezco tu atención...
Te anexo el nuevo código que hice para que cree la hoja llamada REPORTE y ahí me copie los datos.
Private Sub BUSQUEDA_Click()
Dim ultima_fila As Long
Dim ultima_columna As Long
Dim fila As Long
Dim columna As Long
Dim fila1 As Long
Dim columna1 As Long
Dim buscar As String
Dim cadena As String
Dim encontro As Boolean
encontro = False
buscar = Application.InputBox("No. de Serie para realizar copia en la hoja REPORTE:", "Parametro Requerido", "")
If buscar <> "" Then
    Worksheets.Add
    With ActiveSheet
    .Move after:=Worksheets(Worksheets.Count)
    .Name = "REPORTE"
    End With
    Sheets("2010").Range("A1:AV2").Copy Destination:=Sheets("reporte").Range("A1")
    buscar = UCase(buscar)
    ultima_fila = Worksheets("2010").Cells.SpecialCells(xlCellTypeLastCell).Row
    ultima_columna = Worksheets("2010").Cells.SpecialCells(xlCellTypeLastCell).Column
    fila3 = 3
    For fila = 3 To ultima_fila
        columna1 = 1
        If Worksheets("2010").Cells(fila, 15) = buscar Then
            For columna = 1 To ultima_columna
                Worksheets("REPORTE").Cells(fila3, columna1) = Worksheets("2010").Cells(fila, columna)
                columna1 = columna1 + 1
            Next columna
            fila3 = fila3 + 1
        End If
    Next fila
End If
End Sub
Disculpa la tardanza pero he aquí unas repuestas (espero que aun sean oportunas)
He probado con parte de tu código y me copia y pega los valores respetando los formatos (no se que pueda pasar en tu caso), pero prueba con estas estructuras (copian y pegan el rango "A1:C1" de la Hoja1 a la Hoja2)
1. Separar la instrucción (de este modo, copia y pega tal cual el origen, respetando formatos, bordes de celda, anchos de columna, alineación de textos... TODO)
*************
Sheets(1). Range("A1:C1"). Copy
Sheets(2). Range("A1:C1"). PasteSpecial xlPasteAll
Application.CutCopyMode = False
*************
2. Asignar el formato de fecha a un rango especifico (en este caso la celda C1)
*************
Range("C1").NumberFormat = "d/mm/yy"
*************
Me avisas si anda.
Mi estimado, excelente la ayuda que me brindaste, seleccioné los rangos de donde van las fechas y ya me las despliega como debe de ser. Deja cierro esta pregunta y sólo tengo una más por hacerte supongo que es sencilla, pero me ha costado un dolor de cabeza el no poder solucionarla. Gracias.
Respuesta
1
Para limpiar el valor de las celdas, puedes seleccionar rangos para copiar los datos que encuentres y pegarlos en otra hoja... o consolidar después...
La instrucción para limpiar los valores de las celdas es Selection. ClearContents
Para eliminar toda una fila debes seleccionar toda la fila
ActiveCell.EntireRow.Select
ó puedes indicar el numero de las filas a borrar sí son fijos
Rows("2:20").Select
Selection.Delete Shift:=xlUp

ahora para cambiar entre hojas de un libro es:
ActiveSheet.Next.Select de la pagina actual a la pagina siguiente
ActiveSheet.Previous.Select de la pagina actual a la pagina anterior
Sheets("Hoja2").Select sí estas en la "Hoja1
Gracias por tu pronta respuesta. Ya lo intente, inclusive con el delete, con el clear y no me borra los datos, me envía error. ¿Me podrías indicar cual seria la instrucción correcta y en que parte la anexaría? Porque ya no le encuentro la lógica.
Por cierto, hice otra solución a este problema, en el que cada vez que solicite buscar la serie, inserte la hoja con el nombre de REPORTE, si lo hace, y me pega los datos que quiero, pero ahora no me esta respetando el formato de fecha, en mi hoja 2010 en la columna I tengo la fecha de ingreso del activo, pero ya al momento de que se copia a la hoja reporte, no me respeta el formato de fecha y me pone solo texto. ¿Me podrías ayudar a indicarme el código para que me respete el formato o que solamente seleccionar toda la columna I desde A3 hasta A65500 tenga el formato de fecha cada que se cree la hoja llamada reporte? Las filas 1 y 2 de todas las hojas de mi libro es la misma, en la columna I va la fecha. De antemano, te agradezco tu atención...
Te anexo el nuevo código que hice para que cree la hoja llamada REPORTE y ahí me copie los datos.
Private Sub BUSQUEDA_Click()
Dim ultima_fila As Long
Dim ultima_columna As Long
Dim fila As Long
Dim columna As Long
Dim fila1 As Long
Dim columna1 As Long
Dim buscar As String
Dim cadena As String
Dim encontro As Boolean
encontro = False
buscar = Application.InputBox("No. de Serie para realizar copia en la hoja REPORTE:", "Parametro Requerido", "")
If buscar <> "" Then
    Worksheets.Add
    With ActiveSheet
    .Move after:=Worksheets(Worksheets.Count)
    .Name = "REPORTE"
    End With
    Sheets("2010").Range("A1:AV2").Copy Destination:=Sheets("reporte").Range("A1")
    buscar = UCase(buscar)
    ultima_fila = Worksheets("2010").Cells.SpecialCells(xlCellTypeLastCell).Row
    ultima_columna = Worksheets("2010").Cells.SpecialCells(xlCellTypeLastCell).Column
    fila3 = 3
    For fila = 3 To ultima_fila
        columna1 = 1
        If Worksheets("2010").Cells(fila, 15) = buscar Then
            For columna = 1 To ultima_columna
                Worksheets("REPORTE").Cells(fila3, columna1) = Worksheets("2010").Cells(fila, columna)
                columna1 = columna1 + 1
            Next columna
            fila3 = fila3 + 1
        End If
    Next fila
End If
End Sub
Bueno analizando lo que comentas, puedes limpiar la variable que usas para la búsqueda...
Si cargas un rango ejemplo
rango = "A2:A100"
range(rango).select
Y luego lo copias a la otra hoja, debes inicializar esa variable para poder realizar otra búsqueda y que no te pegue los mismos datos.
rango = empty
para el tema de la fecha usas esta instruccion
Selection.NumberFormat = "m/d/yyyy"
Y pues un tip de programador para que no pierdas la logica; cuando escribas el código puedes escribir comentario para saber que hace la linea del código...
Después de escribir la linea escribes apostrofe ' y luego el comentario ejemplo:
Selection.NumberFormat = "m/d/yyyy" 'a la seleccion le cambia formato de fecha
Gracias, pero hice la prueba seleccionando la columna I3 hasta I100 de la hoja creada para aplicarle el formato de fecha y me envía error. Lo que hice fue lo siguiente:
Sheets (hoja.Name).select ' para que seleccione hoja creada
rango="I3:I100"
range(rango).select
Selection.NumberFormat = "m/d/yyyy"
Pero me envía error, lo que quiero hace en esa columna es que se peguen fechas de la colimna I3 de la hoja de donde estoy copiando los datos. A lo mejor estoy insertando el código en una parte en donde no debe de ir. Por lo estoy insertando antes del END SUB, ¿O me podrías indicar en que parte de la fuente lo debo de insertar? Porque según yo, después de que copió los datos a la hoja creada, le quiero dar el formato de fecha a toda la columna I. La verdad, no llevo mucho tiempo en esto de hacer macros.
Muchas gracias nuevamente.
Lastimosamente no tuve pc el fin de semana, pero según veo no importa donde coloques el código, eso sí debe ser antes del end sub.
La instrucción que te indique funciona con Excel 2007 (osea Visual Basic for Applications 6.3) no sé que versión de Office tengas instalada.
En ocasiones la instrucción puede cambiar de versión a versión.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas