VBA优化健壮代码

时间:2015-11-06 06:27:14

标签: vba ms-word robustness

所以我对VBA来说是全新的。我有一个java-fetish,所以我对编程并不陌生,但是使用VBA操作Office文档似乎更容易。 无论如何,关于主题:

我目前正在自动化公司的事情(这个例子是创建合同)。然而,使用Java,我总是学会制作健壮的代码,尽管VBA代码现在有效,但我对此并不满意,因为它需要很多友好性。用户。所以我的问题是(我希望你不要介意),你能否给我一个正确的方向推动我的代码更强大?

以下是代码:

Function spaties(Name As String) As String
' Function used to ensure the length of a String (Working with Range)
Dim index As Integer

While (Len(Name) < 30)
Name = Name + " "
Wend

spaties = Name

End Function
Sub Macro3()
'
' Macro3 Macro
'
'
'ActiveDocument.Range(26101, 26102).Text = "d"
    StartUndoSaver
    Dim firma As String
    firma = InputBox("Voor welke onderaannemer? (Zonder hoofdletters)" + Chr(10) + "(nicu, sorin of marius)")
    Dim werf As String
    werf = InputBox("Over welke Werf gaat het?")
    Dim datum As String
    datum = InputBox("Op welke datum spreekt het contract? (dd/mm/yyyy)")
    With ActiveDocument
        .Range(25882, 25899).Text = datum
        ActiveDocument.Range(575, 605).Text = spaties(werf)
        ActiveDocument.Range(1279, 1309).Text = spaties(werf)
  End With

  Select Case Len(firma)
  Case 4
    With ActiveDocument
        .Range(26168, 26181).Text = "Nicu Dinita"
        .Range(26062, 26088).Text = "Badi Woodconstruct SRL"
        .Range(11359, 11371).Text = "Nicu Dinita"

  End With
  Case 5
    With ActiveDocument
        .Range(26168, 26181).Text = "Asavei Sorin"
        .Range(26062, 26088).Text = "BELRO  INTERIOR DESIGN SRL"
        .Range(11359, 11371).Text = "Asavei Sorin"

  End With
  Case 6
    With ActiveDocument
        .Range(26168, 26181).Text = "Ivan Maricel"
        .Range(26062, 26088).Text = "Solomon & Aaron Construct"
        .Range(11359, 11371).Text = "Ivan Maricel"

  End With

  End Select
    Dim prijs As String
    Dim besch As String
    Dim eenh As String

     Dim hoev As Integer
     hoev = InputBox("Hoeveel artikels zijn er?")
    Dim index As Integer
    index = 1
    While (index <= hoev)
    besch = InputBox("Beschrijving van het artikel (engels)")
    prijs = InputBox("prijs van het artikel")
    eenh = InputBox("Eenheid van het artikel")

    With ActiveDocument
        .Range(5701, 5702).Text = "" + vbTab + spaties2(besch, prijs, eenh) + Chr(10) + vbTab
    End With
    index = index + 1
    Wend
        With ActiveDocument.Sections(1)
    .Headers(wdHeaderFooterPrimary).Range.Text = "Raes G. Schrijnwerken BVBA" + vbTab + vbTab + datum + Chr(10) + "Robert Klingstraat 5" + Chr(10) + "8940 Wervik"
    .Footers(wdHeaderFooterPrimary).Range.Text = "Overeenkomst tot onderaanneming" + Chr(10) + "met betrekking tot:" + werf
    .Footers(wdHeaderFooterPrimary).PageNumbers.Add PageNumberAlignment:=wdAlignPageNumberRight
End With
    If firma = "sorin" Then
        ActiveDocument.Range(254, 255).ImportFragment "Z:\Raes Netwerk DATA\professioneel\004 Sjablonen\belro.docx", False


    Else
        If firma = "nicu" Then
        With ActiveDocument
            .Range(254, 255).ImportFragment "Z:\Raes Netwerk DATA\professioneel\004 Sjablonen\Nicu.docx", False
            End With
        Else
            If firma = "marius" Then
                ActiveDocument.Range(254, 255).ImportFragment "Z:\Raes Netwerk DATA\professioneel\004 Sjablonen\Marius.docx", False
            End If
        End If
    End If

    ActiveDocument.PrintOut
    ActiveDocument.PrintOut



End Sub
Function spaties2(artikel As String, prijs As String, eenh As String) As String
'Another function to ensure length of String
Dim index As Integer
Dim eind As String
eind = "" + artikel + vbTab + vbTab + prijs + "€/" + eenh
While (Len(eind) < 100)
eind = eind + " "
Wend

spaties2 = eind

End Function

如您所见,代码非常基本。虽然它有效,但交付并不好。

两个定义的Functions只是简单地格式化用户的字符串,因为显然某些东西的名称长度并不总是相同。

我想删除Range属性,因为在我看来,这是使程序对变化如此敏感的原因。

欢迎任何和所有建议。

注意:目前,合同可以包含三个不同的目标方&#39;这就是Select Case陈述存在的原因。如果它应该增长它将完全无用但现在它可以工作。

3 个答案:

答案 0 :(得分:2)

这是一个:

sName = Left(sName & Space(30), 30)

我认为最好使用书签作为占位符而不是使用Range(开始,结束)

How to change programmatically the text of a Word Bookmark

答案 1 :(得分:0)

我认为你的代码需要一些修剪,以避免名称前后的错误空格(当你使用一些输入框时,我的意思是)。 而且您还需要验证输入日期。 对于字符串连接,请使用&符号(&amp;)优于加号(+),以避免错误的总和。 而不是Chr(10)我提出了一些建议,以使您的代码更具可读性:

Chr(13) = vbCr
Chr(10) = vbLf
Chr(13) & Chr(10) = vbCrLf

验证您指示的文件是否存在。

答案 2 :(得分:0)

将Range与数值一起使用绝对不可靠。书签,如Tim建议或内容控制,如果这是Word 2007或更高版本。内容控制是Microsoft的推荐,未来,但我不会以任何方式看到任何特定的优势。

查看所有的InputBox调用我不得不怀疑是否为输入显示VBA UserForm可能不是更好?所有输入字段都在一个地方,而不是闪烁多个提示。您可以在从屏幕上删除UserForm之前验证输入是否正确