Script VBA copiado de una hoja a otra

Script VBA copiado de una hoja a otra

Tengo un script VBA funcional para la hoja de trabajo Procedimiento de prueba de función (FTP) que tomará los valores almacenados en 32 rangos con nombres individuales y los pegará en una hoja de trabajo separada, Resultados. Cuando intenté utilizar ese mismo script para el Procedimiento de prueba de aceptación (ATP), repite los resultados de FTP y los copia debajo de los Resultados de FTP originales. Todavía soy nuevo en VBA y no entiendo mucho de él, pero sí entiendo otros lenguajes de programación. No puedo entender por qué esto no funciona para ATP como lo hizo para FTP.

Script de procedimiento de prueba de función

Sub Copy_Filtered_Sections()

    Dim Section As Long, NextRow As Long

    For Section = 1 To 32

        NextRow = Sheets("Results").Range("A" & Rows.Count).End(xlUp).Row + 1 'Next empty row

        Sheets("Function Test Procedure").Select

        Range("FTPSec" & Section).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
        Destination:=Sheets("Results").Range("A" & NextRow)

'        Range("FTPSec" & Section).Columns("G:H").SpecialCells(xlCellTypeVisible).Copy _
'            Destination:=Sheets("Results").Range("N" & NextRow)

    Next Section

End Sub

Guión del procedimiento de prueba de aceptación

Sub Copy_ATP_Tables()

    Dim SectionATP As Long, NextRow As Long

    For SectionATP = 1 To 32

        NextRow = Sheets("Results").Range("A" & Rows.Count).End(xlUp).Row + 1 'Next empty row

        Sheets("Acceptance Test Procedure").Select

        Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
        Destination:=Sheets("Results").Range("A" & NextRow)

'           Range("FTPSec" & Section).Columns("G:H").SpecialCells(xlCellTypeVisible).Copy _
'                Destination:=Sheets("Results").Range("N" & NextRow)

    Next SectionATP


End Sub

La segunda función devuelve el siguiente mensaje de error:

"Error de tiempo de ejecución '1004': Error en el método 'Rango' del objeto '_Global'" en la línea "Rango("ATPSec" & SecciónATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination :=Hojas("Resultados").Rango("A" y Fila Siguiente)

Respuesta1

Creo que el problema es que el libro tiene rangos nombrados para FTP pero no para ATP. En el código del Procedimiento de prueba de función, en la primera iteración, la línea análoga

Range("FTPSec" & Section).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
    Destination:=Sheets("Results").Range("A" & NextRow)

solicita las celdas visibles en las columnas A a H del rango con nombre FTPSec1. Es de suponer que hay rangos con nombre FTPSec1, FTPSec2, ..., FTPSec32en su libro de trabajo.

En el código del Procedimiento de prueba de aceptación, al imitar la sintaxis aquí, ha asumido que los rangos con nombre ATPSec1,, ATPSec2..., ATPSec32están definidos en el libro de trabajo. Si no es así, su código arrojará un error porque Excel no sabe a qué Range("ATPSec1")se refiere.

Para comprobar que este es realmente el problema, abra el Administrador de nombres en Excel presionando Ctrl+ F3. Aquí verá todos los rangos nombrados en el libro de trabajo. Sospecho que verá los rangos de FTP pero no los rangos de ATP.

Para resolver este problema, debe realizar una de las siguientes acciones:

  • Defina rangos ATPSec1, ATPSec2, ..., ATPSec32en su libro de trabajo. Haga esto creando nuevos rangos con nombres a través del Administrador de nombres; o

  • Modifique su código para ATP para que VBA identifique los rangos relevantes, presumiblemente usando los mismos criterios que usaría para definir los rangos en primer lugar.

Respuesta2

Para eliminar ambigüedades, debe consultar la hoja cuando utilice un rango. Combina dos líneas de código

    Sheets("Acceptance Test Procedure").Select
    Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
    Destination:=Sheets("Results").Range("A" & NextRow)

a esto:
Sheets("Procedimiento de prueba de aceptación").Range("ATPSec" & SecciónATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Results").Range(" A" y fila siguiente)

Así calificas la fuente de la misma manera que calificas el destino.
Si eso no elimina el error, debe depurarlo manualmente. En el editor de VBA, ingrese al sub (F8) para inicializar las variables. Luego haga clic en la ventana de acceso directo y escriba

SetctionATP = 1
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).address

Esto debería devolver un rango válido. Próximo

? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).Columns("A:H").address

Puede probar otros rangos con nombre variando SectionATP.

información relacionada