Sou relativamente novo no código VBA do Excel, então, perdoe-me se a resposta for simples (espero que geralmente seja). Estou usando o Excel 2010, para referência. Estou tentando realizar o seguinte, com o script seguinte:
Se uma sequência numérica (qualquer valor) for inserida em qualquer célula da Coluna D, preciso convertê-la automaticamente em um Hyerlink que anexaria uma determinada sequência de endereço antes do valor da célula de destino e cuspiria um nome amigável que incluísse a célula valor.
Em outras palavras, aqui está o exemplo de função do Excel que estou tentando replicar com uma macro:
=HYPERLINK("http://stprs553/tickets/list/single_ticket/293136","Ticket #293136")
Ou, mais especificamente (deveria pintar uma imagem mais clara):
=HYPERLINK(CONCATENATE("http://stprs553/tickets/list/single_ticket/","Target_Cell_Data"),"Ticket #Target_Cell_Data")
293136é o exemplo de sequência numérica que desejo que um usuário possa digitar em qualquer célula da coluna D. Quando o fizerem, desejo que essa célula seja convertida em um hiperlink, usando a sequência numérica como dados base, anexando o restante do URL à esquerda do valor da célula e, em seguida, crie um nome amigável que concatene "Ticket #" com a sequência numérica do valor da célula. Não quero que meus usuários tenham que aprender fórmulas do Excel para ter um link de referência ou perder tempo tendo que copiar as duas extremidades da função para envolver os dados da célula.
Aqui está o que tenho até agora no VBA:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rangeLimit As Range
Set rangeLimit = Range("D:D")
If Not Intersect(rangeLimit, Target) Is Nothing Then
If Target <> "" Then
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & c.Value, TextToDisplay:="Ticket #" & c.Value, Target.Value
End If
End If
End Sub
Aqui estão os problemas que estou enfrentando:
1.) Se eu tentar executar a fórmula como está, recebo um erro de compilação. 2.) Se eu remover o , Target.Value
final da string do hiperlink, recebo um erro 424, erro "Objeto necessário".
O que estou fazendo de errado e/ou como posso criar uma macro para executar a função desejada? Uma boa hora de pesquisa no Google e uma olhada em algumas postagens do StackOverflow me levaram ao que tenho agora, que ainda não funciona.
Responder1
Acho que a chamada de função deveria ser:
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & Target.Value, TextToDisplay:="Ticket #" & Target.Value
Acabei de alterar as duas ocorrências de c
to Target
, o que acho que fará o que você está descrevendo. O erro 'Objeto necessário' está sendo gerado porque c
não foi instanciado para nada - você não pode recuperar um membro de algo que não seja um objeto.
EDIT, para endereçar o texto da célula que não muda:
Eu me perguntei se o texto da célula permaneceria apenas o número. A correção será mais ou menos assim, eu acho:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rangeLimit As Range
Set rangeLimit = Range("D:D")
If Not Intersect(rangeLimit, Target) Is Nothing Then
If IsNumeric(Target) And Not IsEmpty(Target) Then ' This condition should avoid munging of already-existing links, though if any tickets might be non-numeric it won't work properly.
Application.EnableEvents = False ' Must turn off event handling
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & Target.Value, TextToDisplay:="Ticket #" & Target.Value
Target.Formula = "Ticket #" & Target.Value ' Should actually change the displayed text
Application.EnableEvents = True
End If
End If
End Sub
É importante desligar o tratamento de eventos sempre que você usar o VBA para editar o conteúdo de uma célula dentro de um evento como este, caso contrário você corre o risco de um loop infinito. Eu deveria ter pensado nisso inicialmente; mas parece que aplicar um hiperlink à célula não aciona Worksheet_Change
.
Observe que se você excluir um hiperlink de uma célula, a célula permanecerá formatada como 'sublinhado' e 'cor de fonte azul'. Para o seu caso de uso, onde a coluna sempre conterá links para tickets ou células em branco, isso provavelmente é aceitável?