現在位置は
です

発言小町

新しいトピを作成
本文です

メッセージボックス関数、教えて下さい 携帯からの書き込み

てんてんにゃんた
2019年7月18日 21:16

私はアラフィフ会社員、PCと言えば会社で使うのみ、エクセル・ワード・パワポがせいぜいという初心者並のスキルの者です。

ですが立場上、ちょっとした集計表を作らなくてはならず、頭を悩ませております。

どうか達人のお助けを頂けませんでしょうか。

あるセルの数値が100,200,300,400,500,600,700,800,900以上となった時に、メッセージボックスを表示させたいのです。

そのセルには一定範囲の合計が表示されます。毎日数値入力をしていくので、合計は日々変わります。数値が100の倍数を越えたらメッセージボックスを表示したいのですが、数値は100の倍数ちょうどとは限りません(101とか105などになる可能性があります)。

例えば、合計は99→101→103→108……117→200→205→というように増えていきます。

上記の例でいうと、101になった時と200になった時にメッセージボックスが出るようにしたいです。メッセージボックスの出現は一回だけ、101で出たら103では出ない・次は200で出て205では出ないという風にしたいんです。

そういう事は可能でしょうか?できるとしたらどんな関数になるのでしょうか?

会社では分かる人がおらず、困っております。

ご存知の方、何卒ご指南お願い致します。

ユーザーID:0143330189  


お気に入り登録数:50
  • 携帯に送る
  • このエントリーをはてなブックマークに追加
古いレス順
レス数:17本

タイトル 投稿者 更新時間
VBAマクロですが
あらかん
2019年7月18日 22:31

アラフィフで「メッセージボックス関数」という言葉がわかるのに
ここでトピを立てているという状況から、トピ主さんにはメンテできないので、おやめになった方が良いと思います。
やりたいことはわかりましたが、何のためにそのメッセージが必要なのか教えていただけますか?
合計値のセルには集計するための数式が設定されていて、
別のシート、範囲、ブックにある数字の集合を自動で合計するようになっている、という理解でよいですか?

ユーザーID:9867812678
下手なVBAですが
オッドボール
2019年7月18日 23:44

(標準モジュール上で)

 '前回の値保存用
 Public lngLast As Long


(ThisWorkbook上で)

 Private Sub Workbook_Open()
  '前回の値を初期化
 lngLast = 0
 End Sub


(対象のシート上で)

 Private Sub Worksheet_Calculate()
  Dim lngNow As Long

 '合計セルの値を取得
 lngNow = Range("C8").Value

 '前回から100以上加算されたかどうか
 If lngNow - lngLast >= 100 Then
  MsgBox "100の倍数に達しました", vbOKOnly + vbInformation

  '今回の値の百の位のみ保存
 lngLast = Int((lngLast + lngNow - lngLast) / 100) * 100
 End If
 End Sub



こんな感じでどうでしょうか?
合計のセルは仮に C8 としています。実際のアドレスに書き換えてください。

ただ増えていくことのみを想定しており、
101 → 95 → 150 → 201 という様に一度100以上になった後に100未満になり、
再度100以上になっても検知しません。この場合、200以上になれば検知します。
100から一気に300や400以上になることは想定しています。
また、途中で改めてゼロからやり直す必要がある場合は、
コマンドボタン等で前回保存用変数をゼロに戻せば良いかと思います。

ユーザーID:0051785287
とりあえず
飛角
2019年7月19日 0:53

関数ではなくアルゴリズムで提示します。
なお、以下の前提条件を補っています。
もし何か違うようでしたらその旨書いてください。
・Excelを使用
・VBA(マクロ)を使用
・合計もVBA内で行う(ワークシート関数ではない)
・合計は常にプラスとなる(前回より少なくなることはない)
・合計値セルの初期値は0
・手動もしくはタイマーでVBAを起動する(入力をトリガーとしない)

VBAの記述順序は以下の通り。
1.合計セルの値を100で割った商を求める(oとする)
2.合計する
3.合計セルの値を100で割った商を求める(nとする)
4.oとnの値が同じ場合はここで終了(メッセージ表示なし)
5.nの100倍を求める(xとする)
6.「x以上になりました」とメッセージ表示する

