はじめに
「Excelって、チャットUIみたいな見た目で操作できたら面白いかも」そんな思いつきから、今回の取り組みがスタートしました。単純な工数・在庫管理シートに飽きていた私が、遊び感覚で作ったものです。作ってみたら意外と楽しく、学びも多かったので記事にまとめてみました。
▲商品データとチャットUIを並べた画面。質問に応じて自動回答。
機能紹介
作成したチャットUIには、以下のような機能があります:
- 質問を入力してEnterを押すと、該当商品の価格や情報を返す
- 会話が吹き出し形式で表示される
- 各メッセージに時間が表示され、既読も表示される
- アイコンはExcel内の図形から読み込み、左に表示
- チャットログは自動的にシートに保存され、5001件を超えると上書き
技術的なポイント
VBAのみで構築している点がポイントです。
・吹き出しUIはLabelコントロールで実装し、高さは文字数に応じて自動調整
・画像はShapesからコピーし、一時的にJPEG保存してImageコントロールに表示
・質問に「価格」や「情報」が含まれるかどうかを判断し、複数列を参照して回答生成
・ラベル位置や時間、既読の位置は定数で調整可能にしてカスタマイズ性を確保
・チャットログは「チャットログ」シートにA〜D列で保存し、5001件超えると2行目を削除
▲ 実際にチャットで質問し、情報を返している様子
コード解説:回答取得の部分
questionText = Trim(Me.TextBox1.Value)
If questionText = "" Then Exit Sub
この部分では、テキストボックスに入力された文字列の前後の空白を削除し、空なら処理を中止します。空のメッセージを送らないようにする基本的な入力チェックです。
Call CreateChatBubble(Me.Frame1, "あなた:" & vbCrLf & questionText, True)
ユーザーからの入力テキストをチャット形式で吹き出しにして表示する処理です。左側に吹き出しが表示されます。
startTime = Timer
Do While Timer < startTime + (0.5 + Rnd)
DoEvents
Loop
へたれくんの回答に対して“少し考える時間”のような演出をするため、0.5〜1.5秒の間でランダムに待機時間を入れています。
answerText = GetAnswerFromDatabase(questionText)
ユーザーの質問テキストをもとに、商品シートから該当する情報を検索して回答を作成する関数です。
Call CreateChatBubble(Me.Frame1, "へたれくん:" & vbCrLf & answerText, False)
へたれくん側の吹き出しを作成し、検索で得られた回答を右側に表示します。
GetAnswerFromDatabase関数では、商品シートの各列を検索し、質問文に一致する型式や商品名が見つかれば、その行の内容から情報を組み立てて返します。
価格だけでなく「情報」というキーワードがあれば、分類・商品名・型式・価格・備考まで出力します。
▲ VBAでの検索処理のコード例。If文で価格や情報の抽出を判定
裏側の処理
ユーザーフォーム内の吹き出しラベルは、Frame内に追加する形で作成されます。
ユーザーの発言には画像(アイコン)を表示し、チャットのような見た目を再現。
へたれくんの返信には「既読」「時間」の表示をラベル下に追加。
この表示位置もコード内の定数で数値調整できるようになっています。
▲ チャットログも残せるようにしました。
動画で見たい方はこちら
実際の操作を動画でも紹介しています。
▶ YouTube: https://youtu.be/xBJDva6MFoY?si=oRoKcnM0D8xM9jWL
おわりに
ExcelのVBAでも、ここまで遊び心のある機能を作ることができます。
正直、実務での活用は限定的かもしれませんが、業務効率よりも「ちょっと楽しい」を取り入れることで、毎日の仕事に少し笑顔が増えるかもしれません。
もし気になったら、ぜひマネしてみてください!