¿Cómo llamar hojas por su número de índice desde VBA?
Publicado por Luciano (2 intervenciones) el 01/07/2020 00:50:32
Hola, muy buenas a todos los del grupo.
No sé si existe alguien que se haya topado con este problema que el día de hoy no me deja dormir.
Tengo un libro con una hoja llamada “CSV”, que tiene una tabla llamada “t_csv” donde lleva una columna para colocar el número de Hoja, otra columna para la Celda, otra columna con un texto en español y finalmente una columna con ese texto en inglés. Esta hoja “CSV” es para hacer la traducción de otras hojas de manera automática, muestro una parte de la tabla “t_CSV”.

Ya había programado el procedimiento para hacer mi traducción, pero recién agregué una hoja llamada “Data”, lo que hizo que mi traducción comenzara a fallar. La falla: la posición de esta nueva hoja. Cosa que en teoría no debería ser debido a que estoy tratando de usar el Índice de las hojas.
Después de darle muchas vueltas, me di cuenta que al usar la función Sheets(Hoja), donde Hoja = número de hoja tomado de la columna “Hoja” de “CSV” toma el orden de las hojas del libro de izquierda a derecha, sin embargo, mi intención es justamente evitar esto y usar el índice de hoja dado por la lista de objetos de VBA.

He estado tratando de solucionar este bug en mi programación desde hace un par de días, pero no he logrado dar con la solución que me gustaría emplear. Ya que quiero usar un código como este:
El procedimiento de arriba funciona sin problemas siempre y cuando el índice de hoja sea igual al orden de izquierda a derecha de las hojas en el libro. Pero me gustaría cambiar por algo de este estilo Sheet3.Range(“A1”).Value = dato
pero de manera automática quedando algo como Sheet & Hoja.Range(celda).Value = dato
El problema con mi idea es que la función Sheet1.Range o Sheet2.Range, etc., no me permite cambiar de manera automática por más que intento todos los trucos que sé para hacerlo. Porque no puedo convertir un string en un objeto del tipo sheet o worksheet.
Ya que si uso esto
No me lo permite ya que “Sheet” & Hoja no es un objeto
Lo que si me permite es
Pero no sé cómo indicarle al código que el número 3 va a ir cambiando según lo requiera.
Creo que se podría hacer usando la función CallByName, el detalle es que no sé usarla correctamente. O desconozco alguna forma de convertir un string en un objeto con las propiedades de una hoja.
Espero que alguien me pueda ayudar con esta consulta.
Se me ocurren algunas maneras para hacer funcionar mi código original:
1. Poner en el mismo orden las hojas, no llevaría más de 1 minuto hacerlo.
El detalle es que varias de estas hojas van a quedar completamente ocultas cuando termine de programar todos los procedimientos, lo que volvería hacer aparecer este problema del índice de hojas.
2. En lugar de usar números en la columna Hoja de “CSV” podría poner el nombre de la hoja para llamarla.
Pero en lo particular se me hace más practico usar números para poder hacer ciclos, pero funcionaria siempre y cuando alguien no decida cambiar los nombres.
No sé si existe alguien que se haya topado con este problema que el día de hoy no me deja dormir.
Tengo un libro con una hoja llamada “CSV”, que tiene una tabla llamada “t_csv” donde lleva una columna para colocar el número de Hoja, otra columna para la Celda, otra columna con un texto en español y finalmente una columna con ese texto en inglés. Esta hoja “CSV” es para hacer la traducción de otras hojas de manera automática, muestro una parte de la tabla “t_CSV”.

Ya había programado el procedimiento para hacer mi traducción, pero recién agregué una hoja llamada “Data”, lo que hizo que mi traducción comenzara a fallar. La falla: la posición de esta nueva hoja. Cosa que en teoría no debería ser debido a que estoy tratando de usar el Índice de las hojas.
Después de darle muchas vueltas, me di cuenta que al usar la función Sheets(Hoja), donde Hoja = número de hoja tomado de la columna “Hoja” de “CSV” toma el orden de las hojas del libro de izquierda a derecha, sin embargo, mi intención es justamente evitar esto y usar el índice de hoja dado por la lista de objetos de VBA.


He estado tratando de solucionar este bug en mi programación desde hace un par de días, pero no he logrado dar con la solución que me gustaría emplear. Ya que quiero usar un código como este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub traduccion ()
Dim lang As String
Dim Hoja As Integer
Dim celda As String
Dim dato As String
‘Obtener idioma del boton btn_esp o btn_eng de un formulario llamado “f_Login”
If f_Login.btn_esp.Value = True Then lang = "Español"
If f_Login.btn_eng.Value = True Then lang = "English"
‘Bucle para obtener los datos de la tabla “t_csv” ubicados en la hoja “CSV” (Sheet2)
For i = 1 To Sheet2.ListObjects("t_csv").DataBodyRange.Rows.Count
With Sheet2.ListObjects("t_csv")
Hoja = .ListColumns("Hoja").DataBodyRange(i).Value
celda = .ListColumns("Celda").DataBodyRange(i).Value
dato = .ListColumns(lang).DataBodyRange(i).Value
‘Colocar o sobreescribir texto de la celda correspondiente (código a cambiar)
Sheets(Hoja).Range(celda).Value = dato
End With
Next i
End Sub
El procedimiento de arriba funciona sin problemas siempre y cuando el índice de hoja sea igual al orden de izquierda a derecha de las hojas en el libro. Pero me gustaría cambiar por algo de este estilo Sheet3.Range(“A1”).Value = dato
pero de manera automática quedando algo como Sheet & Hoja.Range(celda).Value = dato
El problema con mi idea es que la función Sheet1.Range o Sheet2.Range, etc., no me permite cambiar de manera automática por más que intento todos los trucos que sé para hacerlo. Porque no puedo convertir un string en un objeto del tipo sheet o worksheet.
Ya que si uso esto
1
2
3
Dim HojaIndex As Worksheet
Set HojaIndex = “Sheet” & Hoja
HojaIndex.Range(celda).value = dato
No me lo permite ya que “Sheet” & Hoja no es un objeto
Lo que si me permite es
1
2
3
Dim HojaIndex As Worksheet
Set HojaIndex = Sheet3
HojaIndex.Range(celda).value = dato
Pero no sé cómo indicarle al código que el número 3 va a ir cambiando según lo requiera.
Creo que se podría hacer usando la función CallByName, el detalle es que no sé usarla correctamente. O desconozco alguna forma de convertir un string en un objeto con las propiedades de una hoja.
Espero que alguien me pueda ayudar con esta consulta.
Se me ocurren algunas maneras para hacer funcionar mi código original:
1. Poner en el mismo orden las hojas, no llevaría más de 1 minuto hacerlo.
El detalle es que varias de estas hojas van a quedar completamente ocultas cuando termine de programar todos los procedimientos, lo que volvería hacer aparecer este problema del índice de hojas.
2. En lugar de usar números en la columna Hoja de “CSV” podría poner el nombre de la hoja para llamarla.
Pero en lo particular se me hace más practico usar números para poder hacer ciclos, pero funcionaria siempre y cuando alguien no decida cambiar los nombres.
Valora esta pregunta


0