En el siguiente código, "Sheets.Count" en "Master.Activate" solo funciona cuando el libro "Fuente" se selecciona manualmente con un clic del mouse antes de ejecutar la macro. De lo contrario, "Master.Activate" activará la primera hoja de trabajo del libro "Master" en lugar de realizar Sheets.Count y seleccionar la última hoja. Eso básicamente significa que la macro debe ejecutarse desde el libro de trabajo "Maestro", pero solo después de hacer clic en el libro de trabajo "Fuente". Agradecería cualquier sugerencia sobre cómo solucionarlo.

Dim Source As Worksheet
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements")
Dim Master As Worksheet
Set Master = Workbooks("Master Bonviva.xlsm").Worksheets(Sheets.Count) 

Source.Activate

For Each cell In Source.Columns("M").Cells
    If Not IsEmpty(cell) Then
        Master.Activate
            For Each cell2 In Master.Columns("J").Cells
                If Not IsEmpty(cell2) Then
                    If cell = cell2 Then
                        cell2.Offset(0, 9).Value = cell.Offset(0, -2).Value
                        cell2.Offset(0, 8).Value = cell.Offset(0, -8).Value
                    End If
                End If
            Next cell2
     End If
Next cell

End Sub

Saludos, Bartek

2
barciewicz 13 nov. 2017 a las 19:16

2 respuestas

La mejor respuesta

El error esta en

 Set Master = Workbooks("Master Bonviva.xlsm").Worksheets(Sheets.Count) 

Sin calificación Sheets.count se refiere al número de hojas en cualquier libro de trabajo que esté abierto en el momento en que se ejecuta. Reemplazar con esto

Dim wb as workbook
Set wb =Workbooks("Master Bonviva.xlsm")
Set Master = wb.worksheets(wb.sheets.count)
2
Harassed Dad 13 nov. 2017 a las 16:24

Trate de ignorar a Select y Activate. Declare cell1 y cell2. Por lo tanto, esto debería funcionar:

Public Sub TestMe()

    Dim Source As Worksheet
    Set Source = Workbooks("Source.xlsx").Worksheets("Settlements")

    Dim Master As Worksheet
    Set Master = Workbooks("Master Bonviva.xlsm").Worksheets(Sheets.Count)

    Dim cell1   As Range
    Dim cell2   As Range

    For Each cell1 In Source.Columns("M").Cells
        If Not IsEmpty(cell1) Then
            For Each cell2 In Master.Columns("J").Cells
                If Not IsEmpty(cell2) Then
                    If cell1 = cell2 Then
                        cell2.Offset(0, 9).Value = cell1.Offset(0, -2).Value
                        cell2.Offset(0, 8).Value = cell1.Offset(0, -8).Value
                    End If
                End If
            Next cell2
        End If
    Next cell1

End Sub

Cómo evitar usar Select en Excel VBA

En general, como buena práctica, no declare variables que utilicen el mismo nombre que utiliza VB Editor. Por ejemplo, evite declarar cell, pero use cell1 o cualquier otra cosa que tenga sentido.

1
Vityata 13 nov. 2017 a las 16:19