Abrir documento Word desde Excel según datos de combobox

Resulta que estoy programando un libro para automatizar muchos procesos, todo me ha ido bien, pero ahora en la parte final donde quiero que habrá los documentos donde se imprimen los informes no logro que trabaje como quiero.

Los documentos de informes están creados en word.

Puedo abrirlos especificando la ruta exacta en el código, pero lo que quiero lograr es que a través de un combobox se elija el documento que se desea abrir la ruta la almaceno en un textbox y de este textbox la tome la instrucción open.

El almacenarlo en el textbox no es necesario lo hice en un principio para observar el cambio al elegir en el combobox

Dejo copia del archivo con el formulario correspondiente documento

1 respuesta

Respuesta
1

Tu quieres seleccionar el documento desde el ComboBox. El ComboBox se carga con la lista que esta en la hoja en la columna I (y por cierto la manera en que estas cargando el combobox no es la ideal. Do While...Loop?)

Si lo que hay en la columna J es la ruta correcta, fija y exacta a cada uno de los archivos, entonces podrías cargar el combobox con su propiedad RowSource. Cargar ambas columnas pero solo mostrar la primera, y usar la segunda como el BoundColumn.

La idea luce así:

El cuadro rojo representa el RowSource = "I2:J4"

El cuadro verde seria la columna de texto, lo que ve el usuario en el combobox, y su valor se extrae con Me. ComboBox1.Text

El cuadro azul seria el BoundColum que no tiene por que verse, pero está presente y se extrae con Me. ComboBox1.Value

De esta manera, la ruta queda almacenada en el BoundColumn del combobox, que lo sacas con el .Value

He notado que mucha gente no usa esta propiedad, o no la conocen, es muy útil. Yo la uso muchísimo.

Si no entendiste nada, no importa, me dices y te lo hago y te lo vuelvo a explicar.

Andy M.

Hola Andy primero que nada muchas gracias por tu respuesta, tienes razón es una propiedad poco usada en lo personal nunca he alimentado un combobox con ella y el proceso para abrir libros siempre me ha sido muy complicado son de esas cosas que no entran ni abriendo el portón jejejeje.

Fueras tan amable de explicar con más detalle como emplear la propiedad y después como llamar la ruta para abrirlo o si deseas pasarme un ejemplo para poder entenderlo.

Nuevamente te agradezco tu atención

Disculpa me quede dormido después de responderte jaja

Cuando cargas un ComboBox lo puedes cargar con mas de una columna a la vez, de todas esas columnas, puedes asignar una como el texto que muestra visualmente al usuario, y otra con el valor real detrás de escena, y ahí es donde entra el BoundColumn.

En tu caso quedaría así (Tu lo habías hecho en el evento Activate del UserForm, yo prefiero usar el Initialize para este tipo de cosas). Iré linea por linea explicando:

Private Sub UserForm_Initialize()
End Sub

Primero vamos a definir la hoja, por si acaso luego en el futuro agregas mas hojas, poder usar esta función desde cualquiera de ellas sin tener que activarla. Lo haríamos así:

Dim bbdd As Worksheet: Set bbdd = Sheets("bbdd")

Luego, también vamos a definir cual es la ultima fila en ese rango que usaremos para cargar el ComboBox, de esa forma si en el futuro agregas mas archivos a la lista (o quitas) el rango se hace dinámico y crece o se reduce a la par de la lista, así (uF significaría "Ultima Fila"):

Dim uF As Integer
uF = bbdd.Range("I" & Rows.Count).End(xlUp).Row

ya luego solo quedaría cargar el combobox, así:

With Me.ComboBox1
    .ColumnCount = 1
    .RowSource = bbdd.Name & "!I2:J" & uF
    .BoundColumn = 2
End With

Te explico que es cada cosa. Se usa With...End With para agregar varias propiedades al mismo control al mismo tiempo, sin tener que escribir Me.ComboBox1.NombreDePropiedad cada vez

. ColumnCount =1 Aquí le estamos diciendo, no importa cuantas columnas te agreguemos, tu solo muestra 1 (la primera en el rango, en este caso "I")

.RowSource = bbdd. Name & "!I2:J" & uF RowSource, en español seria "Filas Origen" o algo así, es una propiedad del ComboBox para agregar un rango de una vez, a diferencia de .AddItem que agrega un Item uno por uno, con RowSource agregas todo el rango de una. Y funciona así: NombreDeHoja!Rango. Pero esto puede ser dinámico y traerlo con variables como hemos hecho. Bbdd. Name (Nombre de la hoja) ! Desde I2:J <- hasta uF (la ultima fila)

. BoundColumn = 2 te hemos agregado 2 columnas (I & J) de ellas, quiero que el valor real sea lo que esta en la 2da (J)

Así que, si yo en cualquier parte de mi programa digo ComboBox1.Text me va a devolver el texto real que veo con mis ojos (la columna 1, I)

Pero si en cualquier momento digo ComboBox1.Value me va a devolver el valor detrás de escena que es lo que hay en la columna 2 (J)

Por ende, en tu Botón de Abrir, puedes llamar a la ruta con ComboBox1.Value y abrir tu documento Word a partir de ahí.

Y si yo entendí mal y esto no era lo que tu preguntaste.

No cupo todo, te decía que al menos espero que hayas aprendido algo nuevo

entendiste perfectamente mi duda, muchas gracias por tu atención y si tienes razón aprendí algo nuevo, se me hace muy practica la propiedad la empleare no solo en este caso si no también en futuros casos, te agradezco mucho tu atención y el apoyo que me has brindado.

mil gracias 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas