Die Überschrift sagt wirklich alles, aber hier ist meine Situation: Ich habe ein Benutzerformular eingerichtet, um Benutzereingaben zu sammeln, dann verwendet diese Eingabe in ein Makro und führt es aus. Das funktioniert an sich genau so, wie ich es möchte. Das Problem tritt auf, wenn mehr als ein Dokument geöffnet ist.Word UserForm öffnet sich nicht im zweiten, gerade aktiven Dokument nach Öffnen/Entladen im ersten Dokument
Zur Veranschaulichung: Ich habe zwei Dokumente, "Doc a" und "Doc b". Ich öffne beide Dokumente, wähle dann 'doc a', öffne das Benutzerformular mit einem show userform-Makro, gebe meine Daten ein und drücke entweder 'Okay' oder 'Abbrechen' (beide zum Entladen des Benutzerformulars nach dem Anklicken). Das Makro läuft, und dann wähle ich "doc b", um das Gleiche zu tun. Diesmal jedoch, wenn ich mein Makro 'show userform' ausführe, wird 'doc a' ausgewählt und das Benutzerformular wird dort geöffnet.
Das scheint ein ziemlich grundlegendes Problem zu sein, aber ich war nicht in der Lage, irgendwelche Korrekturen herauszufinden. Nachdem ich 'unload me' in meinen Button-click-Subwoofern nicht funktioniert habe, habe ich versucht, ein Entlade-Makro zu erstellen und es stattdessen von diesen Subs aus aufzurufen, aber keines von beiden funktioniert für mich. Irgendwelche Gedanken? (Auch wenn ich bereits hier bin - gibt es irgendwelche guten Tricks, um die Benutzerform mit den zuletzt gefüllten Daten automatisch zu füllen? Nicht zwischen dem Öffnen/Schließen des Wortes, für das ich einige Lösungen gesehen habe, sondern nur während das Wort offen ist, und ich bin das Umschalten zwischen aktiven Dokumenten)
Option Explicit
Option Compare Text
Private Sub UserForm_Initialize()
Folder_Name = ""
Tag_Name = ""
Checklist.Value = True
Site_Report.Value = False
Space_Check.Value = False
End Sub
Public Sub Okay_Click()
folder = Folder_Name.Text
tag = Tag_Name.Text
tagtxt = Tag_Name.Text & "[0-9]{1,}"
tagnum = Len(Tag_Name.Text)
If Checklist.Value = True Then
report_type = "cl"
Else
report_type = "sr"
End If
If Space_Check.Value = True Then
space = "yes"
Else
space = "no"
End If
If Len(Folder_Name.Text) > 0 Then
Application.Run "Mass_Hyperlink_v_5_0"
Application.Run "UnloadIt"
Else
Application.Run "UnloadIt"
End If
Unload Me
End Sub
Private Sub Cancel_Click()
Application.Run "UnloadIt"
Unload Me
End Sub
ich glaube nicht das Problem mit dem Makros ist, dass diese Userform verwendet (es auf seinem eigenen fein läuft, obwohl der Code wahrscheinlich ein bisschen abgedroschen) ist, aber hier ist der Code für eine gute Maßnahme:
Option Explicit
Option Compare Text
Public tag As String
Public tagtxt As String
Public tagnum As String
Public folder As String
Public space As String
Public report_type As String
Public Sub Mass_Hyperlink_v_5_0()
Dim fileName As String
Dim filePath As String
Dim rng As Word.Range
Dim rng2 As Word.Range
Dim fileType As String
Dim start As String
Dim temp As String
Application.ScreenUpdating = False
fileType = "jpg"
If space = "Yes" Then
start = "%20("
Else: start = "("
End If
If report_type = "cl" Then
folder = "..\Images\" & folder
Set rng = ActiveDocument.Range
Else: folder = folder
End If
If report_type = "sr" Then
folder = "Images\" & folder
Set rng = Selection.Range
Else: folder = folder
End If
Set rng2 = rng.Duplicate
'tagtxt = tag & "[0-9]{1,}"
If Len(rng) > 0 And report_type = "sr" Then
With rng.Find
.Text = tagtxt
.Forward = False
.MatchWildcards = True
.Wrap = wdFindStop
Do While .Execute(findText:=tagtxt) = True
If rng.InRange(rng2) Then
rng.Select
'Selection.start = Selection.start + Len(tag)
Selection.start = Selection.start + tagnum
'ActiveDocument.Range(Selection.start - Len(tag), Selection.start).Delete
ActiveDocument.Range(Selection.start - tagnum, Selection.start).Delete
fileName = Selection.Text
filePath = folder & "\" & Hyperlinker.Tag_Name.Text & start & fileName & ")" & "." & fileType
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, address:= _
filePath, SubAddress:="", ScreenTip:="", TextToDisplay:= _
(Hyperlinker.Tag_Name.Text & Selection.Text)
Else
Exit Sub
End If
rng.Collapse wdCollapseStart
Loop
End With
End If
If report_type = "cl" Then
With rng.Find
.Text = tagtxt
.Forward = False
.MatchWildcards = True
.Wrap = wdFindStop
Do While .Execute(findText:=tagtxt) = True
If rng.InRange(rng2) Then
rng.Select
'Selection.start = Selection.start + Len(tag)
Selection.start = Selection.start + tagnum
'ActiveDocument.Range(Selection.start - Len(tag), Selection.start).Delete
ActiveDocument.Range(Selection.start - tagnum, Selection.start).Delete
fileName = Selection.Text
filePath = folder & "\" & Hyperlinker.Tag_Name.Text & start & fileName & ")" & "." & fileType
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, address:= _
filePath, SubAddress:="", ScreenTip:="", TextToDisplay:= _
(Hyperlinker.Tag_Name.Text & Selection.Text)
Else
Exit Sub
End If
rng.Collapse wdCollapseStart
Loop
End With
End If
Application.ScreenUpdating = True
End Sub
Sub Show_Linker()
Hyperlinker.Show
Hyperlinker.Folder_Name.SetFocus
End Sub
Sub UnloadIt()
Unload Hyperlinker
End Sub
Was Hyperlinker ist? Wenn es die UserForm ist, wird die Zeile Hyperlinker.Folder_Name.SetFocus ausgelöst * nachdem * die UserForm nicht mehr angezeigt wird - 'Show' lässt diese Zeile warten, bis die UserForm fertig ist, mit dem Effekt, dass die UserForm noch aktiv ist das erste Dokument. Sollte diese Aktion nicht im Code enthalten sein, um das UserForm zu initialisieren? –
@ Cindy Lieber Gott, ich bin ein Idiot. Ich habe diese Zeile verschoben und es funktioniert wieder. Lange Rede, kurzer Sinn, ich habe die .setfocus-Zeile in einem Forum woanders nachgeschaut und glaube, dass ich es entweder falsch interpretiert oder einen schlechten Rat gelesen habe (wahrscheinlich ersteres). Vielen Dank! – Tornadospoon
"Ich kann den Wald nicht für die Bäume sehen" - ich kenne das Gefühl! Ich bin froh, dass es nichts komplizierteres war ... Es ist eigentlich keine schlechte Frage - mit VBA-Formen ist das überhaupt nicht offensichtlich ... –