VBAからChatworkにファイル添付とメッセージ通知を同時に実行するVBAプログラムを紹介します。
・VBAプログラム入りのエクセルをダウンロード可能
それでは以下で詳しく紹介していきます。
目次
VBAでchatworkにメッセージを送る
このページでは、「Chatworkへファイル添付しつつメッセージ通知するVBAプログラム」を紹介します。
このページのプログラムはこちらを参考に作成しています。
このプログラムの使用手順は以下のとおりです。
手順1. ChatworkのAPI TOKENを取得
手順2. Chatworkメッセージを通知したいROOMのIDを入力
手順3. Chatworkメッセージの件名、本文を入力
手順4. Chatworkメッセージのメンションしたい相手を入力
手順5. Chatworkに添付したいファイル名をエクセルに入力
手順6. VBAプログラムを実行
以下で使い方の手順を紹介します。
手順1. ChatworkのAPI TOKENを確認
こちらのchatworkにアクセスし、以下の手順でAPI TOKENを確認します。もしAPI TOKENを持っていない場合は、API TOKENを作成します。
2. 「サービス連携」をクリック
3. 「API Token」をクリック
4. 「パスワード」を入力
5. 「表示」をクリック
6. 「API Token」を取得
上記の手順でエクセルにAPI TOKENを取得し、セルB2に入力します。
このAPI TOKENがないとChatworkとの連携ができませんので、設定が必要です。
もしAPI TOKENについてよく分からない人がいるのであれば、こちらのChatworkのページをご覧ください。
手順2. Chatworkメッセージを通知したいROOMのIDを入力
今回のメッセージを通知したいroom(channel)のidをセルB3に入力します。
→「227462111」をroomidとしてセルB2に入力
必要情報は上記の「rid」の後の数値です。ここでは「227462111」です。
このようにメッセージ通知したいchatworkのチャンネルをクリックしてURLをチェックして、情報を調べます。
手順3. Chatworkメッセージの件名、本文を入力
2. セルB5:メッセージ(通知文の本文)
セルB4とセルB5で分けている理由は、件名と本文を分けることで、Chatworkに通知する文章を加工するためです。
[title]「セルB4の値」[/title]
「セルB5の値」
[/info]
この事例では、プログラム内で上記のようにタグを挿入することで、通知メッセージを加工させます。
セルB4の値は、[title][/title]で囲むことで件名装飾し、セルB5の値は、[info][/info]で囲むことで文全体を装飾します。
手順4. Chatworkメッセージのメンション(TO)したい相手を入力
通知相手を特定するために、メンション(TO)を付けます。
メンションさせるためにはアカウントIDが必要なので、アカウントIDをエクセルのセルB6に入力します。
もしメンションしたい人が複数いる場合は、セル内で改行してアカウントIDを入力します。
上記の画像では同じアカウントIDを入力していますが、事例として同じアカウントIDを入力しているだけです。
実際には異なるアカウントを入れてメンションを行います。
なおアカウントIDは名前と紐づいていないため、メッセージ通知されるときは名前が出ません。
相手が通知に気づけば十分ですので、本事例では名前を紐づけるまでは設定しません。
アカウントIDの取得方法が分からない人は以下を参考にしてください。
アカウントIDの取得方法
アカウントIDの取得方法を説明します。
手順1. 「TO」を選択
手順2. メンションしたいアカウントを選択
手順3. [To:XXXXXX]の「XXXXXX」をエクセルに出力
最終的に以下のようにエクセルにアカウントIDを入力します。
メンションしたい相手が複数いる場合は、改行して入力する必要があります。
手順5. Chatworkに添付したいファイル名をエクセルに入力
Chatworkに添付したいファイル名をエクセルのセルB7に入力します。
このページで紹介するVBAプログラムが含まれるエクセルと同じフォルダに添付ファイルを保管します。
ここでは「report.pdf」というファイルをChatworkに添付させます。
なおPDFだけではなく、jpegやExcelファイルも添付させることが可能です。
手順6. VBAプログラムを実行
手順1~手順5の作業が完了したら、VBA(マクロ)を実行します。
VBAを実行すると、Chatworkにメッセージを通知します。
なお通知が成功したら、セルB8に「通知成功」と出力します。
通知に失敗したら、「通知失敗」と出力します。
さらに効率化! 別のVBAプログラムとつなげる
このプログラムではファイル添付する作業を自動化しています。
ただ、この作業だけではそこまで作業効率化は期待できません。
そこでChatworkに通知するまでに必要な作業も自動化してみることをお勧めします。
実際、私は以下のプログラムを組み合わせて、処理を自動化をしていました。
1. 毎週のExcel集計作業を自動処理
2. チャットに集計処理したExcelファイルを添付しつつメッセージ通知(このページで紹介するプログラム)
上記のように1も自動化できると、仕事をより正確に早くこなせるようになります。
なお上記の1のプログラムは以下で紹介しています。興味があれば、ご覧ください。
ボタンにVBAプログラムを登録する方法
本ページではVBAプログラムをボタンに登録しています。
ボタンにVBAプログラムを登録することで、ボタンを押下しプログラムを実行することができます。
ボタンをVBAプログラムを設定したい場合は、以下で動画も交えて設定方法を紹介しているので、そちらをご覧ください。
それでは、以下でプログラムについて詳細を説明します。
VBA入りのエクセルファイルをダウンロード
以下で紹介しているVBAプログラムをそのまま使いたい人は、以下のフォームからダウンロードできます。
登録したメールアドレスへVBA入りのファイルを送信します。
本プログラムの内容をそのまま使用可能です。ぜひお仕事にお役立てください。
VBA作成前の2つの準備
ExcelでVBAを使うためにはいくつかの準備が必要です。
具体的には以下です。
準備2. 参照設定を変更
上記の2つに関して、以下で説明します。
準備1. ExcelでVBAを使うための事前準備
Excelで、以下の2つの準備をします。
2. 開発タブを追加
保存ファイルの拡張子変更、Excelの基本設定変更の2つです。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
準備2. 参照設定を変更
エクセルVBAでChatworkにメッセージを送信するために、VBEの設定を変更しておく必要があります。
実はVBAのデフォルト設定の場合、メール送信操作はできません。
参照設定を変更することで、Chatworkにメッセージ送信が可能になります。
参照設定の変更手順は以下のとおりです。
手順2. 「参照設定」を選択
手順3. 「Microsoft XML v6.0」,「Microsoft Scripting Runtime」,「Microsoft ActiveX Data Objects 6.1 Library」にチェックを入れる
手順4. OKをクリック
手順を以下で説明します。
上記の設定をしていないと、本事例で紹介しているChatworkのメッセージ通知は動作しません。必ずチェックを入れるようにします。
それでは、以下でプログラムについて詳細を説明します。
VBAのプログラムソース解説
今回紹介するプログラムの概要は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
'プログラム0-1|変数設定の指定 Option Explicit 'プログラム0-2|定数設定 Const adTypeBinary = 1 Const adTypeText = 2 Const adBTypeContent = 1 Const adBTypeBody = 2 Const adBTypeFooter = 3 'プログラム1-1|メインプログラム開始 Sub UploadFileWithMessageToChatwork() 'プログラム1-2|エクセルのデータを取得 Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1") Dim apitoken As String: apitoken = ws.Range("B2").Value Dim roomid As String: roomid = ws.Range("B3").Value Dim title As String: title = Replace(ws.Range("B4").Value, "{日付}", Format(Date, "yyyy-mm-dd")) Dim message As String: message = Replace(ws.Range("B5").Value, "{日付}", Format(Date, "yyyy-mm-dd")) Dim atesaki() As String, convto As String, i As Long atesaki = Split(ws.Range("B6").Value, vbLf) Dim list As Variant For i = LBound(atesaki) To UBound(atesaki) convto = convto & "[To:" & atesaki(i) & "]" Next Dim text As String: text = convto & vbCrLf & "[info][title]" & title & "[/title]" & message & "[/info]" Dim filepath As String: filepath = ThisWorkbook.Path & "\" & ws.Range("B7").Value Dim url As String: url = "https://api.chatwork.com/v2/rooms/" & roomid & "/files" 'プログラム1-3|リクエストパラメーター用の領域を生成 Dim tempparamstream As Object Set tempparamstream = CreateObject("ADODB.Stream") tempparamstream.Open 'プログラム1-4|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New FileSystemObject 'プログラム1-5|添付したいファイル名の取得 Dim filename As String filename = fs.GetFileName(filepath) filename = Application.WorksheetFunction.EncodeURL(filename) 'プログラム1-6|パラメーターとして渡すファイルタイプを設定 Dim filetype As String filetype = "application/octet-stream" 'プログラム1-7|リクエストパラメーター作成 If SetFileParameter(tempparamstream, filename, filetype, filepath) Then: If SetMessageParameter(tempparamstream, text) Then: If SetEndParameter(tempparamstream) Then: 'プログラム1-8|リクエストパラメーター取得 Dim sendparameter As Variant: GetSendParameter sendparameter, tempparamstream 'プログラム1-9|HTTPリクエスト Dim objHTTP As XMLHTTP60 Set objHTTP = New XMLHTTP60 With objHTTP .Open "POST", url, False .setRequestHeader "Content-Type", "multipart/form-data; boundary=" + getBoundy(adBTypeContent) .setRequestHeader "X-ChatWorkToken", apitoken .send sendparameter End With 'プログラム1-10|通知の成功失敗をエクセルに出力 If InStr(objHTTP.responseText, "file_id") > 0 Then ws.Range("B8").Value = "通知成功" Else ws.Range("B8").Value = "通知失敗" End If 'プログラム1-11|オブジェクト解放 Set objHTTP = Nothing 'プログラム1-12|プログラム終了 End Sub '添付ファイルをHTTPリクエストのためのデータに変換 Private Function SetFileParameter(ByRef tempparamstream As Object, ByVal fvalue, ByVal fct, ByVal fpath) As Boolean '添付ファイルをHTTPリクエストするときのデータに入れ込む ChangeStreamType tempparamstream, adTypeText, "" Dim params As String params = "" params = params + getBoundy(adBTypeBody) params = params + "Content-Disposition: form-data; name=""file""; filename*=utf-8''" + fvalue + vbCrLf params = params + "Content-Type:" + fct + vbCrLf params = params + vbCrLf tempparamstream.WriteText params '添付ファイルをバイナリデータ化 ChangeStreamType tempparamstream, adTypeBinary, "" Dim fileStream As Object Set fileStream = CreateObject("ADODB.Stream") fileStream.Type = adTypeBinary fileStream.Open fileStream.LoadFromFile fpath tempparamstream.Write fileStream.Read() fileStream.Close Set fileStream = Nothing SetFileParameter = True End Function '通知するメッセージをHTTPリクエストとして渡すためのデータに変換 Private Function SetMessageParameter(ByRef tempparamstream As Object, ByVal text) As Boolean Dim params As String If text <> "" Then ChangeStreamType tempparamstream, adTypeText, "message" params = "" params = vbCrLf params = params + getBoundy(adBTypeBody) params = params + "Content-Disposition: form-data; name=""message""" + vbCrLf + vbCrLf params = params + text + vbCrLf tempparamstream.WriteText params End If SetMessageParameter = True End Function 'HTTPリクエストとして渡すためのデータの終了地点を入れ込む Private Function SetEndParameter(ByRef tempparamstream As Object) As Boolean ChangeStreamType tempparamstream, adTypeText, "" tempparamstream.WriteText getBoundy(adBTypeFooter) SetEndParameter = True End Function 'HTTPリクエストとして渡すためのデータを最終化 Private Function GetSendParameter(ByRef parameter As Variant, ByRef stream As Object) As Boolean ChangeStreamType stream, adTypeBinary, "" stream.Position = 0 parameter = stream.Read stream.Close Set stream = Nothing GetSendParameter = True End Function 'データの文字コードを変換 Private Function ChangeStreamType(ByRef stream As Object, ByVal adType As Integer, ByVal info As String) As Boolean Dim p As Long p = stream.Position stream.Position = 0 stream.Type = adType If info = "message" Then stream.Charset = "utf-8" End If If info = "" Then If adType = adTypeText Then stream.Charset = "shift-jis" End If End If stream.Position = p ChangeStreamType = True End Function 'HTTPリクエストとして渡すためのデータの境界(boundary)を設定 Private Function getBoundy(ByVal adType As Integer) As String Static sBoundy As String If sBoundy = "" Then Dim multipartChars As String: multipartChars = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" Dim boundary As String: boundary = "--------------------" Dim i, point As Integer For i = 1 To 16 Randomize point = Int(Len(multipartChars) * Rnd + 1) boundary = boundary + Mid(multipartChars, point, 1) Next sBoundy = boundary End If Select Case adType Case adBTypeContent getBoundy = sBoundy Case adBTypeBody getBoundy = "--" + sBoundy + vbCrLf Case adBTypeFooter getBoundy = vbCrLf + "--" + sBoundy + "--" + vbCrLf End Select End Function |
このページではプログラムの説明は省略します。
上記のプログラムでコメントアウトしている部分を読み込んで参考にしてください。
プログラムの解説はここまでです。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。
いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。
その場合は、VBAの基本について学ぶ必要があります。
たとえば車の運転も慣れてしまえば、たいしたことではありません。
しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。
VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。
実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。
今はオンラインの教材で無料で学習できるものも多いです。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。
VBAを自分で書けるようになる
さて、本記事で紹介したマクロを利用すれば、作業の自動化が可能になります。
しかしデメリットもあります。それはカスタムできないことです。
なぜなら、色々な要望が増えるからです。
この動画を見たとき、「もっと○○ができるのでは?」や「ここはなんとかならないのか」と感じる人は少なくないはずです。
例えば、「他の条件を付け加えたい」や「日付毎に条件を変えたい」といった要望が出るかもしれません。
このような要望を満たすには、マクロを勉強して自力でマクロを編集できるようになる必要があります。
もし、自力でマクロを編集できるようになれば、今より仕事の効率はグッと上がります。
実際、私も自力でマクロを書けるようになってからは、仕事の生産性が一気に上がりました。
他の人が30分~1時間かけて行う仕事が、ボタン一つで終わらせることができるようになったのです。
その結果、周囲からの信頼も増し、仕事で高い評価を得られるようになりました。
ただ、要望に応えるようになるためには、マクロを学ぶ必要があります。
まずは無料でマクロを勉強してみる
ウェブや書籍で勉強すれば、マクロを習得できると考えている人は少なくありません。
しかし、仕事で使えるマクロを習得したいなら、仕事で使える部分に特化した教材で学ぶことをお勧めします。
なぜなら、ウェブや書籍には仕事に関係しない部分まで提供していることが多いからです。
例えば、マクロ初心者なのに配列を学ぼうとする人がいます。実は配列なしでも仕事で使えるマクロを書くことは可能です。
しかし、マクロ初心者ほど「全ての知識が必要だ」と考えて、無駄な学習に時間を使ってしまうのです。詳しくは、こちらの記事で紹介しています。
そこで、私がお勧めするのは仕事に直結するマクロ教材です。とくにお勧めするのは、こちらの無料オンライン動画です。
なぜなら、仕事に直結する部分に絞って、エクセルマクロを学ぶことができるからです。
マクロの作り方・考え方から解説しているので、教材をしっかり学べばここで紹介したマクロをゼロから書けるようになります。
マクロ初心者が、仕事に直結したいマクロを学ぶなら、まずはこちらの無料オンライン動画を試すのがいいです。
興味がある人は、まずは無料でエクセルマクロの勉強を始めてみてください。
もっと学びたいと感じたら、さらに深く勉強をしてみることをお勧めします。