Ich bin relativ neu im Umgang mit VBA-Code in Excel, also verzeihen Sie mir bitte, wenn die Antwort einfach ist (ich gehe davon aus, dass sie es normalerweise ist). Ich verwende Excel 2010 als Referenz. Ich versuche, mit dem folgenden Skript Folgendes zu erreichen:
Wenn eine Zahlenzeichenfolge (beliebiger Wert) in eine beliebige Zelle in Spalte D eingegeben wird, muss ich diese automatisch in einen Hyperlink umwandeln lassen, der vor den Wert der Zielzelle eine bestimmte Adresszeichenfolge anfügt und einen benutzerfreundlichen Namen ausgibt, der den Wert der Zelle enthält.
Mit anderen Worten, hier ist die Beispiel-Excel-Funktion, die ich mit einem Makro replizieren möchte:
=HYPERLINK("http://stprs553/tickets/list/single_ticket/293136","Ticket #293136")
Oder genauer (sollte ein klareres Bild zeichnen):
=HYPERLINK(CONCATENATE("http://stprs553/tickets/list/single_ticket/","Target_Cell_Data"),"Ticket #Target_Cell_Data")
293136ist die Beispiel-Zahlenzeichenfolge, die ein Benutzer in jede Zelle in Spalte D eingeben können soll. Dabei soll diese Zelle in einen Hyperlink umgewandelt werden, wobei die Zahlenzeichenfolge als Basisdaten verwendet wird, der Rest der URL links neben dem Zellenwert angehängt wird und dann ein benutzerfreundlicher Name erstellt wird, der „Ticket #“ mit der Zahlenzeichenfolge aus dem Zellenwert verknüpft. Ich möchte nicht, dass meine Benutzer Excel-Formeln lernen müssen, um einen Referenzlink zu haben, oder Zeit damit verschwenden müssen, beide Enden der Funktion zu kopieren, um die Zellendaten zu umschließen.
Folgendes habe ich bisher in 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
Folgende Probleme treten bei mir auf:
1.) Wenn ich versuche, die Formel so auszuführen, wie sie ist, erhalte ich einen Kompilierungsfehler. 2.) Wenn ich das , Target.Value
Ende der Hyperlink-Zeichenfolge entferne, erhalte ich den Fehler 424, „Objekt erforderlich“.
Was mache ich falsch und/oder wie kann ich ein Makro erstellen, um die gewünschte Funktion auszuführen? Nach einer guten Stunde Google-Suche und dem Durchsehen einiger StackOverflow-Beiträge bin ich zu dem gekommen, was ich jetzt habe, was immer noch nicht funktioniert.
Antwort1
Ich denke, der Funktionsaufruf sollte lauten:
Target.Hyperlinks.Add Anchor:=Target, Address:="http://stprs533/tickets/list/single_ticket/" & Target.Value, TextToDisplay:="Ticket #" & Target.Value
Ich habe gerade beide Vorkommen von c
in geändert Target
, was meiner Meinung nach das bewirken wird, was Sie beschreiben. Der Fehler „Objekt erforderlich“ wird ausgelöst, weil c
nicht instanziiert wurde – Sie können kein Mitglied von etwas abrufen, das kein Objekt ist.
BEARBEITEN, um den sich nicht ändernden Zellentext zu beheben:
Ich habe mich gefragt, ob der Zellentext nur die Zahl bleiben würde. Die Lösung wird ungefähr so aussehen, denke ich:
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 ist wichtig, die Ereignisbehandlung zu deaktivieren, wenn Sie VBA verwenden, um den Inhalt einer Zelle innerhalb eines solchen Ereignisses zu bearbeiten. Andernfalls besteht die Gefahr einer Endlosschleife. Daran hätte ich gleich denken sollen, aber es scheint, dass das Anwenden eines Hyperlinks auf die Zelle nicht auslöst Worksheet_Change
.
Beachten Sie, dass, wenn Sie einen Hyperlink aus einer Zelle löschen, die Zelle weiterhin als „unterstrichen“ und in „blauer Schriftfarbe“ formatiert bleibt. Für Ihren Anwendungsfall, bei dem die Spalte immer entweder Links zu Tickets oder leere Zellen enthält, ist dies wahrscheinlich akzeptabel?