Selecionando arquivos no VBA - Dicas do Excel

Renato da Itália pergunta:

Como posso abrir uma pasta de trabalho no VBA escolhendo em uma lista? Quando gravo uma macro, ele codifica permanentemente o nome do arquivo selecionado na macro.

Há um comando no VBA chamado GetOpenFileName. Ele exibe a caixa Abrir arquivo. Você pode navegar até um diretório, selecionar o arquivo e clicar em Abrir. Neste ponto, o comando não abre o arquivo, ele simplesmente passa o nome de volta para o seu programa. Aqui está um exemplo do código em 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 pergunta:

Como faço para que uma macro seja executada antes de um arquivo ser fechado ou salvo?

A macro precisa ser inserida no painel de código associado a "ThisWorkbook". No menu suspenso à direita, selecione BeforeClose ou BeforeSave.

Ken escreve:

Eu tenho um manipulador de eventos de planilha que executa um loop, pelo menos 16 vezes. O que está acontecendo?

O manipulador de Ken era simples - se a entrada não fosse numérica, ela mudaria para maiúsculas. Aqui está o problema. Quando ele alterou o valor da entrada para maiúsculas, isso é outra alteração da planilha e o evento seria disparado novamente. Cada vez que o evento de alteração fosse disparado, Ken mudava a planilha e a macro era chamada recursivamente, até que a pilha de chamadas ficasse sem memória.

A solução é interromper temporariamente a execução de eventos enquanto você altera o valor para maiúsculas. Você pode fazer isso alterando o valor de Application.EnableEvents para False. Aqui está a macro corrigida:

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, do Reino Unido, faz a pergunta mais interessante de hoje.

Eu tenho uma rotina VBA em uma pasta de trabalho que cria várias outras pastas de trabalho. Gostaria de poder adicionar dinamicamente um hiperlink em cada nova pasta de trabalho que apontará para a pasta de trabalho que gerou as novas pastas de trabalho.

Andy - essa é uma ideia legal. Sem o benefício de ver seu código, posso imaginar que algo assim funcionaria:

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

Artigos interessantes...