テキストで作成した議事録をWordに取り込んだ後、フォーマットを整形するVBAを作成してみた(その2)テーブルの追加

前回、Word VBAを利用して文字の検索やアラインメント、文字の修飾などを実施しました。

http://k2-ornata.com/word-vba_minutes_format/

今回は、テーブル(表)を作成し、その中に日時や場所、参加者を入れ込んでみたいと思います。

1.処理イメージ

元となるデータのイメージは以下の通りです。
テキストデータをWordに取り込み、なんの修飾もしていない状態です。

元データのイメージ

また、完成形のイメージは以下の通りです。
タイトルの下にテーブルを作成し、その中に「日時」「場所」「参加者」の情報を移動させます。

VBAで加工後のデータイメージ

2.VBAのプログラム説明

ここでは前回の(その1)から変更した部分を中心に説明していきます。
前回同様、初心者なのでプログラムがダサいのはおおめに見てください。

Option Explicit

Sub editMinuts()

Dim d_tbl As Table
Dim d_exc As String
Dim d_txt As String

' Chr(10): Line Feed, Chr(13): Carriage Return
d_exc = Chr(10) & Chr(13)

With Selection.Find
    .Text = "2022."
    .MatchByte = True
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
End With

With Selection.Find
    .Text = "議事録"
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With

' 1 line forward
Selection.Move wdLine, 1

' insert return charactor
Selection.TypeParagraph

' 1 line forward
Selection.Move wdLine, 1

' create table
Set d_tbl = ActiveDocument.Tables.Add(Selection.Range, 3, 2, wdWord9TableBehavior)

' insert charactor into table
d_tbl.Cell(1, 1).Select
Selection.TypeText Text:="日時"

d_tbl.Cell(2, 1).Select
Selection.TypeText Text:="場所"

d_tbl.Cell(3, 1).Select
Selection.TypeText Text:="参加者"

' find date&time charator
With Selection.Find
    .Text = "日時:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(1, 2).Select
Selection.TypeText Text:=d_txt

' find place charator
With Selection.Find
    .Text = "場所:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(2, 2).Select
Selection.TypeText Text:=d_txt

' find attendance charator
With Selection.Find
    .Text = "参加者:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(3, 2).Select
Selection.TypeText Text:=d_txt


With Selection.Find
    .Text = "アクションアイテム:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With


With Selection.Find
    .Text = "次回:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

Selection.Move wdLine, 1

Selection.InsertBreak Type:=wdPageBreak

With Selection.Find
    .Text = "内容:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

End Sub

以下、ポイントを解説していきます。

Dim d_tbl As Table
Dim d_exc As String
Dim d_txt As String

' Chr(10): Line Feed, Chr(13): Carriage Return
d_exc = Chr(10) & Chr(13)

<解説>
最初の3行で変数を定義し、その中の一つ d_exc にLine Feed と Carriage Returnキャラクタを設定しています。
これは後ほど、カーソル位置から行末までの文字を選択する際に、改行の制御文字を含まない為の処理となっています。

' create table
Set d_tbl = ActiveDocument.Tables.Add(Selection.Range, 3, 2, wdWord9TableBehavior)

' insert charactor into table
d_tbl.Cell(1, 1).Select
Selection.TypeText Text:="日時"

d_tbl.Cell(2, 1).Select
Selection.TypeText Text:="場所"

d_tbl.Cell(3, 1).Select
Selection.TypeText Text:="参加者"

<解説>
ActiveDocument.Tables.Addの部分で3×2のテーブルを作成し、その後、それぞれの行の最初の列に「日時」「場所」「参加者」の文字を書き込んでいます。

With Selection.Find
    .Text = "日時:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

