2017-07-20 21 views
0

Word 2013文書には、7〜100以上のテキストセクションが含まれています。簡単にするために、私はそれらをbiosと呼ぶでしょう。 ゴール:それぞれのドロップダウンボックスに3つのオプションを入力し、選択した後に選択を集計します。 私はVBAの初心者です。私がこれまでに持っているものは:コンテンツコントロールを追加してユーザーの選択内容を取得する

Sub AddStateDropDown() 
Dim Counter As Integer 
Dim sum As Integer 
Dim maxnumber As Integer 
sum = 0 
Counter = 1 
maxnumber = 31 

私の "遊び場"の文書には31のBIOSがあります。

For Counter = 1 To maxnumber Step 1 

sum = Counter + sum 
Selection.Range.ContentControls.Add (wdContentControlDropdownList) 
Selection.ParentContentControl.Title = "Bio " & sum 
Selection.ParentContentControl.Tag = "Approval" & sum 
Selection.ParentContentControl.DropdownListEntries.Clear 
Selection.ParentContentControl.DropdownListEntries.Add Text:="Approve", _ 
    Value:="Approve" 
Selection.ParentContentControl.DropdownListEntries.Add Text:="Hold", Value _ 
    :="Hold" 
Selection.ParentContentControl.DropdownListEntries.Add Text:="Delete", _ 
    Value:="Delete" 
Next Counter 
End Sub 

残念ながら、これはエラーになり、「実行時エラー 『4605』:。現在の選択は、部分的にプレーンテキストコンテンツコントロールをカバーしているため、このメソッドまたはプロパティは使用できません」 の最高に私の知る限り、これはコンテンツコントロールの利用可能なスペースに関する懸念ですが、マクロを起動するときにカーソルの上、下、または横の空き領域に関係なく、このエラーが発生します。

最終的な集計のために、このようにタグやタイトルに番号をつけようとしています。私が理解するように、選択した値を復元するにはSelectContentControlsByTagまたはSelectContentControlsByTitleを使用する必要があります。誰もが、好ましくは、特定の単語や語句(BIOS全体にそれらを広めるために何か)

2)取得の各インスタンスの後に、複数の差別化コンテンツコントロールを追加する)私は

1のハードルを克服する助けてもらえこれらのコンテンツコントロールの情報

ありがとうございます! StackOverflowは私の初心者のVBA実験に非常に役立っていますが、今度は自分の質問を書かなくてはなりません。

+0

これは大きなプロジェクトです。私は婚約することなく助けを提供する方法を知らない。したがって、私は助けを提供する前にあなたのソリューションを購読する必要があります。結果の様子を説明してください。ドキュメントのすべてのバイオにドロップダウンがありますか?選択したコメントが表示された結果が印刷されますか?集計する値が表示されます(たとえば、Approve = 3、Hold = 1、Delete = 0)。どのようにして合計が表示されますか? – Variatus

+0

以下の代替案を検討してください。 (A)コンテンツコントロールの代わりに "コメント"という単語を使用します。あなたは何らかの形でそれらを半自動化するかもしれません。 (B)単一のコンテンツコントロールを使用して現在の選択肢の横に表示し、その結果を別の「レポートドキュメント」に書き込み、選択が完了したことを示すために選択を色づけします。 (C)好きなときにNextボタンとBackボタンを使って、一度に1つずつBIOSを呼び出すことができるユーザーフォームを作成し、文書に(テキストまたはコメントとして)コメントを書くか、または「レポート文書」に書きます。 – Variatus

+0

すべてのバイオにドロップダウンがありますが、何も印刷する必要はありません。ラベルの背後にある値は表示する必要はありません。これの主な目的は、各生物の選択を示すテーブル/ Excelを作成し、各選択のカウントを計算することです。現時点では、個々のバイオの一意の識別子に手動でコメントを追加し、そのコメントを別のExcelで手動で集計することが実践されています。私は、最終目標を達成できる限り、コメントを使用することに反対していませんが、どのようにしてそれを働かせることができるのか分かりません。 –

答えて

0

週がほとんどなくなっています。いくつかの進歩を遂げる時です。次のコードを、テスト用のBIOSでドキュメントのコピーの標準モジュールにコピーしてください。

Option Explicit 

Enum Ncb      ' Context button 
    ' 27 Jul 2017 
    NcbCap 
    NcbCmd 
    NcbEvaluate = 0 
    NcbApprove 
    NcbReject 
    NcbHold 
    NcbReport 
    NcbA = 80 
    NcbH = 87 
    NcbR = 97 
    NcbRep = 720 
End Enum 

Private Sub DelContextControl() 
    ' 06 Oct 2016 

    ' =================================================== 
    '  Use this sub to DELETE the context control 
    ' =================================================== 

    Dim Doc As Document 
    Dim Ctl As CommandBarControl 
    Dim Del As Boolean 

    Set Doc = ActiveDocument 
    CustomizationContext = Doc 
    Do 
     Set Ctl = CommandBars("Text").Controls(1) 
     Del = (Ctl.Tag = BtnSpecs(NcbEvaluate, NcbCap)) 
     If Del Then Ctl.Delete 
    Loop While Del 
End Sub 

Private Sub TestSet() 

    ' =================================================== 
    '  Use this sub to SET the context control 
    ' =================================================== 

    SetContextControl ActiveDocument 
