2017-03-16 14 views
0

Ich versuche, ein Benutzerformular in VBA auf Microsoft Word zu erstellen. Ich habe http://gregmaxey.com/word_tip_pages/create_employ_userform.html verfolgt, um das Formular zu erstellen.WORD VBA - Userform - Auto füllen

Ich bin sehr, sehr, sehr neu im Programmieren und habe mich im Grunde nur selbst unterrichtet, wie ich gehe.

Ich erhalte einen „Fehler kompilieren: Sub der Funktion nicht definiert“, wenn ich versuche, und Schritt für Schritt durch Anruf UF

ich den ganzen Code angehängt haben für Sie zu sehen und mir sagen, wo ich falsch gegangen , glücklich für irgendwelche Vorschläge.

Module - modMain

Option Explicit 
Sub Autonew() 
Create_Reset_Variables 
Call UF 
lbl_Exit: 
Exit Sub 
End Sub 

Sub Create_Reset_Variables() 
With ActiveDocument.Variables 
    .Item("varFormNumber").Value = " " 
    .Item("varTitle").Value = " " 
    .Item("varGivenName").Value = " " 
    .Item("varFamilyName").Value = " " 
    .Item("varStreet").Value = " " 
    .Item("varSuburb").Value = " " 
    .Item("varState ").Value = " " 
    .Item("varPostCode").Value = " " 
    .Item("varInterviewDate").Value = " " 
    End With 
    myUpdateFields 
lbl_Exit: 
    Exit Sub 
End Sub 



Sub myUpdateFields() 
Dim oStyRng As Word.Range 
Dim iLink As Long 
iLink = ActiveDocument.Sections(1).Headers(1).Range.StoryType 
For Each oStyRng In ActiveDocument.StoryRanges 
    Do 
    oStyRng.Fields.Update 
    Set oStyRng = oStyRng.NextStoryRange 
    Loop Until oStyRng Is Nothing 
Next 
End Sub 

Form - frmLetter13

Option Explicit 
Public boolProceed As Boolean 


Sub CalUF() 
Dim oFrm As frmLetter13 
Dim oVars As Word.Variables 
Dim strTemp As String 
Dim oRng As Word.Range 
Dim i As Long 
Dim strMultiSel As String 
    Set oVars = ActiveDocument.Variables 
    Set oFrm = New frmLetter13 
    With oFrm 
    .Show 
    If .boolProceed Then 
     oVars("varFormNumber").Value = TextBoxFormNumber 
     oVars("varTitle").Value = ComboBoxTitle 
     oVars("varGivenName").Value = TextBoxGivenName 
     oVars("varFamilyName").Value = TextBoxFamilyName 
     oVars("varStreet").Value = TextBoxStreet 
     oVars("varSuburb").Value = TextBoxSuburb 
     oVars("varState").Value = ComboBoxState 
     oVars("varPostCode").Value = TextBoxPostCode 
     oVars("varInterviewDate").Value = TextBoxInterviewDate 
    End If 
    Unload oFrm 
    Set oFrm = Nothing 
    Set oVars = Nothing 
    Set oRng = Nothing 
lbl_Exit 
    Exit Sub 
End Sub 

Private Sub TextBoxFormNumber_Change() 

End Sub 

Private Sub Userform_Initialize() 
    With ComboBoxTitle 
     .AddItem "Mr" 
     .AddItem "Mrs" 
     .AddItem "Miss" 
     .AddItem "Ms" 
    End With 
    With ComboBoxState 
     .AddItem "QLD" 
     .AddItem "NSW" 
     .AddItem "ACT" 
     .AddItem "VIC" 
     .AddItem "TAS" 
     .AddItem "SA" 
     .AddItem "WA" 
     .AddItem "NT" 
    End With 
lbl_Exit: 
Exit Sub 
End Sub 

Private Sub CommandButtonCancel_Click() 
Me.Hide 
End Sub 

Private Sub CommandButtonClear_Click() 
Me.Hide 
End Sub 