<解説>
最初のfind処理で”日時:”のところにカーソルが来ているはず?なので、その後のSelection.Moveのところで1文字分カーソルを進ませています。
なぜ1文字でよいのかよくわかっていませんが、こうするとうまくいきました。(笑

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

<解説>
Selection.EndkeyのExtend:=wdExtendで選択範囲を維持しながら、Unit:=wdLineで行末に移動しています。
また、Selection.MoveEndWhile Cset:=d_excにて、先ほどd_excに設定したキャラクタが右隣に来るまで移動させています。

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(1, 2).Select
Selection.TypeText Text:=d_txt

<解説>
d_txt = Selection.Textにて、現在選択されている範囲の文字をd_txtに取り込み、Selection.Sentences(1).Deleteでその行を消し去った後、d_txtの内容をテーブルのセル(1,2)にセットしています。

どうでしょう、なんとなくきちんとした議事録っぽくなってきた感じがしませんか?

次に機会があれば「アクションアイテム:」のところで複数行を一気に選択して表に入れる処理を作成できればと思っています。

参考サイト:

・インストラクターのネタ帳(Word VBAで表を作成・挿入する)
https://www.relief.jp/docs/word-vba-add-a-table.html
・インストラクターのネタ帳(Word VBAでカーソルを行末に移動する)
https://www.relief.jp/docs/word-vba-selection-endkey-wdline.html
・みんなのワードマクロ(【コード】選択範囲を広げるWordマクロ(2))
https://www.wordvbalab.com/code/11726/

テキストで作成した議事録をWordに取り込んだ後、フォーマットを整形するVBAを作成してみた(その1)文字検索&アラインメント

お仕事で議事録を作成するときに、まずはその場でメモを作成し、あとでWordに清書することがあると思います。

でも、メモからWordに取り込んで書式を整えるのって、結構時間がかかる割に、あまり価値のある作業ではないですよね。

そこで、今回は時短のために、テキストから取り込んだデータのフォーマットを自動的に整えるWord VBAを作成してみました。

1.変換前のWordデータ・イメージ

こちらはテキストの内容をWordに取り込んだ直後のイメージです。見た目は考えず、とりあえず打ち込んでいくとこんな感じになっていると思います。

フォーマットを整える前のデータ・イメージ

2.変換後のWordデータ・イメージ

1.の殴り書き状態からVBAを利用することで、以下の状態にフォーマットを整えさせます。

フォーマット調整後(1ページ目)

<解説>
1行目の作成日付を右寄せする。
2行目の「議事録」をタイトルとしてセンタリングする。
3行目〜9行目までの「日時:」「場所:」「参加者:」「アクションアイテム:」「次回:」を太字にする。

フォーマット調整後(2ページ目)

<解説>
10行目を次ページにした上で「内容:」を太字にする。

3.変換用VBA

そして以下がフォーマット整型用のVBAになります。(素人なので書き方がダサくてすみません。)

Option Explicit

Sub editMinuts()

With Selection.Find
    .Text = "2022."
    .MatchByte = True
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
End With

With Selection.Find
    .Text = "議事録"
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With

With Selection.Find
    .Text = "日時:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "場所:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "参加者:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "アクションアイテム:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "次回:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

Selection.Move wdLine, 1

Selection.InsertBreak Type:=wdPageBreak

With Selection.Find
    .Text = "内容:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

End Sub

4.VBAの解説

それではポイントを少し解説しておきます。
なお、かなりアバウトに勉強しながら書いているので、雰囲気で説明している部分があります。
正確にはマイクロソフトの公式サイトなどを読んでください。

最初の方の3〜10行目あたり

With Selection.Find
    .Text = "2022."
    .MatchByte = True
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
End With

<解説>
.Text = “2022.”:データの中から”2022.”を検索します。
.MatchByte = True:上記”2022.”に完全に一致する文字を検索します。(全角などはヒットしないようにしています)
.Wrap = wdFindContinue:1つ見つかっても、次を見つけにいきます。
.Execute:検索を実行します。
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight:見つかったら、それを含む行を右寄せします。

下から8〜9行目あたり

Selection.Move wdLine, 1

Selection.InsertBreak Type:=wdPageBreak

<解説>
Selection.Move wdLine, 1:一つ手前の処理で「次回:」まで検索していますので、その下に改ページを入れる為、カーソルを1行進ませます。
Selection.InsertBreak Type:=wdPageBreak:改ページを挿入します。

今回は以上になりますが、今後時間があれば、Wordに表を入れるVBAなどを作成してみたいと考えています。

PowerPointマクロで選択文字列を黒→赤→青の順に切り替える

前回、PowerPointマクロを利用して、オブジェクト内の選択文字列を赤文字に変える手順を記載しました。

http://k2-ornata.com/powerpoint_macro_strings_red/

しかしながら、この方法だと違う色にする毎にマクロを作成し、クイックアクセスツールバーに登録しなければなりません。

そこで今回は勉強も兼ねて、マクロを実行する度に色を黒→赤→青に変えるプログラムに変更してみました。

With文とIf文を使ってプログラミング

とはいえ、私はVBAについてほぼ初心者なので、With文がなんなのかよく知らず、それを調べる所から始めました。
ちなみになぜ、With文を使おうと思ったかというと、マクロの記録をしたときに、ちょくちょくWith文が使われていたからです。

With文について

どうも調べてみると、With文の中では共通のオブジェクトに対して操作が可能になるようです。

つまり、前回以下のようなプログラムを書きましたが、

Sub 文字列を赤にする()
   ActiveWindow.Selection.TextRange.Font.Color.RGB = RGB(255, 0, 0)
End Sub

With文を利用して、以下のように書き換えることが可能のようです。

Sub 色を変える()
   With ActiveWindow.Selection
      .TextRange.Font.Color.RGB = RGB(255, 0, 0)
   End With
End Sub

Withで操作するオブジェクトを指定しておくことで、End Withまで、いちいちそのオブジェクトを指定しなくて良い、というメリットがあるようです。
上の例だと1回しか操作していないのであまり意味がないですが、同じオブジェクトに対して操作する場合は、With文を使うと効率的ですね。

If文について

If文については、なんからプログラミングされたことがある方なら、どういうものかご存知だと思います。

今回は、指定した文字列が黒だったら赤、赤だったら青、黒および赤以外だったら黒に戻すというプログラムにしました。

プログラミング内容

以下が実際にプログラミングした結果は以下の通りです。

Sub 色を変える()
   
   With ActiveWindow.Selection

      If .TextRange.Font.Color.RGB = RGB(0, 0, 0) Then
         .TextRange.Font.Color.RGB = RGB(255, 0, 0)
      ElseIf .TextRange.Font.Color.RGB = RGB(255, 0, 0) Then
         .TextRange.Font.Color.RGB = RGB(0, 0, 255)
      Else
         .TextRange.Font.Color.RGB = RGB(0, 0, 0)
      End If
      
   End With

End Sub

With文を使っているとはいえ、最初にオブジェクトの宣言などをして、もう少しスッキリしたプログラムにできそうですが、今回でPower Point VBAは2回目だし、これで動いたので、とりあえず良しとしたいと思います。

もしこれからPower Point VBAを勉強しようとしている方の参考になれば幸いです。

PowerPointマクロで選択文字列を赤字にすばやく変更

Power Point編集中に選択した文字の色を変える際に、私はウィンドウの最上部にある「クイックアクセスツールバー」に「文字色の変更」を割り当てて、キー操作だけで変えれるようにしています。

ただその場合、「文字色の変更」を選択した後で毎回パレットから目的の色を選ばなければならない為、めんどうだなぁと思っていました。

Power Pointのカラーパレット

そこで今回、Power Pointの標準の機能ではなく、マクロを利用して、すぐに特定の色(今回は赤)に変更できるようにしてみました。

クイックアクセスツールバーで直接指定した色に変更

マクロ+クイックアクセスツールバーで、よく使う色をダイレクトに指定できるようになります。

なお、本当はクイックアクセスツールバーではなくショートカットキーでマクロを実行させたかったのですが、どうやらPower Pointでは簡単ではないようです。

1.マクロを作成

Power Pointのツールバーから「開発」(表示されていない場合は、「ファイル」-「オプション」-「リボンのユーザ設定」から表示させることが可能。)を選択し、リボンから「マクロ」を選択します。

Power Poiint

「マクロ」を選択すると以下のポップアップが表示されますので、マクロ名を新規に入力し、「作成」ボタンを押します。

マクロポップアップ

すると、マクロのエディタ画面が表示されますので、文字色を赤に変えるマクロを記述します。

マクロ・エディタ画面

マクロの記述内容としては、Sub と End Subの間に以下のとおり、1行追加するだけです。

Sub 文字列を赤にする()
   ActiveWindow.Selection.TextRange.Font.Color.RGB = RGB(255, 0, 0)
End Sub

マクロの記述が終わったら、セーブしてウィンドウを閉じます。

2.クイックアクセスツールバーの設定

クイックアクセスツールバーの設定は、PowerPointのメニューバーから「ファイル」を選択すると以下の画面が表示されるので、そこから左下の「オプション」を選択します。

Power Point

「オプション」ウィンドウが開いたら、ウィンドウの左側から「クイック アクセス ツール バー」を選択後、「コマンドの選択(C)」から「マクロ」を選択します。

Power Pointのオプション

その後、その下に先ほど作成したマクロの名前が表示されますので、それを選択し、「追加(A) >>」を押してください。

すると、選択したマクロが「クイック アクセス ツール バー」に登録されますので、右下の「OK」ボタンを押します。

3.クイック アクセス ツール バーからマクロを起動

それでは、クイック アクセス ツール バーに登録したマクロを実際に使ってみます。

まず、下の画面の通り、赤色にしたい文字を選択します。

Power Point

そしてWindowsの「Alt」キー(Macの場合は「option」キー)を押すと、クイック アクセス ツール バーに割り当てられた機能のそれぞれに番号が表示されますので、該当の番号(ここでは7)のキーを押します。

Power Point

すると、以下の通りマウスで選択した部分だけが赤い文字になります。

Power Point

このように、文字列を選択後、キーを2回押すだけで指定した色に変更することが可能になります。

Excel VBAでOutlookのメールを取り込む(その1)

諸事情により、Outlookの受信フォルダに溜まっているメールの一覧をExcelに取り込んでみたくなったので、いろいろなサイトをみながらExcelマクロVBAを作成してみました。

なお、VBAを書き始めるまでのExcelの準備作業は以下に記載していますので、参考にしてください。(そもそもどうやったら、ExcelでVBAを書き始めることができるのかについて詳しく書いています。)

http://k2-ornata.com/office-365-soloexcel-part1/

受信フォルダのメールリストを作成するVBA

1.外部ライブラリの参照設定

まず、今回のVBAは、下記の2つの外部ライブラリへの参照設定が必要です。

・Microsoft Outlook 16.0 Object Library
・Microsoft Scripting Runtime

参照設定の仕方は、VBAのエディターにて、ツールバーの[ツール]-[参照設定]を選択すると以下のように参照設定のポップアップが表示されますので、そこから選択するだけです。

Microsoft VBA

2.プログラムの記述

今回作成したVBAの全体は以下の通りです。
各行の意味はコメントで記載していますので、大体わかるのではないかと思います。

' 変数宣言していない場合に警告してくれるらしい
Option Explicit

Sub outlook_mail_list_01()
    
    Dim ol_obj_df, i, n
    Dim ol_obj As Outlook.Application
    Dim ol_obj_ns, ol_obj_item As Object
    
    ' Outlookオブジェクトの生成
    Set ol_obj = CreateObject("Outlook.Application")
    
    ' メッセージ送受信規約(MAPI)を指定する
    Set ol_obj_ns = ol_obj.GetNamespace("MAPI")
    
    ' 受信トレイの指定
    Set ol_obj_df = ol_obj_ns.GetDefaultFolder(6)

    ' 受信トレイのメール件数をポップアップ表示
    ' MsgBox ol_obj_df.Items.Count
    
    ' メールを1件ずつ読み込んでExcelに出力
    For i = 1 To ol_obj_df.Items.Count
        Set ol_obj_item = ol_obj_df.Items(i)

        Cells(i, 1) = i
        Cells(i, 2) = ol_obj_item.ReceivedTime
        Cells(i, 3) = ol_obj_item.Subject
        Cells(i, 4) = ol_obj_item.SenderName
        Cells(i, 5) = ol_obj_item.SenderEmailAddress
        Cells(i, 6) = Left(ol_obj_item.Body, 100)
    
    Next

End Sub

今回は非常にシンプルなものを作成しましたが、今後、時間があれば添付ファイルをローカルのフォルダに保存していくVBAなども作成していきたいと考えています。

Office 365 SoloのExcelで稲妻線の作成(その1:とりあえず直線を描画)

前回のブログのとおり、条件付き書式を使うことでガントチャートのベースを作成することができました。

http://k2-ornata.com/office-365-soloexcel-part2/

ただ、できればよくある稲妻線をガントチャートに追加してみたいと思っています。

しかし、おそらく稲妻線はExcelのオブジェクトを使わざるを得ないだろうと思い、マクロをまったく使ったことがない私が1から作成してみることにしました。

そもそもどこにマクロを書くのか?

Macの場合、Windowsと異なり、[ツール]-[マクロ]-[Visual Basic Editor]からマクロを記述していくことになるみたいです。

すると、以下のようにVisual Basic Editorのウィンドウが表示されます。

その後、再度[ツール]から[マクロ…]を選びます

すると、マクロを新規作成する画面がポップアップで出てきますので、今回は「inazuma」という名前で作成します。

その後、[作成]ボタンを押すとマクロを入力する画面が表示されますので、ここに書いていきます。

マクロを記述する

いきなりですが、今回記述したコードは以下の通りです。

 1 Sub inazuma()
 2    Dim progress As Shape
 3    Dim sx As Single
 4    Dim sy As Single
 5    Dim ex As Single
 6    Dim ey As Single
 7    Dim ffb As FreeformBuilder
 8     
 9    sx = ActiveSheet.Cells(4, 7).Left
10    sy = ActiveSheet.Cells(4, 7).Top
11    ex = sx
12    ey = ActiveSheet.Cells(13, 7).Top
13
14    Set ffb = ActiveSheet.Shapes.BuildFreeform(msoEditingCorner, sx, sy)
15    ffb.AddNodes msoSegmentLine, msoEditingCorner, ex, ey
16    Set progress = ffb.ConvertToShape
17
18    With progress.Line
19        .DashStyle = msoLineSolid
20        .Weight = 2
21        .ForeColor.RGB = RGB(255, 0, 0)
22    End With
23 End Sub
    

さっくり内容を説明すると各コードの意味は以下の通りです。

【解説】
2〜7行目・・・各変数の型の定義
9〜12行目・・・稲妻線の開始(sx,sy)と終了(ex, ey)の場所を設定
14行目・・・図形オブジェクトの開始点を設定
15行目・・・図形オブジェクトの終了点を設定
16行目・・・図形を描画
18〜22行目・・・図形オブジェクトのスタイル、太さ、色を設定

実際にVisual Basic Editorに書き込んだイメージは以下の通りです。

コードを書き込んだら、上のツールバーにある緑色の右向き三角▶︎を押しましょう。このマクロが実行されます。

とくにコードにエラーがなければ何も起こりませんが、実際には裏でExcelに図形が描画されています。

このあと、OSのツールバーから[Excel]-[終了してMicrosoft Excelへ戻る]を選択します。

すると以下のとおり、カレンダーの一番左端に赤い線が引かれてることが確認できます。

実際には、今日の日付に合わせて赤い線の位置を調整する必要がありますが、それはまた次回とさせてください。