2017-03-16 4 views
0

Microsoft Word에서 VBA로 사용자 양식을 만들려고합니다. 나는 양식을 만들기 위해 http://gregmaxey.com/word_tip_pages/create_employ_userform.html 을 팔로우하고 있습니다.WORD VBA - 사용자 양식 - 자동 채우기

나는 매우 프로그래밍에 익숙하지 않고 기본적으로 나 자신을 가르쳤다.

내가 얻을 "컴파일 오류 : 정의되지 않은 함수의 하위"나는 시도하고 난 당신을보고 내가 잘못 갔어요 어디 있는지 말해위한 전체 코드를 첨부했습니다

전화 UF를 단계별로 할 때 어떤 제안이라도 기쁘게 생각합니다.

모듈 - 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 

양식 - 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 

답변

1

여기에 문제의 몇 가지가 있습니다.

첫 번째 문제는 호출하려면 Call UF에 UF라는 루틴이 없다는 것입니다.

CalUF이라는 루틴은 사용자 정의 폼의 코드에 없어야하지만 modMain에 있어야하며 CallUF으로 이름이 바뀌어야합니다.

오류 핸들러가 없으므로 루틴에 종료점을 포함 할 필요가 없습니다. 내가 당신을 위해 당신의 sub myUpdateFields 댓글을 달았습니다

Sub Autonew() 
Create_Reset_Variables 
CallUF 
End Sub 
+0

덕분에 - 나는 코드를 단계별로 때마다 나는 'Create_Reset_Variables' 제안에 컴파일 오류가? –

+0

게시 한 코드로 컴파일 오류가 발생하지 않습니다. –

1

:로

귀하의 AutoNew 루틴

는 다시 작성할 수 있습니다.

솔직히 Do 루프가 여기에 어떤 작업을하는지 알 수 없습니다. 아마도 그럴 것이다. NextStoryRangeproperty here에 대해 읽어보십시오. 또한 내부 루프에서 동일한 객체 변수를 사용하면 외부 루프가 뒤죽박죽이되는지 알 수 없습니다. 나는 그 (것)들을 알 필요가 없기 때문에 나는이 일을 모른다. 그래서 나는 학교에서 둘째 날 왜 필요로하는지 궁금합니다.

많은 문서 변수를 설정하고 있습니다. 이것들은 업데이트하려는 문서의 REF 필드에 링크 될 수 있습니다. 나는 당신의 문서가 단 하나의 섹션과 각주가없고 필드가있는 텍스트 상자가 없을 것이라고 확신한다. 따라서 다음 코드는 더 이상 필요하지 않은 모든 작업을 수행해야한다고 생각합니다.

Sub myUpdateFields2() 

    Dim Rng As Word.Range 

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

여러분에게이 코드의 큰 장점은 완전히 이해한다는 것입니다. 이 목적을 위해 oStyRng (아마도 "StoryRange Object"를 의미 함)와 같은 이름을 사용하는 것을 피했습니다. Word.Range이 개체라는 것은 사실입니다. 프로 시저가 StoryRange 유형 Range을이 변수에 할당하는 것도 사실입니다. 그러나 over-riding 진실은 Word.Range이고 그러므로 Range이다이다. 스페이드를 스페이드라고 부르면 "지구를 파는 금속 물체"가 아니라 코드를 읽기가 쉬울 것입니다. 따라서 Word.Range에 대한 선호 변수 이름은 "Rng"입니다. 하지만 - 그냥 말하는거야. 꼭 자신의 코드를 쉽게 읽을 수 있도록 변수의 이름을 사용하십시오.업데이트에 대한