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
, ..., FTPSec32
en 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
..., ATPSec32
está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
, ...,ATPSec32
en su libro de trabajo. Haga esto creando nuevos rangos con nombres a través del Administrador de nombres; oModifique 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
.