2017-10-22 8 views
1

私は、書面による質問にユーザーの入力を色分けするコードを書いています。私はかなりvbaに新しい、コードは正常に動作しているが、私はそれを改善したい、それはエラーを検出し、何かがドキュメントがまだ正常に機能するコードに間違っているincase。Word VBAコード改善

私は、ユーザーがドロップダウンメニューから何かを選択するか、自分の答えを書くかのどちらかの2種類の入力を持っています(通常は数字なので、文字の場合は数字の答えをトリミングする機能があります)。

例:

Q:勤務時間数? A:5(5)---->コードが値(5)をチェックし、それに基づいて「5(5)」の色が緑色に変わります。

ご協力いただきありがとうございます。

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As 
Boolean, Cancel As Boolean) 

Dim store As String 
Dim storeNum As Integer 

If ActiveDocument.Bookmarks.Exists("high") = True Then 
    store = ActiveDocument.Bookmarks("high").Range.Text 
    If store = "0" Then 
     ActiveDocument.Bookmarks("high").Range.Font.TextColor = RGB(103, 106, 110) 
    Else 
     ActiveDocument.Bookmarks("high").Range.Font.TextColor = vbRed 
    End If 
End If 

If ActiveDocument.Bookmarks.Exists("medium") = True Then 

End If 

If (ActiveDocument.Bookmarks.Exists("bidders") = True) And (ActiveDocument.Bookmarks("bidders").Range.Text <> "Number of primary bids received and alternatives") Then 
     storeNum = ExtractNumber(ActiveDocument.Bookmarks("bidders").Range) 
     If storeNum > 7 Then 
       ActiveDocument.Bookmarks("bidders").Range.Font.TextColor = RGB(0, 176, 80) 
     ElseIf (storeNum > 3) And (storeNum < 8) Then 
       ActiveDocument.Bookmarks("bidders").Range.Font.ColorIndex = wdDarkYellow 
     ElseIf storeNum < 4 Then 
      ActiveDocument.Bookmarks("bidders").Range.Font.TextColor = vbRed 
     End If 
    End If 

    For Each oContentControl In ActiveDocument.ContentControls 
    If oContentControl.Type = wdContentControlRichText Then 
     oContentControl.Range.Font.Color = RGB(103, 106, 110) 
     oContentControl.Range.Font.Name = "Trebuchet MS" 
     oContentControl.Range.Font.Size = 11 
     oContentControl.Application.ActiveDocument.Paragraphs.Alignment = wdAlignParagraphJustify 
    End If 
    Next 
ActiveDocument.Fields.Update 

End Sub 

Function ExtractNumber(rCell As Range) 
Dim iCount As Integer, i As Integer 
Dim sText As String 
Dim lNum As String 


sText = rCell 

For iCount = Len(sText) To 1 Step -1 
    If IsNumeric(Mid(sText, iCount, 1)) Then 
     i = i + 1 
     lNum = Mid(sText, iCount, 1) & lNum 
    End If 

    If i = 1 Then lNum = CInt(Mid(lNum, 1, 1)) 
Next iCount 

ExtractNumber = CLng(lNum) 
End Function 
+0

ご質問は広すぎます。エラー処理などを実装するために必要なエラーはありますか?どのようなエラーが予想されますか。助けを得るために何が間違っているのかを推測する必要があります。 –

+0

私はエラーは期待していませんが、VBAでのコーディングとその書き方をよりよく理解したいと思います。 – 1990Mustafa

答えて

1

うーん...それはそれにもかかわらず、いくつかの問題が広範な質問ですが:

If (ActiveDocument.Bookmarks.Exists("bidders") = True) And ActiveDocument.Bookmarks("bidders").Range.Text <> "Number of primary bids 
received and alternatives") Then 

との両方の部分が評価されているので。言い換えれば、ブックマーク「入札者」が存在しない場合でも、依然としてテキストを要求しているため、エラーが発生します。

良い方法は使用することです場合は、ネストされた:また、とのトラブルに遭遇することがあり

If ActiveDocument.Bookmarks.Exists("medium") = True Then 

End If 

:また

If (ActiveDocument.Bookmarks.Exists("bidders") = True) Then 
    If ActiveDocument.Bookmarks("bidders").Range.Text <> "Number of primary bids received and alternatives") Then 
     ' Your Code 
    End If 
End If 

ブロックが空の場合、これは(最高のは、それを削除します)コンテンツコントロールを使用すると、編集のためにロックすることがあります。その場合、フォントを設定しようとするとエラーが発生することがあります。、.color.size

あなたがテストし、コンテンツコントロールはこれでロックされているかどうかを設定することができます。

If activedocument.ContentControls(1).LockContents = True Then ' Prevent edit 
If activedocument.ContentControls(1).LockContentControl = True Then ' Prevent delete 
' Note you don't actually need the " = True", it is just there for clarity