エクセルで管理している数字が一定数以下になったら
自動的にLINEに通知するVBAの作り方を記載しています。

こんばんわ。しょーいです。


以前こちらの記事を作成した際に
「Excelで在庫管理をしたくて、在庫が〜個以下になったら自動でLINEに通知といった機能を実装したいです。」
とのお声を頂きました。ありがとうごいます!!

私の業務上在庫管理はしたことなかったのですが、私なりに簡単に在庫管理エクセルを作成して、そこから自動的にLINEに通知するVBAを作成してみました。
なるべくわかりやすく書いたつもりなので、遠回しだぁなと思う部分はバンバン改造してしまってください。
又、上に記載した記事のコードをベースに作りましたので、まだ見ていらっしゃらない方は上の記事を見てみてください。

手っ取り早くVBAをつかいた方はパターン3まで飛んで大丈夫です。
内容を理解したい方はパターン1から見てもらえるとわかりやすいと思います。

パターン1.シンプル自動通知VBA

DB

私なりにDBを作ってみました。

・入荷表(左)
・出荷表(中)
・在庫の残数表(右)

の3つで構成されています。
残数表は、2つの表からsumifで数字を拾っています。
この作り自体は簡単ですね。

以下がコードです。

Sub 在庫送信シンプル()

Dim objHTTP As Object
Dim LineStr As Variant
Dim SndMsg, Token

Dim SHT, Count, Item
Set SHT = ThisWorkbook.Sheets("在庫管理シート")
Count = SHT.Range("l3")
Item = SHT.Range("i3")


If Count <= 30 Then
    
    SndMsg = "商品" & Item & "の在庫数が" & Count & "です。入荷してください。"
    Token = "★トークンいれる所★"
    
    LineStr = "message=" & SndMsg
    
    Set objHTTP = CreateObject("MSXML2.XMLHTTP")
    objHTTP.Open "POST", "https://notify-api.line.me/api/notify", False
    objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    objHTTP.setRequestHeader "Authorization", "Bearer " & Token
    objHTTP.Send LineStr
    
End If
End Sub

かなり単純な内容になってますので、違和感を覚える人もいると思います。9,10,13,19行あたりが直接参照しているので管理が面倒ですし、エクセル側の入力方法が変わってしまったら都度修正しないといけない状態になっています。

機能としては非常にシンプルです。
「L3セル」の数値が30以下になったらLINEに通知する、というもの。

1つのシートで1つだけの商品を管理しているのなら、このコードでもなんとかなると思います。
ですが1つのシートで複数の商品を見るのが一般的だと思うので、この内容だとちょっと不便ですよね。

パターン2.複数の商品を管理するVBA

DB2

先程の在庫残数管理表(右)が複数個になりました。
よくあるタイプの管理方法かと思います。
これで、各タイプの在庫数が管理できるようになりましたね。
一番右のテーブルには「残数シート」と名前をつけています。

Sub 在庫送信複数()

Dim objHTTP As Object
Dim LineStr As Variant
Dim SndMsg, Token
Dim SHT, Count, Item, i
Set SHT = ThisWorkbook.Sheets("在庫管理シート")

Item = SHT.ListObjects("残数シート").ListColumns(1).DataBodyRange
Count = SHT.ListObjects("残数シート").ListColumns(4).DataBodyRange

For i = 1 To UBound(Item)
    If Count(i, 1) <= 30 Then
        
        SndMsg = "商品" & Item(i, 1) & "の在庫数が" & Count(i, 1) & "です。入荷してください。"
        Token = "★トークン入れる所★"
        
        LineStr = "message=" & SndMsg
       
        Set objHTTP = CreateObject("MSXML2.XMLHTTP")
        objHTTP.Open "POST", "https://notify-api.line.me/api/notify", False
        objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        objHTTP.setRequestHeader "Authorization", "Bearer " & Token
        objHTTP.Send LineStr
        
    End If
Next i
End Sub

9,10,13列あたりが代わりましたね。
15列も変わっていると思います。ここらへんは「配列」を理解していれば問題ないです。

スポンサーリンク

9,10列の指定方法は「テーブルの操作」をしています。
こちらに関してはOffice TANAKAさんのサイトを参考してください。
テーブルに関してとてもわかり易い記載をしております。
私も毎回このサイトを参考にしていますw

配列指定することで、パターン1の内容を各商品別に判断して、足りなければ通知するという内容になってます。
これで複数管理でもOK!

パターン3.個別で通知条件をつけたVBA

・りんごは常に余裕を持って発注しておきたい
・キウイはそんなに減らないから、ギリギリになってからで大丈夫。

こんな現場の声とかがありそうな気がしたので、商品別に通知する数のボーダーを決められるようにしました。

DB3

一番右の残数シートに「通知ボーダー」という列を追加しました。

Sub 在庫送信複数個別()

Dim objHTTP As Object
Dim LineStr As Variant
Dim SndMsg, Token

Dim SHT, Count, Item, i, Border
Set SHT = ThisWorkbook.Sheets("在庫管理シート")

Item = SHT.ListObjects("残数シート").ListColumns(1).DataBodyRange
Count = SHT.ListObjects("残数シート").ListColumns(4).DataBodyRange
Border = SHT.ListObjects("残数シート").ListColumns(5).DataBodyRange

For i = 1 To UBound(Item)
    If Count(i, 1) <= Border(i, 1) Then
        
        SndMsg = "商品" & Item(i, 1) & "の在庫数が" & Count(i, 1) & "です。入荷してください。"
        Token = "★トークン入れる所★"
        
        LineStr = "message=" & SndMsg
        
        Set objHTTP = CreateObject("MSXML2.XMLHTTP")
        objHTTP.Open "POST", "https://notify-api.line.me/api/notify", False
        objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        objHTTP.setRequestHeader "Authorization", "Bearer " & Token
        objHTTP.Send LineStr
        
    End If
Next i
End Sub

通知ボーダーの数字よりも残数が減ったらLINEに通知される内容です。
パターン2からさらに列を増やしただけなので、そこまで複雑では無いですね。

実際問題なく通知されています。

通知するタイミングを考える

このままですと、VBAを起動するタイミングがわかりません。
ボタンを作成して、そこを押せばVBAが起動する設定も可能です。

ですが毎回ボタン押すのは絶対にめんどくさいです。無駄です。
なので、通知タイミングも自動化したいですよね。

エクセルを起動した時にVBAを起動して通知する

この設定に関してはエクセルの真髄さんで確認したほうが絶対早いですし、わかりやすいです。

一応、私も簡単に記載しますと。
「Thisworkbook」をダブルクリック

赤丸のところ

以下のコードを貼り付け。
これはパターン3のコードをエクセルを起動した時に発動させる内容です。

Private Sub Workbook_Open()
    Call 在庫送信複数個別
End Sub

エクセルを閉じた時にVBAを起動して通知する

これは先程とほぼ同じ。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call 在庫送信複数個別
End Sub

エクセルを閉じる時にVBAが起動されます。
詳しくはエクセルの真髄さんで確認を。

カスタマイズでより使いやすいVBAにしてください

基本的な流れは以上です。
ここから各現場で使いやすいようにカスタマイズしていきましょう。
カスタマイズすることによって、VBAスキルもグングン伸びます。
私もネット上のコードをまるまる拾ってきて、それを解析しながら使ってました。
そうするとだんだんと自分のわからないことがわかるようになります。

是非色々と試してみてください。

スポンサーリンク