Renato de Italia pregunta:
¿Cómo puedo abrir un libro de trabajo en VBA eligiendo de una lista? Cuando grabo una macro, codifica de forma rígida el nombre del archivo seleccionado en la macro.
Hay un comando en VBA llamado GetOpenFileName. Muestra el cuadro Abrir archivo. Puede navegar a un directorio, seleccionar el archivo y luego hacer clic en Abrir. En este punto, el comando no abre el archivo, simplemente pasa el nombre a su programa. Aquí hay un ejemplo del código en uso:
Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub
Roger pregunta:
¿Cómo puedo hacer que se ejecute una macro antes de que se cierre o guarde un archivo?
La macro debe ingresarse en el panel de código asociado con "ThisWorkbook". En el menú desplegable de la derecha, seleccione BeforeClose o BeforeSave.
Ken escribe:
Tengo un controlador de eventos de hoja de trabajo que se repite, al menos 16 veces. Que esta pasando?
El controlador de Ken era simple: si la entrada no era numérica, cambiaría la entrada a mayúsculas. Aqui esta el problema. Cuando cambió el valor de la entrada a mayúsculas, ese es otro cambio de hoja de trabajo y el evento se activará nuevamente. Cada vez que se activaba el evento de cambio, Ken cambiaba la hoja de trabajo y la macro se llamaba de forma recursiva, hasta que la pila de llamadas se quedaba sin memoria.
La solución es detener temporalmente la ejecución de eventos mientras cambia el valor a mayúsculas. Puede hacer esto cambiando el valor de Application.EnableEvents a False. Aquí está la macro corregida:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub
Andy del Reino Unido hace la pregunta más interesante de hoy.
Tengo una rutina de VBA en un libro de trabajo que crea varios otros libros de trabajo. Me gustaría poder agregar dinámicamente un hipervínculo en cada nuevo libro de trabajo que apunte al libro de trabajo que generó los nuevos libros de trabajo.
Andy, esta es una idea genial. Sin el beneficio de ver su código, puedo imaginar que algo como esto funcionaría:
Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub