0

所以我对VBA完全陌生。我有一个 java 迷,所以我对编程并不陌生,但是使用 VBA 操作办公室文档似乎更容易。无论如何,关于主题:

我目前正在公司中实现自动化(此示例正在创建合同)。然而,使用 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属性,因为在我看来,这就是程序对变化如此敏感的原因。

欢迎任何和所有建议。

注意:目前,合同可以有三个不同的“目标方”,这就是Select Case声明存在的原因。如果它应该增长,它将完全没用,但现在它可以工作。

4

3 回答 3

2

这是一个:

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

而且我认为最好使用书签作为占位符而不是使用 Range(start, end)

如何以编程方式更改 Word 书签的文本

于 2015-11-06T06:39:53.363 回答
0

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

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

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

于 2015-11-06T08:43:48.450 回答
0

将 Range 与数值一起使用绝对不可靠。如果这是 Word 2007 或更高版本,则为 Tim 建议的书签或内容控件。内容控件是 Microsoft 的建议,未来,但我看不出任何一种方式或另一种方式对您的目的有任何特别的优势。

查看所有 InputBox 调用,我想知道是否为输入显示 VBA 用户窗体可能不会更好?所有输入字段集中在一个地方,而不是闪烁多个提示。您可以在从屏幕上删除用户窗体之前验证输入是否正确,等等。

于 2015-11-08T07:23:28.150 回答