合計99:o=0,n=0なので表示なし
合計101:o=0,n=1なので「100以上になりました」と表示
合計103:o=1,n=1なので表示なし
合計1234:o=1,n=12なので「1200以上になりました」と表示
みたいに動作します(最後はいきなり飛んでも大丈夫というケースです)。

ユーザーID:6892039829
サンプル
たか
2019年7月19日 9:50

VBAのヘルプに以下のようなサンプルがありました。

A列のセル値が変更されたときに、変更されたセル値が100よりも大きい場合、B列を赤くします。
これを修正していけば出来るのではないでしょうか。
メッセージボックスはMsgBoxです。
直接入力するのではなく合計をチェックする場合はCalculateです。

このサンプルがさっぱり分からない場合は諦めた方が良いと思います。

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
 If Target.Column = 1 Then
  ThisRow = Target.Row
  If Target.Value > 100 Then
   Range("B" & ThisRow).Interior.ColorIndex = 3
  Else
   Range("B" & ThisRow).Interior.ColorIndex = xlColorIndexNone
  End If
 End If
End Sub

ユーザーID:6488895732
おそらく
あらかん
2019年7月19日 11:29

>標準モジュール
>This Workbook
>対象のシート上で
ってわからないのではないか、と思いますよ。

試走してないので、パッと見ですが、オッドボールさんの記述だと、
前回までの値がブックを開けた途端、ゼロになって
毎回ゼロ取得になってしまいませんか?
数式で合算しているなら、新規入力の前の値を維持しないといけないのでは?

いくつかトピ主さんに質問してますが、
ロジックとしては、
前回の合計を100で割った整数値
新しい合計を100で割った整数値
を比較して違っていればメッセージ提示
でよいのでは?

ユーザーID:9867812678
関数だけじゃない
匿名
2019年7月19日 12:28

関数だけ言えば、ifとの組み合わせでできるかな、と思います。
ただ、どうやって100を超えた、200を超えたか考えるのは関数というより
アルゴリズムになるので、今後のメンテを考えるとアルゴリズムは自分で
考えて納得して設計したほうがいいように思えます。

ユーザーID:7153331943
あらかんさん
オッドボール
2019年7月19日 13:26

ご指摘ありがとうございます。
ただ、無意味な計算箇所があるだけで、
私の想定した目的の動きにはなっていますね。

(誤り)
  '今回の値の百の位のみ保存
 lngLast = Int((lngLast + lngNow - lngLast) / 100) * 100

(正しい)
'今回の値の百の位のみ保存
lngLast = Int(lngNow / 100) * 100


これで良かったんです。
(lngLast - lngLast)が余計でした(笑)

起動前の状態からの続きが必要という部分は考慮不足でしたね。
毎日追記していき、日々の変化を見ていく以上必要でした。
トピ主さん、(ThisWorkbook上で)の部分を下記に置き換えてください。
シート名と合計セルのアドレスは実際のものに修正してください。

Private Sub Workbook_Open()
'前回の到達点を保持
lngLast = Int(ThisWorkbook.Worksheets("Sheet1").Range("C8").Value / 100) * 100
End Sub




>>標準モジュール
>>This Workbook
>>対象のシート上で
>ってわからないのではないか、と思いますよ。

それは私も思ったんですが、
流石にVBAを使わなければ無理じゃないかと思いまして。
あそこまで書けば、もしかして分かる人が周りにいて
コピペはできるかもという甘い見通しです。
ロジックを考えろ、までは言えません(笑)


>たかさん

どうやってインデントを保持できたんでしょうか?

ユーザーID:5354590126
関数だけで作ってみた
関数好き
2019年7月19日 14:32

こういうの好きなので作ってみました。
マクロが正解だと思います。
関数だけだと、どこまでできるかってチャレンジです。

【作業用スペースとしてA列を使用します】
●セルA1をメッセージボックスの表示枠とします
●セルA2を確認入力欄とします
●セルA11〜20を作業用セルとします
【セルB1を合計値欄とします】

