2015-11-06 102 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的。 (像這樣的東西應該存在,但沒有真正研究它。)謝謝! –