Private Sub CommandButtonOk_Click() 
    Select Case "" 
    Case Me.TextBoxFormNumber 
     MsgBox "Please enter the form number." 
     Me.TextBoxFormNumber.SetFocus 
     Exit Sub 
    Case Me.ComboBoxTitle 
     MsgBox "Please enter the Applicant's title." 
     Me.ComboBoxTitle.SetFocus 
     Exit Sub 
    Case Me.TextBoxGivenName 
     MsgBox "Please enter the Applicant's given name." 
     Me.TextBoxGivenName.SetFocus 
     Exit Sub 
    Case Me.TextBoxFamilyName 
     MsgBox "Please enter the Applicant's family name." 
     Me.TextBoxFamilyName.SetFocus 
     Exit Sub 
    Case Me.TextBoxStreet 
     MsgBox "Please enter the street address." 
     Me.TextBoxStreet.SetFocus 
     Exit Sub 
    Case Me.TextBoxSuburb 
     MsgBox "Please enter the suburb." 
     Me.TextBoxSuburb.SetFocus 
     Exit Sub 
    Case Me.ComboBoxState 
     MsgBox "Please enter the state." 
     Me.ComboBoxState.SetFocus 
     Exit Sub 
    Case Me.TextBoxPostCode 
     MsgBox "Please enter the postcode." 
     Me.TextBoxPostCode.SetFocus 
     Exit Sub 
    Case Me.TextBoxInterviewDate 
     MsgBox "Please enter the interview date." 
     Me.TextBoxInterviewDate.SetFocus 
     Exit Sub 
    End Select 
'Set value of a public variable declared at the form level.' 
    Me.boolProceed = True 
    Me.Hide 
lbl_Exit: 
    Exit Sub 
End Sub 

Antwort

1

Es gibt ein paar Probleme hier.

Das erste Problem ist, dass Sie keine Routine namens UF für Call UF aufrufen haben.

Die Routine, die Sie CalUF genannt haben, sollte nicht im Code für das UserForm sein, aber sollte in ModMain sein und CallUF umbenannt werden.

Sie müssen keinen Ausgangspunkt in Ihre Routine einfügen, da Sie keinen Fehlerhandler haben.

Ihre AutoNew Routine könnte neu geschrieben werden als:

Sub Autonew() 
Create_Reset_Variables 
CallUF 
End Sub 
+0

Danke für das Update - Immer wenn ich durch den Code gehe ich bekomme einen Fehler bei der Kompilierung 'Create_Reset_Variables' irgendwelche Vorschläge? –

+0

Ich erhalte mit dem von Ihnen geposteten Code keinen Kompilierungsfehler. –

1

ich Ihre sub myUpdateFields für Sie kommentiert haben.

Sub myUpdateFields() Dim oStyRng As Word.Range Dim iLink As Long

iLink = ActiveDocument.Sections(1).Headers(1).Range.StoryType 
' logically, iLink should be the StoryType of the first header in Section 1 
' Why would this be needed in all StoryRanges? 
' Anyway, it is never used. Why have it, then? 

' This loops through all the StoryRanges 
For Each oStyRng In ActiveDocument.StoryRanges 

    ' This also loops through all the StoryRanges 
    Do 
     oStyRng.Fields.Update 
     Set oStyRng = oStyRng.NextStoryRange 
    Loop Until oStyRng Is Nothing 
    'And after you have looped through all the StoryRanges 

    ' Here you go back and start all over again. 
Next oStyRng End Sub 

Offen gesagt, ich weiß nicht, ob die Do-Schleife hier etwas tut. Vielleicht tut es das. Lesen Sie mehr über die NextStoryRangeproperty here. Ich weiß auch nicht, ob die Verwendung der gleichen Objektvariable in der inneren Schleife die äußere Schleife stört. Ich kenne diese Dinge nicht, weil ich sie nie kennen musste. Deshalb frage ich mich, warum du sie an deinem zweiten Schultag brauchst.

Sie legen eine Anzahl von Dokumentvariablen fest. Diese könnten mit REF-Feldern in Ihrem Dokument verknüpft sein, das Sie aktualisieren möchten. Ich wette, Ihr Dokument hat nur einen Abschnitt, keine Fußnoten und keine Textfelder mit Feldern darin. Daher denke ich, dass der folgende Code alles Notwendige tun sollte, wenn nicht mehr.

Sub myUpdateFields2() 

    Dim Rng As Word.Range 

    For Each Rng In ActiveDocument.StoryRanges 
     Rng.Fields.Update 
    Next Rng 
End Sub 

Für Sie ist der große Vorteil dieses Codes, dass Sie es vollständig verstehen. Zu diesem Zweck habe ich es vermieden, einen Namen wie oStyRng (vermutlich "StoryRange Object") zu verwenden. Es ist wahr, dass ein ein Objekt ist. Es stimmt auch, dass die Prozedur dieser Variablen einen StoryRange Typ Range zuweist. Aber die übergeordnete Wahrheit ist, dass es ein und daher ein Range ist. Code wird einfacher zu lesen sein, wenn Sie einen Spaten ein Spaten nennen, und nicht "Metallobjekt für das Graben von Erde". Mein bevorzugter Variablenname für eine ist daher "Rng". Aber - nur zu sagen. Verwenden Sie auf jeden Fall Namen für Ihre Variablen, die Ihnen das Lesen Ihres Codes erleichtern.

Verwandte Themen