○セルA11〜20を作業用セルとします
A11・・・100を超えたかの確認
     =IF(B1>100,100," ")
A12・・・2200超えたかの確認
     =IF(B1>200,200," ")
A13は300、A14は400・・と続けます。
仮に上限を1000と考え、A20セルまで同じように数式を入力します

○セルA1にメッセージを表示させます
A1・・・=MAX(A2:A20) & "を超えたよ! "
これだと『出現は一回だけ』とはいきません。
そのため
○セルA2を確認入力欄とします
A1に『100を超えたよ! 確認したら下のセルに100を入力して!』と表示させます。
セルA2には100を超えたら100、200を超えたら200と手入力させます
分かりやすいように、セルA2の確認が効いている間はセルA1に*(アスタリスク)を表示させます

セルA1に入力する関数は
=IF(MAX(A11:A20)=A2,"*",MAX(A11:A20) & "超えたよ! 確認したら下のセルに "& MAX(A11:A20) & " を入力して!")
となります。

使わないセルA11〜A20は文字色を白色がお勧めです。
このままだとセルA1(メッセージボックス)の幅の問題がありますが、その辺りは適当に。

ユーザーID:4832584415
メッセージボックスではなく、セルに〇を表示する
ミンミンミント
2019年7月19日 15:32

メッセージボックスは使わず、該当の条件になったら隣のセルに〇が表示されるのが良いのでは?

セルは2つ作っておきます。
セル1 900以上の時に〇が表示されるマス。
セル2 100で割った時のあまりが0の時にメッセージを表示するマス。

●セル1の数式(A1に比較する数値が入っているとします)

900以上の時は、
=IF(A1>900,"〇",)

900より大きい時は、
=IF(A1>=900,"〇",)

表示する文字は〇ではなく、「900以上です」などの言葉でも表示できます。
文字は""で囲んで数式に入れます。
=IF(A1>900,"900以上です",)

●セル2の数式(A1に比較する数値が入っているとします)
=IF(MOD(A1,100)=0,"〇",)

表示する文字は〇ではなく、「100の倍数です」「対象外」などの言葉でも表示できます。
=IF(MOD(A1,100)=0,"100の倍数です","対象外")

ユーザーID:3595091678
2回目
ミンミンミント
2019年7月19日 15:43

「より大きい」と「以上」の記号が間違ってました。
より大きいのときは > で、以上のときは >= でした。

会員登録で100番ごとに特別なプレゼントを送付するとか、100人ごとに当選者を決めるとか、100件ごとに発注をかけるとかを予想しましたが、どうしてもメッセージボックスで表示する必要はありますか?
どうしてもメッセージボックスが必要な場合は、他の方法を考えてみますが。

ユーザーID:3595091678
トピ主です。ありがとうございます携帯からの書き込み
てんてんにゃんた(トピ主)
2019年7月19日 20:48

皆さま、私の拙い説明にも関わらずご指南ありがとうございます。

まずはお礼をと思い、レスさせて頂きます。

今回の質問は、私の部署数十名分の成績管理に使います。毎日成果を数値で入力し、年間を通じて集計していくのですが、数値が100を達成するごとに別部署への報告が必要になるんです。別部署には数値の内訳を知らせず、タイムリーに報告をしなくてはなりません。

数値は、毎日複数の管理者が入力します。部署の職員一人一人がいつ100を達成するか、入力する人の確認漏れを防ぐ為に分かりやすい合図を出せたら、と思ったんです。

個人別のシートは最初から一年分まとめて作られていて(私の上司が作ったので作り直しがしづらいのです)、シートの一番下に合計が出ています。合計が見やすいよう画面の一番下に固定し、100を越えたら合計部分の色が変わるように設定していたのですが、それでも確認漏れ・報告漏れが起こったためもっと分かりやすい合図としてメッセージボックスが出せたらいいな、となりました。

お察しの通り、私は専門的なPCスキルを持っていません。必要なところだけ独学でやっていて、VBAも苦手です。こちらで質問したのも、エクセルについてどう質問したらいいのか、検索したらいいのか、どうにも上手くいかなかった為、普段見ている小町でもその手の質問あるよなあ、と投稿してみた次第です。