End Sub 
Sub SetContextControl(Doc As Document) 
    ' 27 Jul 2017 

    Dim Cbar As CommandBar 
    Dim Bctl As CommandBarControl 
    Dim Fid As Variant 
    Dim i As Long 

    CustomizationContext = Doc 
    Set Cbar = CommandBars("Text") 

    Set Bctl = Cbar.Controls(1) 
    If Not (Bctl.Tag = BtnSpecs(NcbEvaluate, NcbCap)) Then 
     Set Bctl = Cbar.Controls.Add(msoControlPopup, , , 1) 
     With Bctl 
      .Caption = BtnSpecs(NcbEvaluate, NcbCap) 
      .Tag = BtnSpecs(NcbEvaluate, NcbCap) 
      .BeginGroup = True 

      Fid = Array(NcbA, NcbR, NcbH, NcbRep) 
      For i = NcbApprove To NcbReport 
       With .Controls.Add(Type:=msoControlButton) 
        .Caption = BtnSpecs(i, NcbCap) 
        .FaceId = Fid(i - NcbApprove) 
        .OnAction = BtnSpecs(i, NcbCmd) 
       End With 
      Next i 
     End With 
    End If 
End Sub 

Private Function BtnSpecs(Bid As Ncb, _ 
          Cid As Ncb) As String 
    ' 27 Jul 2017 

    Dim Specs As String 

    Select Case Cid 
     Case NcbCap 
      Specs = "Evaluate Bios,Approve,Reject,Hold,Report" 
     Case NcbCmd 
      Specs = ",Approve,Reject,Hold,Report" 
    End Select 

    BtnSpecs = Split(Specs, ",")(Bid) 
End Function 

Sub Approve() 
    ' 27 Jul 2017 
    WriteComment NcbApprove 
End Sub 

Sub Hold() 
    ' 27 Jul 2017 
    WriteComment NcbHold 
End Sub 

Sub Reject() 
    ' 27 Jul 2017 
    WriteComment NcbReject 
End Sub 

Private Sub WriteComment(TxtId As Ncb) 
    ' 27 Jul 2017 
    ActiveDocument.Comments.Add Selection.Range, UCase(BtnSpecs(TxtId, NcbCap)) 
End Sub 

Sub Report() 
    ' 27 Jul 2017 
    MsgBox "Create the report" 
End Sub 

手順TestSet(F5)を実行します。この手順では、サブSetContextControlを呼び出します。おそらく将来的にはより良い方法を見つけることができるので、それは「テスト」です。私はActiveDocumentの使い方が嫌いです(間違った文書で実行すると多大なダメージを与えるかもしれません)。また、ユーザーがF5を押すのが好きではありません。

この手順では、ActiveDocumentのコンテンツのコンテキストメニュー(本文とヘッダーとフッターを除く)をコンテキストメニューに追加します。なんらかの理由でコントロールを削除する場合は、サブDelContextControlを実行します。コントロールは、アプリケーションではなく、インストールされているドキュメントで使用できることに注意してください。ドキュメントに残したい場合は、保存する必要があります。

コンテキストメニューは、ドキュメントの本文内を意味する範囲内で右クリックすると利用できます。別の場所で操作しているときに右クリックすると、別のコンテキストメニューが表示されます。コードが追加しているコントロールは、メニューの最初のものです。それは "評価するBios"と呼ばれています。このコントロールに関するすべてが交渉可能であることに注意してください。それはすべてコードの中にあります。それらのすべてはあなたの好みまたは要件に変更することができます。

コントロールはポップアップタイプです。つまり、右にドロップダウンが開きます。そこで、「承認」、「拒否」、「保留」、または「レポート」を選択できます。最初の3つの選択肢のいずれかをクリックすると、示された内容でコメントが追加されます。 4番目のボタンをクリックすると、次のタスクが思い出されます。

Wordは、Rangeにコメントを添付します。このコードでは、この目的でSelection.Rangeが使用されています。したがって、コメントを挿入する前に、バイオのタイトルまたは一意のIDを選択することができます。あなたの選択を慎重にしていない場合は、間違ったバイオにコメントを添付することがあります。これは改善されるかもしれない1つの領域です。

別の領域は複数のコメントの問題です。コメントはコメント投稿者を特定するので、実際には複数のコメントが必要な場合があります。そうでない場合は、1つのコメントごとに1つのコメントしか存在しないようにすることができます。この問題は、StackOverflowで処理されました。in VBA (word) how do I add a comment to a range only if no comments exist?

ワークフローによっては、ドキュメントをセクションごとに1つのセクションに分割する必要があります。私はそれが必須ではないことを願っていますが、そうであれば、おそらくコンテキストコントロールがインストールされると同時に、コメントのためにドキュメントを準備するときに行われるかもしれません。

同様に、レポートを作成するのと同じコードでコンテキストコントロールを削除することができます。これは、文書を(おそらく最初からテンプレートから)作成し、テスト文書のすべてのコメントをループし、その性質を数え、その結果を新しいレポート文書に書き込むことを含む。それは難しいことではありませんが、別の日の仕事です。

ところで、私はあなたがコメントの使用を拒否したことを思い出しています。使いやすさがこのシステムを納得させることができない場合は、Wordが提供する機能を探してコメントを非表示にしてください。しかし、それでもあなたが納得しない場合は、コメントを作成する同じマクロが全く異なることを行うことができます。つまり、コンテキストメニューで提供される使いやすさを維持できます。可能性の欠如はありませんが、言葉のコメントのように即座にコメント作成者と生物学と評価の関連を見えるようにするには、上記より多くのプログラミングが必要です。

関連する問題