2016-04-05 7 views
-1

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 
+0

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? –

+0

@ 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

+0

"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 ... –

Antwort

1

mit Benutzerformularen in VBA arbeiten kann schwierig sein, weil sie eigentlich eine Art von Klasse ist. Da VBA versucht, alles außergewöhnlich einfach zu machen, sind Klassen nicht offensichtlich, noch ist, wie man mit ihnen richtig arbeitet. Es gibt Situationen, in denen sie zu Fallen für Unvorsichtige werden.

Mit VBA können Sie also mit einer Instanz einer UserForm-Klasse arbeiten, ohne dass Sie ein neues Objekt deklarieren und instanziieren müssen, wie es normalerweise bei einem Klassenobjekt der Fall wäre. Das Ergebnis ist, dass das Objekt "herumhängen" und unerwartetes Verhalten verursachen kann, wie Sie es sehen.

Die richtigere Art, mit einem UserForm zu arbeiten, mag viel mehr Arbeit (Code zu Typ und Komplexität) erscheinen, aber es hilft, die Dinge sortiert zu halten. In der Tat würde dieser Ansatz theoretisch erlauben, ein separates Benutzerformular für verschiedene Dokumente zu haben.

Dim frmHyperlinker as Hyperlinker 
Set frmHyperlinker = New Hyperlinker 
frmHyperlinker.Folder_Name.SetFocus 
frmHyperlinker.Show 
'Execution waits... 
'Now you're done with it, so clean up 
Unload frmHyperlinker 
Set frmHyperlinker = Nothing 

Es gibt eine Antwort in dieser Diskussion, die in technischen Details geht, obwohl das Thema dieser Frage von Ihnen anders: Add Public Methods to a Userform Module in VBA

Verwandte Themen