実はちょっと事情があり、皆さまが教えて下さった方法を試すことが暫く出来ません。私は急いでいませんが、せっかくのレスに対して結果報告が遅れること、申し訳ありません。来週中にはご報告したいと思いますので、どうかご容赦下さい。

たくさんの方法をご提示頂き、なんとかなりそうだと希望がわいて来ました。早くためしてみたいです。本当にありがとうございます。後日必ずご褒美致します。

ユーザーID:0143330189
私だったら
たか
2019年7月20日 14:14

そういう目的だったんですね。

おそらくですが、複数の人が入力して、100を超えたときに1回だけメッセージボックスが表示されるようにすると、人によっては忘れると思います。
次の会議の時間が迫っていたりすると「あとで報告しよう」ってなりますよね?

一つの解決策は、メッセージボックスに「報告する」ボタンを作って、それを押すだけにする方法です。例えば押すと自動でメールが送られるとかです。

もう一つの方法はVBAなど使わないで、報告したことを入力しないとどこかのセルにメッセージが出続けるようにする方法です。

私だったら、「合計」の横に「前回報告」というような欄を作って、そこを更新してもらいます。
合計>前回報告+100の場合は合計欄を赤くします。
誰か一人でも合計欄が赤い場合はA1のようなわかりやすい場所を赤くします。
報告した人は前回報告欄を更新し、A1が赤くなくなることを確認します。
忙しい人は入力だけして、赤色を放置してもらえば最悪別の人が報告できます。
タイムリーさは劣るかもしれませんが、何か入力させた方が、メッセージボックスをスルーされて報告が誰からも忘れられるより実用的だと思います。

また、代理で報告させられた人からは文句が出るかもしれませんが、それは社内の問題なのでなんとかしてください。

ユーザーID:6488895732
「条件付き書式」で十分では?
VBAいらない
2019年7月21日 2:48

合計セルに対し「条件付き書式」を設定すれば、解決できるかと。
100なり200なりの数字を超えると合計セルに色がつく、という設定が可能です。

以下は、最基本レベルの関数だけを使って実現する方法です。
ご使用のExcel表には、1ライン中に、毎日個別データを追加記入するための多数のデータ入力セルと、その合計を計算する合計セルがある、と想定します。

先に、合計セルの隣に、100達成確認セル・200達成確認セルもそれぞれ作っておきます。
達成を確認したときは、それぞれのセルに、例えば達成日を記入することにします。
未達なら、ブランクのままにしてください。

合計セルの一つをクリックしてから、メニューのホーム → 条件付き書式 → 新しいルール → 「数式を使用して、書式設定するセルを決定」を選び、数式と書式を設定します。
例えば、合計セルはX3、100達成セルがY3、200達成セルがZ3だとします。

まず、200達成確認用の書式を設定します。
数式は、=AND(X3>=100,Y3<>””)、書式は塗りつぶし → お好きな色を選びます。
次に、同じセルに、100達成確認用の書式も設定します。(200 → 100 の設定順を守ってください)
数式は、=AND(X3>=200,Z3<>””)、色も適宜選んでください。
最後に、この2つの条件付き書式が全ての合計セルに適用されるよう、適用先のセルの範囲を適切に修正します。

これで、合計セルの値が100または200以上になったら、そのセルに色がつきます。
ただし、達成確認セルに達成日を書き込んだとたん、その色が消えます。

より高度な関数を使えば、手入力をなくした完全自動化も可能ですが、データ入力のさい、2日分以上をまとめて入力される場合もあり得るのではないか、とするとこの初歩的方式の方が案外使いやすいのでは、と思います。

ユーザーID:6082040995
それはエクセルの問題ではない
あらかん
2019年7月22日 10:40

