Msgbox que tenga la info de block de notas en VBA Excel

Tengo en mi escritorio una carpeta llena de varios bloc de notas y cree un userform con un solo un combobox y un botón.

Alguna idea Expertos de como hacer que:

Primero

Se vaya a la carpeta con los block de notas y añada cada nombre en el combobox

Segundo

Al seleccionar algún datos de la lista de combobox que se guardo me de un msgbox con el contenido de dicho bloc de notas.

Alguna guía por favor no logro entender muy bien como unir excel y bloc de notas por lo demás entiendo regular la interpretación de la programación.

1 Respuesta

Respuesta
1

Si entendí bien, lo que quieres hacer es algo como esto: video demo

Si es así, aquí están las instrucciones:

El ComboBox debe tener las siguientes propiedades:

BoundColum = 2

ColumnCount = 1

En un modulo estándar pega el siguiente código, ajusta según sea necesario:

Sub DoFolder(Folder)
Dim flPath As String
Dim flName As String
    For Each File In Folder.Files
        If Right(File.Name, 4) = ".txt" Then
        flName = File.Name
            UserForm1.ComboBox1.AddItem Left(flName, Len(flName) - 4)
            flPath = File.Path
            UserForm1.ComboBox1.List(UserForm1.ComboBox1.ListCount - 1, 1) = flPath
        End If
    Next
End Sub

Luego en el modulo del formulario, necesitas estos eventos:

Evento Initialize del UserForm:

Private Sub UserForm_Initialize()
Dim FileSystem As Object
Dim HostFolder As String
'cambia esto a la ruta de tu PC'
HostFolder = "C:\Users\andym\Desktop\Blocs Notas\"
Set FileSystem = CreateObject("Scripting.FileSystemObject")
DoFolder FileSystem.GetFolder(HostFolder)
End Sub

y el evento Click del Botón (el botón que dispara el MsgBox):

Private Sub CommandButton1_Click()
Dim FileNum As Integer
Dim DataLine As String
FileNum = FreeFile()
Open Me.ComboBox1.Value For Input As #FileNum
    Line Input #FileNum, DataLine
    MsgBox DataLine
End Sub

PD 1: Esto va a depender de cuantas lineas hay en los Bloc de Notas, y cuantas son las que quieres mostrar en el MsgBox. Como no especificaste eso, lo hice para una sola linea (la primera)

PD 2: La ruta se almacena en el BoundColumn del ComboBox, por lo que ComboBox1.Value devuelve la ruta, y ComboBox1.Text devuelve el nombre del archivo

Andy

Gracias amigo es justo lo que deseo

Disculpe por omitir la cantidad de líneas pero me gustaría una guía en eso

Digamos que en mi bloc de notas cada archivo tiene distintas filas como haría para que al dar el Msgbox cuente las líneas y me de el mensaje con todo el texto sin omitir líneas alguna guía para darle forma muchas gracias

Solo hay que cambiar un poco la 3ra macro (la del evento click del botón). Debe quedar así:

Private Sub CommandButton1_Click()
Dim FileNum As Integer
Dim DataLine As String
Dim txtMsg As String
FileNum = FreeFile()
Open Me.ComboBox1.Value For Input As #FileNum
Do While Not EOF(FileNum)
    Line Input #FileNum, DataLine
    txtMsg = txtMsg & vbCr & DataLine
Loop
    MsgBox txtMsg
End Sub

Solo agregue una nueva variable Dim txtMsg As String y un bucle que recoge cada linea del TXT

Do While Not EOF(FileNum)
Line Input #FileNum, DataLine
txtMsg = txtMsg & vbCr & DataLine
Loop

¡Gracias! Amigo me quedo esta duda por que se cambia esta parte en el combobox

El ComboBox debe tener las siguientes propiedades:

BoundColum = 2

ColumnCount = 1

Me gustaría saber con que finalidad se cambia esta pequeña parte muchas gracias por responder mi duda esto me ayudar a interpretar y entender mejor el código con el fin de informarme.

Posdata tu código funciona excelente muchas gracias.

La propiedad BoundColumn es menospreciada o poco conocida, ya que veo que casi nadie la usa, y para mi es super útil.

Bound en español significa "unido/a" así que seria algo como "Columna Unida"

Cuando cargas un combobox puedes cargarlo con más de 1 columna. Pueden ser 2, 3, 10, las que quieras, pero solo una puede ser el texto y otra el valor.

BoundColumn lo que hace es almacenar un valor detrás de escena y permitirte mostrar un texto diferente al usuario. Por ejemplo, digamos que tienes una lista en un ComboBox con nombres de amigos, tu solo quieres mostrar el nombre, pero como resultado deseas saber la edad. Así que tienes una lista de nombres, que cuando ejecutas devuelve la edad, osea otro dato diferente al que ves con tus ojos en la lista. Eso te permite BoundColumn.

En tu caso, lo que hice fue cargar el ComboBox con dos columnas, la columna 1 tiene los nombres de los TXT y la columna 2 tiene la ruta a los TXT. Solo queremos mostrar la columna de los nombres, por eso le decimes ColumnCoun = 1 (cantidad de columnas a mostrar visualmente 1) Pero el valor que queremos trabajar se encuentra en la 2, así que BoundColumn = 2, que aunque no se vea, esta presente.

Por eso, para obtener la ruta usaríamos ComboBox.Value porque BoundColumn sobreescribe el valor. Y si quisiéramos obtener el nombre en lugar de la ruta, podríamos decir ComboBox.Text que es el texto mostrado en pantalla.

Esto de .Text y .Value aplica para todo en VBA, esa es la diferencia entre ambos.

.Text siempre hace referencia a lo que vemos con nuestros ojos explícitamente, mientras que .Value hace referencia a un valor real de algo que en muchas ocasiones es lo mismo que .Text pero no en este caso.

Esto se puede demostrar como hice en este video: video demo

Todo sabemos que si el tamaño de la celda es muy pequeño para una fecha, Excel pondrá unos #### y eso es lo que vemos en pantalla, así que eso es lo que nos dará .Text, sin embargo con .Value si obtenemos el valor real. Por eso se recomienda usar .Text a toda costa, a pesar de que muchos "expertos" aquí lo aman.

Perdón:

Por eso se recomienda EVITAR .Text a toda costa

Puse "usar" quise decir "evitar"

¡Gracias!

De nuevo me abriste la idea para un sin numero de formas de usar su aplicación muchísimas gracias amigo. Excelente ayuda y información brindada.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas