VBA Excel 2003 - Modificar datos de un libro con datos de otro libro

Tengo un libro “Presu puesto Anual” con 2 hojas:

Hoja1 con las siguientes columnas : provincia, ciudad, sector, código-gasto, enero, febrero, marzo,…, diciembre. En esta hoja se encuentran los datos de los gastos que se presupuestaron originalmente. Puede haber más de una fila por provincia, ciudad, sector, código-gasto pero en los informes que se confeccionan se muestra una sola fila con los totales.

Ejemplo:

Hoja1 :

Santa Fe, Rosario, Ventas, 1, 1500, 1500, 1800, …, 2000

Santa Fe, Rosario, Ventas, 1, 300, 300, 400, …, 600

En el informe se muestra así :

Provincia: Santa Fe

Sucursal : Rosario

Sector: Ventas

Gasto, Enero, Febrero, Marzo, …, Diciembre

1, 1800, 1800, 2200, …, 2600

Hoja2 con las mismas columnas de Hoja1 más una que tiene la fecha de modificación y otra con observaciones. En esta hoja se copian las filas de la hoja1 antes de que se modifiquen.

Trimestralmente se hacen revisiones y ajustes. De cada ciudad (sucursal) envían 1 libro con formato igual a la hoja1 con aquellos gastos que sufren modificaciones. Son varios pero no todos y hay solo una fila por provincia, ciudad, sector, código-gasto igual que en el informe.

¿Cuál sería la codificación en VBA para automatizar esta tarea? :

Con cada libro de las sucursales buscar en libro “Presupuesto Anual” por provincia, ciudad, sector, código-gasto, copiar fila completa a la hoja2 poniendo fecha de modificación y una observación, luego en hoja1 actualizar los valores de los meses que se ajustan.

Actualmente (manualmente), como puede haber más de un registro con la misma clave, se copian todas las filas, se modifican los valores de una fila y en las restantes se ponen ceros.

Siguiendo con el ejemplo:

Hoja1 :

Santa Fe, Rosario, Ventas, 1, Nuevo valor, Nuevo valor, Nuevo valor, …, Nuevo valor

Santa Fe, Rosario, Ventas, 1, 0, 0, 0, …, 0

Al final del período Enero-Diciembre los registros en cero se eliminaran.

2 Respuestas

Respuesta
1

Para entender mejor, podrías enviarme tu libro "Presupuesto anual", también me envías tu libro de una sucursal.

Con colores y comentarios me explicas qué datos hay que copiar

Origen: libro, hoja, fila

Destino: libro, hoja, fila

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario "charles chaplin" y el título de esta pregunta.

Dante: te envíè 2 mail (en uno fueron los archivos Excel y como me olvidè de adjuntarte un Word con la explicación, te enviè otro con ese archivo). Gracias y saludos.

Te anexo la macro para modificar los datos

Sub Presupuesto()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set l1 = ThisWorkbook
    Set h1 = l1.Sheets("Hoja1")
    Set hd = l1.Sheets("Hoja2")
    '
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Selecciona archivo de excel"
        .Filters.Clear
        .Filters.Add "All Files", "*.*"
        .Filters.Add "xls.*", "*.xls*"
        .FilterIndex = 2
        .AllowMultiSelect = False
        .InitialFileName = ThisWorkbook.Path
        If .Show Then
            arch = .SelectedItems.Item(1)
        Else
            Exit Sub
        End If
    End With
    '
    UserForm1.Show
    mes = UserForm1.ComboBox1.ListIndex + 1
    Unload UserForm1
    If mes = 0 Then
        Exit Sub
    End If
    '
    Set l2 = Workbooks.Open(arch)
    Set h2 = l2.ActiveSheet
    '
    For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row
        Set r = h1.Columns("A")
        Set b = r.Find(h2.Cells(i, "A"), lookat:=xlWhole)
        If Not b Is Nothing Then
            ncell = b.Address
            uno = True
            Do
                If h2.Cells(i, "B") = h1.Cells(b.Row, "B") And _
                   h2.Cells(i, "C") = h1.Cells(b.Row, "C") And _
                   h2.Cells(i, "D") = h1.Cells(b.Row, "D") Then
                    'copio la fila
                    h1.Rows(b.Row).Copy hd.Rows(hd.Range("A" & Rows.Count).End(xlUp).Row + 1)
                    If uno Then
                        uno = False
                        For j = 4 + mes To 16
                            h2.Cells(i, j).Copy h1.Cells(b.Row, j)
                        Next
                    Else
                        For j = 4 + mes To 16
                            h1.Cells(b.Row, j) = 0
                        Next
                    End If
                End If
                Set b = r.FindNext(b)
            Loop While Not b Is Nothing And b.Address <> ncell
            If uno Then
                'no encontró el registro, crea un nuevo
                u = hd.Range("A" & Rows.Count).End(xlUp).Row + 1
                h2.Range("A" & i & ":D" & i).Copy hd.Range("A" & u)
                hd.Range("E" & u & ":P" & u) = 0
                u = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
                h2.Rows(i).Copy h1.Rows(u)
            End If
        End If
    Next
    l2.Close False
    MsgBox "Presupuesto actualizado", vbInformation, "PRESUPUESTO"
End Sub

Saludos.Dante Amor

Hola Dante. Estoy probando la macro y luego de seleccionar el archivo me da el siguiente mensaje:"Se ha producido el error 424 en tiempo de ejecución"  "Se requiere un objeto". Me puedes seguir ayudando? Disculpa las molestias...

Cuando te aparece el mensaje de error, hay botón que dice: "depurar", presiónalo y dime qué línea de la macro se pone en amarillo.

¿Estás probando con el archivo que te envié?

Y también selecciona el archivo "Presupuesto Rio IV"

Si te envía error, presiona depurar y dime qué línea de la macro se pone de amarillo.

Si ya funciona, no olvides valorar la respuesta

Hola Dante. El error lo da en : UserForm1.Show

Gracias.

¿Estás probando con el archivo que te envié?

Respuesta

http://www.programarexcel.com/2013/03/copia-datos-abre-otro-libro-pega-datos.html

En link tienes ejemplo que se ajusta a lo que necesitas.

Y en este otro link muchos ejemplos más de macros que te ayudaran a aotomatizar tu libro.

http://www.programarexcel.com/p/home.html

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas