Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11全般 : Word 2021)
文字入力時に発生するイベント
投稿日時: 22/07/07 22:11:39
投稿者: ta1chn

wordの表において特定のセルに値を入力した際にマクロを実行することは可能でしょうか。
例として下図の表で体温の項目で37以上の値を入力すると文字色が赤くなるようにしたいです。
 
-----------------------------
| 日付 | 症状  |体温(℃)|
-----------------------------
|2022.7.7| な し | 36.0 |
-----------------------------
|2022.7.8| 鼻 水 | 36.5 |
-----------------------------
|2022.7.9| 吐き気 | 37.2 |
-----------------------------
 
excelの条件付き書式を用いれば簡単に実現できると思いますがwordでも同様にできないのかと思い投稿いたしました。どうぞよろしくお願いいたします。

回答
投稿日時: 22/07/08 09:08:05
投稿者: Suzu

イベントハンドラ イベントプロシージャ を使い、できるかも 知れませんが、当方には判りません。
 
Wordの表使用するのではなく、Excelワークシートを入れ、条件付き書式を使用すれば簡単ですが
頻繁に 変更を行う用途でしょうから、ワークシート をアクティブにしないと入力できませんから
ユーザー的には面倒でしょう。
 
 
イベントにこだわらず、右クリック等に 当該マクロを仕込む方が現実的かと。
 
 
どうしても「更新後」に自動で判定をしたいなら、Excel で資料を作り直すかです。

回答
投稿日時: 22/07/08 14:36:31
投稿者: sk

引用:
文字入力時に発生するイベント

まず、上記のイベントは Word.Application オブジェクトや
Word.Document オブジェクトではサポートされていません。
 
引用:
wordの表において特定のセルに値を入力した際に
マクロを実行することは可能でしょうか。

Word.Table オブジェクトや Word.Cell オブジェクトについては
イベント自体がありません。
(表もセルも、あくまで「文書を構成する要素(パーツ)」であって
「インターフェース」ではありませんから、まあ当然です)
 
引用:
例として下図の表で体温の項目で37以上の値を入力すると
文字色が赤くなるようにしたいです。

どうしても何らかのイベントの発生時にその処理が
自動的に実行されるようにしたいということであれば、
Word.Application オブジェクトの DocumentBeforeSave イベント
(文書が保存される前)でその処理を実行するようにされた方が
無難ではないかと。
 
他の代替策としては、例えば「その表の 3 列目の各セルに
あらかじめテキストコンテンツコントロールを埋め込んでおき、
Word.Document オブジェクトの ContentControlOnExit イベントの
発生時にテキストコンテンツコントロールのフォント書式を
制御する」といったものが挙げられますが、その表に新しい行が
挿入されるたびに新たなテキストコンテンツコントロールを
挿入しなければならなくなるという問題が生じますので、
お奨めは出来ません。

回答
投稿日時: 22/07/08 16:43:58
投稿者: sk

追記:
 

引用:
その表に新しい行が挿入されるたびに
新たなテキストコンテンツコントロールを
挿入しなければならなくなるという問題

これに関しては、セクションコンテンツ繰り返しコントロールを
使ってもよいなら一応なんとかなりますね。

回答
投稿日時: 22/07/09 09:47:13
投稿者: んなっと

あまりよくないけど、とりあえずイベントを使う方法。表の3列目対象。
  
●ThisDocumentに
  
Dim X As Class1
Private Sub Document_Open()
  Set X = New Class1
  Set X.App = Application
End Sub
Private Sub Document_Close()
  Set X = Nothing
End Sub
  
  
●挿入→クラスモジュールに
  
Public WithEvents App As Application
Dim OldRng As Range
Private Sub App_WindowSelectionChange(ByVal Sel As Selection)
  Dim Rng As Range
  Dim Flg As Boolean
  If Not OldRng Is Nothing Then
    With OldRng
      If .Information(wdWithInTable) Then
        If .Information(wdEndOfRangeColumnNumber) = 3 Then
          Set Rng = .Cells(1).Range
          Rng.MoveEnd , -1
          If IsNumeric(Rng.Text) Then
            If Val(Rng.Text) >= 37 Then
              Flg = True
            End If
          End If
        End If
      End If
    End With
  End If
  If Not Rng Is Nothing Then
    If Flg = True Then
      Rng.Font.ColorIndex = wdRed
    Else
      Rng.Font.ColorIndex = wdAuto
    End If
  End If
  Set OldRng = Sel.Range
End Sub
 
  
*.docmでいったん保存して閉じる→開く

投稿日時: 22/07/11 08:24:37
投稿者: ta1chn

Suzu様 sk様
ご返事ありがとうございます。
やはりそういった処理は元々wordでは意図されていないのですね。
わざわざ表操作をワードで行うメリットがメリットもないですし。
 
 
んなっと様
ご返事ありがとうございます。
クラスモジュールにてExcelでいうworkseatchangeを追加するようなイメージでしょうか。
wordでの処理で可能性を広げることが出来ないのかと思い投稿させて頂きましたが、wordでこんなことできるんだと素直に感動いたしました。
ご活用させて頂きます、ありがとうございました。

投稿日時: 22/07/21 23:18:30
投稿者: ta1chn

ta1chn さんの引用:
Suzu様 sk様
ご返事ありがとうございます。
やはりそういった処理は元々wordでは意図されていないのですね。
わざわざ表操作をワードで行うメリットがメリットもないですし。
 
 
んなっと様
ご返事ありがとうございます。
クラスモジュールにてExcelでいうworkseatchangeを追加するようなイメージでしょうか。
wordでの処理で可能性を広げることが出来ないのかと思い投稿させて頂きましたが、wordでこんなことできるんだと素直に感動いたしました。
ご活用させて頂きます、ありがとうございました。