Excel Macro Hyperlink.Agregar errores

2

Soy relativamente nuevo en el código VBA dentro de Excel, así que perdóneme si la respuesta es simple (espero que generalmente lo sea). Estoy usando Excel 2010, como referencia. Estoy tratando de lograr lo siguiente, con el script siguiente:

Si se ingresa una cadena de números (cualquier valor) en cualquier celda dentro de la Columna D, necesito que esto se convierta automáticamente en un Hyerlink que anexe una determinada cadena de dirección antes del valor de la celda objetivo, y escupe un nombre descriptivo que incluya la celda valor.

En otras palabras, aquí está el ejemplo de la función de Excel que intento replicar con una macro:

=HYPERLINK("http://stprs553/tickets/list/single_ticket/293136","Ticket #293136")

O, más específicamente (debería pintar una imagen más clara):

=HYPERLINK(CONCATENATE("http://stprs553/tickets/list/single_ticket/","Target_Cell_Data"),"Ticket #Target_Cell_Data")

293136 es la cadena de números de ejemplo que quiero que un usuario pueda escribir en cualquier celda dentro de la Columna D. Cuando lo hagan, quiero que esta celda se convierta en un hipervínculo, usando la cadena de números como datos base, agregando el resto de la URL a la izquierda del valor de la celda, luego cree un nombre descriptivo que concatene "Ticket #" con la cadena de número del valor de la celda. No quiero que mis usuarios tengan que aprender fórmulas de Excel para tener un enlace de referencia, o perder el tiempo teniendo que copiar ambos extremos de la función para ajustar los datos de la celda.

Esto es lo que tengo hasta ahora en 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

Aquí están los problemas con los que me encuentro:

1.) Si trato de ejecutar la fórmula tal como está, me sale un error de compilación. 2.) Si elimino el , Target.Valuefinal de la cadena de hipervínculo, aparece el error 424, error "Objeto requerido".

¿Qué estoy haciendo mal y / o cómo puedo crear una macro para realizar la función deseada? Una buena hora sólida de búsqueda en Google y echar un vistazo a algunas publicaciones de StackOverflow me llevó a lo que tengo ahora, que todavía no funciona.

Adán
fuente
@Brian a continuación parece tener la respuesta a su problema. Solo tenga en cuenta que este código se ejecutará después de que se haya creado el hipervínculo si se cambia la celda. Luego creará un hipervínculo aún más grande. Incluso presionar F2 y ENTER sin hacer un "cambio" desencadenará el Worksheet_Changeevento. Es posible que desee agregar un cheque que el Target.Characters.Count < 10o algún otro número para evitar la creación repetida de hipervínculos.
Byron Wall
¡Buen punto! En las pruebas, parece que cuando la celda se actualiza con F2 y ENTER, permanece igual. Además, cuando se escribe un valor numérico sobre una celda actualmente llena en la Columna D que ya se convirtió en un hipervínculo, parece que se actualiza y funciona correctamente. Gracias por el aviso! :)
Adam
La segunda parte sobre la actualización suena correcta. Creo que la primera parte se romperá una vez que consigas TextToDisplayque sea algo diferente al número en sí mismo. Target.Valueregresará TextToDisplayy si incluye texto que no sea el número, obtendrá un nuevo hipervínculo.
Byron Wall
Una vez que implemente una solución para cambiar el texto de la celda a "Ticket #nnnnnn", entonces esperaría que la preocupación de @ Byron se haga realidad. Definitivamente quiero agregar tal verificación ... Lo
incluiré
Eso tiene sentido. Pude verificar que ingresar en "Ticket #" lo romperá, creando una cadena repetida de hipervínculos "Ticket #" dentro de la celda. Sin embargo, esto debería ser un problema, ya que puedo usar un encabezado para "Ticket #" en su lugar, y hacer que los usuarios ingresen los números ellos mismos, ya que no parece haber un problema con eso.
Adam

Respuestas:

1

Creo que la llamada a la función debería ser:

Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & Target.Value, TextToDisplay:="Ticket #" & Target.Value

Acabo de cambiar ambas ocurrencias de ca Target, que creo que hará lo que estás describiendo. El error 'Objeto requerido' se está lanzando porque cno se ha instanciado a nada; no puede recuperar un miembro de algo que no sea un objeto.

EDITAR, para abordar el texto de la celda que no cambia:

Me preguntaba si el texto de la celda seguiría siendo solo el número. La solución se verá más o menos así, creo:

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

Es importante desactivar el manejo de eventos siempre que use VBA para editar el contenido de una celda dentro de un evento como este, de lo contrario corre el riesgo de un bucle infinito. Debería haber pensado en esto inicialmente; pero parece que aplicar un hipervínculo a la celda no se dispara Worksheet_Change.

Tenga en cuenta que si elimina un hipervínculo de una celda, la celda permanecerá formateada como 'subrayada' y 'color de fuente azul'. Para su caso de uso, donde la columna siempre será enlaces a tickets o celdas en blanco, ¿esto es probablemente aceptable?

hBy2Py
fuente
Eso es definitivamente algo que pasé por alto. ¡Gracias! Ahora obtengo un hipervínculo generado correctamente, lo cual es excelente. Sin embargo, el nombre descriptivo para el hipervínculo permanece como la cadena de número incluso con las modificaciones. ¿Hay alguna manera de concatenar el valor en TextToDisplay:=?
Adam
Esa revisión es perfecta. Gracias por toda su ayuda Brian y @Byron. ¡Muy apreciado!
Adam
Me alegro de que funcionó, @ Adam! Aceptar mi respuesta es la manera perfecta de decir 'gracias'. :-)
hBy2Py
@ Adam, revisé el condicional levemente para agregar una IsEmptyprueba, lo que ahora evita que ocurra lo sucio 'Ticket #Ticket #' cuando eliminas una celda.
hBy2Py