2015-11-06 105 views
0

所以我完全是VBA的新手。我有一个java-fetish,所以我并不陌生编程,但使用VBA处理Office文档似乎更容易。 无论如何,在主题: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声明在那里。如果它应该增长,它将是完全无用的,但现在它可以工作。

+0

如果代码正在工作并且只需要改进,那么不应该在[代码评论](http://codereview.stackexchange .com /)? –

+0

@VincentG也许你是对的...我可以移动它吗? (真的新手堆栈溢出...) –

回答

2

这里有一个:

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

而且我认为这是更好地使用书签作为占位符,而不是使用范围(开始,结束)

How to change programmatically the text of a Word Bookmark

+0

我一定会看看书签,我已经读过它,它绝对看起来非常有用。感谢您的链接! –

0

我认为你的代码需要一些修剪的,为了避免错误的名称前后的空格(当你使用一些输入框,我的意思是)。 而且您还需要验证输入日期。 对于字符串连接,请使用比加号(+)更好的&符号(&),以避免错误的总和。 相反CHR(10)我有一些建议,以便使你的代码更易读:

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

验证您是否表明存在的文件。

+0

字符串连接是Java的一种习惯,我想;)但的确,最好使用&符号。一些修剪也可以帮助很多(输入后的空格在我的代码中并不重要,但在输入之前的空格可能会搞砸我的文档布局)。谢谢! –

0

对数值使用范围绝对不可靠。书签,如Tim建议的或内容控制,如果这是Word 2007或更高版本。内容控制是微软的建议,但我认为你的目的没有任何特别的优势。

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

+0

我一定会看到UserForm的。 (像这样的东西应该存在,但没有真正研究它。)谢谢! –