Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : その他)
合計と合計欄を比べる
投稿日時: 25/11/18 18:08:14
投稿者: KOJI2025

職場に「料理名と数」が入ったエクセル表があります。
セルはA1からA9とします。
  
A1  ●料理欄
A2  親子丼×2
A3  天丼×2
A4  親子丼×3
A5  天丼×3
A6  親子丼×3
A7  親子丼×2
A8  ●合計欄
A9  親子丼×9 天丼×5
  
上の表から、
@ 料理欄の「親子丼×〇」を検索する
A 親子丼の「数(2,3,3,2)」を取り出す
B「数の合計(10)」を出す
C「数の合計(10)」と「合計欄(9)」が違う場合、
  合計欄のセルを赤く塗る
  
VBAで@〜Cを行うことはできますか?
  
諸先輩方の知恵をお借りしたいと思います。
回答をよろしくお願いいたします。

回答
投稿日時: 25/11/19 12:30:35
投稿者: simple

期待されている回答ではないですが、素直な感想を書きます。
話が違うということならスキップ下さい。
 
VBAで対応できると思いますが、
それよりも、Excelの基本的な作法に則った使い方に変更することを検討されたほうが
有益な気がします。
 
ひとつのセルに「料理名」と「数」を一緒に入れるのは、
手書きのメモ帳ではないんですから、基本的に避けるべきだと思います。
スタートが適切でないデータ管理方法だと無益な苦労をするだけです。
まずは、マクロとかの話じゃなくて、二つのセルに分けることを検討してみてはいかがですか?
 
そうすれば、Excelに備わった色々な集計機能が使えるはずです。
SUMIF,SUMIFSなどの関数とか、今後の話としてピボットテーブルとかいったものなどです。
なお、提示されたケースでは2セルに分離しておけばSUMIF関数で簡単に合計は計算できますから、
マクロで選択範囲を対象に各料理ごとの個数合計すれば、基本的に検証もさして要らなくなるのでは?

回答
投稿日時: 25/11/19 14:00:49
投稿者: 紙頼

VBAを使うのはもったいないような気がします。
何段階か関数を組み合わせるとかでは
だめなので、この問い合わせだとは思いますが・・・。
 
関数を1セルでよければ、
A10に
="親子丼×"&SUM((LEFT(A2:A7,2)="親子")*VALUE(MID(A2:A7,FIND("×",A2:A7)+1,2)))&" "&"天丼×"&SUM((LEFT(A2:A7,2)="天丼")*VALUE(MID(A2:A7,FIND("×",A2:A7)+1,2)))
 
A9セルの条件付の書式でA10の値と等しくなければ、希望の色で塗りつぶすように指定すればできると思います。
 
これだとA10が余分なデータになりますかね。

投稿日時: 25/11/19 14:18:56
投稿者: KOJI2025

simple様
 
以前は大変お世話になりました。
 
>>期待されている回答ではないですが、素直な感想を書きます。
大人の貴重なご意見をありがとうございます。
問題点を冷静に教えていただき、勉強になります。
 
この表は、
プロのシステム屋が作った「宿泊業予約システム(料理)」の
データを、自動的にエクセルに貼り付けたものです。
表は、それを極限にまで単純化させたものです。
表はシステム屋が作りましたが、私も使いにくいと思います。

回答
投稿日時: 25/11/19 17:47:15
投稿者: simple

回答ありがとうございました。
 
驚きました。絶句。
興味本位でお伺いしますが、A9セルはそのシステムが吐き出した文字列なんですか?
それともユーザーが暗算で追加で入れたものなんですか?
  
前者ならシステムの精度が低いのでクレームをつけるべきですね。
そんなチェックが必要なシステムは突き返すべきでは?
  
ま、落ち着いて返事すると、
・「区切り位置」で"×"を区切り文字に指定して実行すれば、2つのセルに分離できます。
・集計はSUMIFを使ってできますね。
・A9セルもなんとか、
   A9セル 親子丼×9 →2セルに展開
   A10 天丼×5 →2セルに展開
  のようなことはできないのですか?
 
ちなみに、職場のExcelのバージョンは何ですか?
 
# 「現状のデータは変更せずにマクロで」というのは私は気が進まないので(現時点では)、
# 他のかたの回答をお待ちください。

投稿日時: 25/11/19 18:31:23
投稿者: KOJI2025

紙頼様
 
>>VBAを使うのはもったいないような気がします。
>>何段階か関数を組み合わせるとかでは
>>だめなので、この問い合わせだとは思いますが・・・。
貴重なご意見をありがとうございます。
 
>> ="親子丼×"&SUM((LEFT(A2:A7,2)="親子")*VALUE(MID(A2:A7,FIND("×",A2:A7)+1,2)))&"
>> "&"天丼×"&SUM((LEFT(A2:A7,2)="天丼")*VALUE(MID(A2:A7,FIND("×",A2:A7)+1,2)))
関数ですね。
早速、関数を勉強しながら使わせていただきます。

投稿日時: 25/11/19 18:59:49
投稿者: KOJI2025

simple様
 
>>ちなみに、職場のExcelのバージョンは何ですか?
2019です。私の自宅のエクセルは2003です。
 
>>それともユーザーが暗算で追加で入れたものなんですか?
予約システムが自動的に出したデータは完璧です!!!
 
会社の予約担当者が、お客様の「食事場所を変更する目的」で、
予約システムが出したデータをPC上で「修正」しています。
その結果が・・・「料理欄と合計欄の数が違う」です。
会社の予約担当者が、「料理欄と合計欄の最終チェック」を
怠っているだけですね。システム会社は大変優秀です!
 
私は、毎日手作業で、「料理欄と合計欄の数」を確認する
羽目になっています。しかし、関数・VBAで自動化できたら
ムダな単純作業がなくなると考えました。
 
>>・「区切り位置」で"×"を区切り文字に指定して実行すれば、2つのセルに分離できます。
早速やってみます( ^^)b。

回答
投稿日時: 25/11/19 19:05:37
投稿者: 半平太

引用:
A9  親子丼×9 天丼×5

天丼もA9セルに入っているんですか?
それともB9セルなんですか?

回答
投稿日時: 25/11/19 19:19:40
投稿者: simple

引用:
会社の予約担当者が、お客様の「食事場所を変更する目的」で、
予約システムが出したデータをPC上で「修正」しています。
その結果が・・・「料理欄と合計欄の数が違う」です。

ということなら、最終の目標は、合計欄を関数で計算する方式に変更することではないでしょうか。
そうすれば修正しても正しい合計になると思います。
そうした仕組みにしておくことは、よくとられている方式だと思います。

回答
投稿日時: 25/11/19 19:48:57
投稿者: simple

ついでに確認すると
・人数は全角文字ですか
・データは一シートにひとつですか?それとも、シート内のいくつかのセル範囲に分散していますか?
・一日に作成するデータは何シートくらいですか。概略で結構です。

回答
投稿日時: 25/11/19 20:04:53
投稿者: simple

私のスタンスが中途半端ですみません。ROMに回ります。よろしくお願いします。

投稿日時: 25/11/19 20:23:28
投稿者: KOJI2025

半平太 さんの引用:
引用:
A9  親子丼×9 天丼×5

天丼もA9セルに入っているんですか?
それともB9セルなんですか?

 
回答ありがとうございます。
「親子丼×9 天丼×5」はA9セル(同じセル)に入っています。

投稿日時: 25/11/19 21:40:28
投稿者: KOJI2025

関数で問題が解決しました。
皆様ありがとうございました。