Método Select de la clase Range
Resuelto
Hola a todos,
tengo un código VBA que me permite crear un gráfico a partir del número de ocurrencias de cada entrada.
Algunas entradas tienen una ocurrencia nula, y me gustaría que no aparezcan en mi gráfico.
Para ello, antes de la creación del gráfico, he añadido las siguientes líneas de código que me permiten ocultar las filas cuya ocurrencia es cero.
Este código funciona muy bien cuando está en un módulo aparte, pero cuando lo añado a mi código general que se activa al hacer clic en un botón, ya no funciona....
Tengo un error de ejecución 1004 que aparece y me dice que "el método Select de la clase Range ha fallado" ... La depuración me indica que es esta línea la que causa el problema:
He intentado reemplazar
por
pero tampoco funciona....
¿Alguna idea de por qué funciona en un módulo y no en el código global?
Gracias de antemano!
Configuración: Windows 7 / Chrome 53.0.2785.116
tengo un código VBA que me permite crear un gráfico a partir del número de ocurrencias de cada entrada.
Algunas entradas tienen una ocurrencia nula, y me gustaría que no aparezcan en mi gráfico.
Para ello, antes de la creación del gráfico, he añadido las siguientes líneas de código que me permiten ocultar las filas cuya ocurrencia es cero.
''''''''''''''''''''''Ocultación de ocurrencias nulas'''''''''''''''''''''''''''' linea2 = 27 Do Until IsEmpty(Cells(linea2, "B")) If Cells(linea2, "B").Value = 0 Then Rows(linea2).Select Selection.EntireRow.Hidden = True linea2 = linea2 + 1 Else linea2 = linea2 + 1 End If Loop
Este código funciona muy bien cuando está en un módulo aparte, pero cuando lo añado a mi código general que se activa al hacer clic en un botón, ya no funciona....
Tengo un error de ejecución 1004 que aparece y me dice que "el método Select de la clase Range ha fallado" ... La depuración me indica que es esta línea la que causa el problema:
Rows(línea2).Select
He intentado reemplazar
Rows(línea2).Select
por
Range(línea2:línea2).Select
pero tampoco funciona....
¿Alguna idea de por qué funciona en un módulo y no en el código global?
Gracias de antemano!
Configuración: Windows 7 / Chrome 53.0.2785.116
7 respuestas
-
Hola hilo, hola foro,
No tengo mucho tiempo para revisar todos los códigos... Pero solo una observación. En el módulo 5, procedimiento graph_def_risque, tienes, si he contado bien, 2 veces 66 variables. Te aconsejo que reemplaces esas 66 variables por un array de variables de 66 entradas. He usado un array de 2 filas y 66 columnas porque no sabía si necesitarías más adelante el nombre de la variable.
En la primera fila se almacenan los nombres de las variables y en la segunda las valores. He nombrado TBCCO el array de variables cco y TBR el array de variables R. Da como resultado:Dim TBOCC(1, 1 To 66) As Variant Dim TBR(1, 1 To 66) As Variant TBOCC(0, 1) = "occ_101" TBOCC(1, 1) = Application.CountIf(Worksheets("Riesgos altos").Range("G:G"), "101") TBOCC(0, 2) = "occ_102" TBOCC(1, 1) = Application.CountIf(Worksheets("Riesgos altos").Range("G:G"), "102") '... TBOCC(0, 66) = occ_1605 TBOCC(1, 66) = Application.CountIf(Worksheets("Riesgos altos").Range("G:G"), "1605") TBR(0, 1) = "r101" TBR(1, 1) = "suelo deslizante" TBR(0, 2) = "r102" TBR(1, 1) = "suelo desigual" '... TBR(0, 66) = "r605" TBR(1, 66) = "coactividad"
Por el momento no ganas nada, pero después porque vas a eliminar todas las líneas:Cells(27, "A") = r101 '... Cells(92, "B") = occ_1605
por un solo bucle:For X = 1 To 66 Cells(26 + X, "A") = TBR(1, X) Cells(26 + X, "B") = TBOCC(1, X) Next X
si no necesitas el nombre de las variables, se simplifica así:Dim TBOCC(1 to 66) As Variant Dim TBR(1 To 66) As Variant TBOCC(1) = Application.CountIf(Worksheets("Riesgos altos").Range("G:G"), "101") TBR(1) = "suelo deslizante" '... TBOCC(66) = Application.CountIf(Worksheets("Riesgos altos").Range("G:G"), "1605") TBR(66) = "coactividad"
el bucle se convierte en:For X = 1 To 66 Cells(26 + X, "A") = TBR(X) Cells(26 + X, "B") = TBOCC(X) Next X
Hasta luego,
ThauTheme
--
Hasta luego,
ThauTheme-
-
[ACTUALIZACIÓN]
He llevado la idea de las tablas aún más lejos para evitar tener demasiadas líneas que escribir, esto es lo que da, ¡y reduce considerablemente (poco se puede decir) la longitud del código!
Dim TB_R(1 To 66) As Variant Dim TB_CODE(1 To 66) As Variant Dim TB_OCC(1 To 66) As Variant '''Registro de los nombres de los riesgos en la tabla TB_R''' For i = 1 To 66 TB_R(i) = Sheets("Riesgos").Range("E" & i + 2) Next '''Registro de todos los códigos de riesgos en la tabla TB_CODE''' For i = 1 To 66 TB_CODE(i) = Sheets("Riesgos").Range("D" & i + 2) 'a partir de la celda D3 de la hoja "Riesgos" Next '''Conteo de las ocurrencias de los códigos de riesgo en "Riesgos elevados" y registro en la tabla TB_OCC''' For i = 1 To 66 TB_OCC(i) = Application.CountIf(Worksheets("Riesgos elevados").Range("G:G"), TB_CODE(i)) Next '''Asignación de los riesgos y ocurrencias a celdas para la creación del gráfico''' Sheets("Resumen gráfico").Activate For X = 1 To 66 Cells(26 + X, "A") = TB_R(X) Cells(26 + X, "B") = TB_OCC(X) Next X
¡Gracias por el consejo! -
Hola a todos!
Tengo un pequeño problema con mi documento que compila muy bien (!!) pero cuando intento volver a abrirlo, recibo un mensaje de error que dice:
"Excel ha encontrado contenido ilegible en "Nombre_del_documento". ¿Desea recuperar el contenido de este libro? Si la fuente de este libro es confiable, haga clic en Sí."
Hago clic en Sí, y se abre una ventana de "Reparaciones" que me dice:
"Registros eliminados: Ordenar en la parte /xl/tables/table17.xml (Tabla)".
Sin embargo, no logro saber a qué tabla corresponde "table17", y no encuentro en ninguna parte un ordenador eliminado...
Entonces la pregunta es: ¿es esto debido a mi formato de guardado, o también les sucede a ustedes en sus computadoras? ¿Y cómo puedo cambiar eso?
El archivo AQUÍ: http://www.cjoint.com/c/FIEm3UNFs14
¡Gracias por sus respuestas!
-