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明らかに何かの名前が常に同じ長さであるとは限らないため、定義された2つは単にユーザーの文字列をフォーマットしています。

Range私の意見では、それがプログラムを変更に非常に敏感にする理由なので、プロパティを削除したいと思います。

あらゆる提案を歓迎します。

注: 現時点では、契約には 3 つの異なる「対象者」が含まれる可能性があるため、このSelect Caseステートメントが存在します。大きくなったら全然ダメだけど、今のところは大丈夫。

4

3 に答える 3

2

ここに1つあります:

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

Range(start, end) を使用する代わりに、ブックマークをプレースホルダーとして使用する方が良いと思います

Word ブックマークのテキストをプログラムで変更する方法

于 2015-11-06T06:39:53.363 に答える
0

数値で範囲を使用することは、間違いなく信頼できません。これがWord 2007以降の場合、Timが示唆するブックマークまたはコンテンツコントロール。コンテンツ コントロールは、Microsoft の今後の推奨事項ですが、いずれにしても、あなたの目的にとって特に利点があるとは思いません。

すべての InputBox 呼び出しを見て、入力用に VBA UserForm を表示する方がよいのではないかと考えなければなりません。複数のプロンプトを点滅させるのではなく、すべての入力フィールドを 1 か所にまとめます。UserForm が画面から削除される前などに、正しい入力を検証できます。

于 2015-11-08T07:23:28.150 に答える