メッセージボックスを出す理由を最初にお伺いしたのは、まさにたかさんが懸念されている通り、「で、どうするの?」だからです。
色で警告してもスルーされるのだったら、メッセージボックス出しても「OK」押してしまえばそのままですよね。
それはエクセルの問題ではなく、業務管理の手法、作業手順上の問題でしょう。
トピ主さんがその部署の最高責任者ですか、あるいはその報告の責任者ですか?
だとしたら、その合計を管理シートにリンクするようにして、毎日、始業時なり、終業時なりに管理シートをチェックするようにしたらいかがですか?
もともとのシートが使いにくいのであれば、将来簡便な方法に変えられるよう、
これ以上作り込むのは避けた方がよいです。
環境やメンバーのスキルによって、手作業の方がよい場合もあります。

ユーザーID:9867812678
あらかんさんに賛成
飛角
2019年7月22日 16:47

>それはエクセルの問題ではなく、業務管理の手法、作業手順上の問題でしょう。
まさしくその通り。

最終的には報告漏れを防止しさえすればよいので、その方法はあらかんのおっしゃる通り、Excel内だけで考える必要はないです。
マンパワーで回すなら、誰かにそのブックを毎日定時にチェックさせれば済む話です(共有または権限付与などが必要になるかもしれませんが)。
Excelに工夫をするにせよ、たかさんのようなやり方で、「報告チェックをしない限りなんらかのメッセージが出続ける」方がより正しいと思われます。
いっそWeb化して自動で報告するのも、コストをかけていいならアリだと思います。

当該ExcelはVBAを使用していないのではないかと推測されますので(少なくとも合計はSUM系のワークシート関数ですよね?)、VBAを追加するのは保守も考慮するとよろしくないのでは、と愚考いたします。

ユーザーID:6892039829
トピ主です。考えています携帯からの書き込み
てんてんにゃんた(トピ主)
2019年7月23日 0:41

皆さま、どうしたら業務が上手く回るかまで考えて頂き、本当にありがとうございます。

そもそもVBAでなくてもいいのでは?とのご意見、ごもっともです。私も最初は条件付き書式でやるつもりでした。100の倍数を越えたら色が変わり、他部署への報告を実施して前回報告日を入力するというやり方を指示していました(VBAいらない 様のご提案と似たものです)。ところが報告もれがおこり、入力者数名からメッセージボックスを出してほしいと要望があったのです。

なぜかというと、日頃使っている社内システムに多用されていて馴染みがある為です。私の部署のローカルな習慣ですが、メッセージボックスが出たらしっかり確認する癖がついているので、それなら忘れる事はないと考えたようです。

社内システムはシステム部門が作っています。彼らなら私の悩みなど秒で解決でしょうが、部署で使う些細な集計表など作ってもらえるはずもないので、コチラで相談してみよう!と、思い立ちました。

得意でもないVBAを使ってもメンテナンスが困難とのご指摘もありました。それもその通りで、作ってさえしまえば楽かなあと思いましたがそうはいかないかもしれないですよね。

私は部署の中でこの件を束ねる責任者です。自動的に他部署への報告を行うようなメールシステムとの連携はできない環境なので、あとは私が定期的に確認するか、次の入力者が気づくようにするかです。

個人別集計表とリンクして別シートの全体集計が更新されるようにはなっていますが、数値達成を判定するセルも全員分別のシートに反映させてこちらでチェックしようかな、と。それなら私にも無理なく管理出来そうだし、報告漏れも防げそうです。2,3日なら許容範囲なので。

とは言え、考えて下さった関数もとても興味深いので、個人的に試してみようかと思っています。今回は使わないかも、ですが勉強はしたいと思ってます。

ユーザーID:0143330189
トピ主です。続きです携帯からの書き込み
てんてんにゃんた(トピ主)
2019年7月23日 0:49

今事情があり実家にもどっています。数日こちらにいる予定ですが、戻ったらどうするか決定して最終報告致します。まずはここまで、ありがとうございました。ご相談したことで見方を変えて考えることができました。

それにしても、自分の未熟さと皆さまの達人ぶりを比較し、もっと勉強しなくてはと反省です。日頃は対人スキルが重要視される部署ですが、仕事をするならPCスキルは高いに越したことないですね。これを機会に自分のスキルアップを考えます。だって、できたら楽しそうですもの。

ではまた後日改めます。貴重なお時間を割いて頂き、ありがとうございました。

ユーザーID:0143330189
 
現在位置は
です