どなたかお願いします。
エクセルで弁当店のオーダーを集計しています。
商品ごとにM・L・LLサイズの各数量をカウントしたいのです。
単純にサイズごとに入力すれば済む事ですが、過去の経緯から
このような表記になっています。
――――――――――――――――――――――
焼肉ランチ 5L (5個全てがLの意味)
唐揚ランチ 7L3 (注文が7個でそのうちLは3個、残りはM)
ハンバーグ 10L2LL1 (注文が10個でそのうちLは2個LLは1個、残りはM)
――――――――――――――――――――――
※データは半角で入力してあります
※Mは通常サイズなので「M」の文字入力はしません
上記内容から商品ごとにサイズをカウントする方法は
ないでしょうか。宜しくお願いします。
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
A No.1です。
既にrin01さんの、「1行でプログラム」みたいな、凄いのが出ておりますが、一応作成してみました。テスト用データと結果は下記の通り
.......................A................B..........C..........D..........E
..1................品名..オーダー..........M..........L........LL
..2焼き肉ランチ................5..........5..........0..........0
..3唐揚げランチ............5L2..........3..........2..........0
..4....ハンバーグ.......5L2LL1..........2..........2...........1
..5....しゃけ弁当..............5L..........0..........5..........0
..6............のり弁............5LL..........0..........0..........5
プログラムは、逐次チェックで芸が無いですが、マクロ実行一発で済みます
Type lunchSize
M As Long
L As Long
LL As Long
End Type
Sub test()
Dim targetRange As Range
Dim i As Long
Dim returnVal As lunchSize
Dim targetCell As Range
Set targetRange = ActiveSheet.Range("a1").CurrentRegion
For i = 2 To targetRange.Rows.Count
Set targetCell = targetRange.Cells(i, 2)
returnVal = splitType(targetCell.Value)
With returnVal
targetCell.Offset(0, 1) = .M
targetCell.Offset(0, 2) = .L
targetCell.Offset(0, 3) = .LL
End With
Next i
End Sub
Private Function splitType(targetString As String) As lunchSize
Dim returnNo As Long
With splitType
returnNo = subMatchNo(targetString, "^(\d+)$")
If returnNo > 0 Then
.M = returnNo
.L = 0
.LL = 0
Exit Function
End If
returnNo = subMatchNo(targetString, "^(\d+)L$")
If returnNo > 0 Then
.M = 0
.L = returnNo
.LL = 0
Exit Function
End If
returnNo = subMatchNo(targetString, "^(\d+)LL$")
If returnNo > 0 Then
.M = 0
.L = 0
.LL = returnNo
Exit Function
End If
.L = subMatchNo(targetString, "L(\d+)")
.LL = subMatchNo(targetString, "LL(\d+)")
.M = subMatchNo(targetString, "^(\d+)\D+.*") - .L - .LL
End With
End Function
Private Function subMatchNo(targetString As String, patternString As String) As Variant
Dim regEX As Object
Dim Matches As Object
Dim match As Object
Dim subMatch As Object
Dim i As Long
Set regEX = CreateObject("VBScript.RegExp")
regEX.MultiLine = False
regEX.Pattern = patternString
regEX.ignorecase = False
regEX.Global = False
Set Matches = regEX.Execute(targetString)
i = 1
If Matches.Count > 0 Then
subMatchNo = Matches(0).submatches.Item(0)
Else
subMatchNo = 0
End If
Set Matches = Nothing
Set regEX = Nothing
End Function
No.9
- 回答日時:
おはようございま~す。
。。♪>「5L、5LL」の場合も可能であれば教えてください。
にも対応させました。。。
条件がダブってるので、式も長くなってしまいました。。。
私の表で、
(注文数)D2 (Mサイズ)E2の式は前回と同じです。。
(Lサイズ)F2セルは。。
=IF(B2="","",CHOOSE(COUNT(INDEX(0/(MID(B2,ROW($1:$20),1)="L"),))+1,0,IF(MID(B2,FIND("L",B2)+1,1)="",D2,LOOKUP(10^7,RIGHT(B2,ROW($1:$20))*1)),0,LOOKUP(10^7,LEFT(REPLACE(B2,1,FIND("L",B2),),ROW($1:$20))*1)))
(LLサイズ)G2セルは。。
=IF(B2="","",CHOOSE(COUNT(INDEX(0/(MID(B2,ROW($1:$20),1)="L"),))+1,0,0,IF(MID(B2,FIND("L",B2)+2,1)="",D2,LOOKUP(10^7,RIGHT(B2,ROW($1:$20))*1)),LOOKUP(10^7,RIGHT(B2,ROW($1:$20))*1),D2))
でした。。
。。。Ms.Rin~♪♪
No.8
- 回答日時:
ふたたび~Ms.Rinです。
。。スミマセン!!
オーダーの入力順が違ってましたネ!!。。。
L→LLの順ですね。。
★前の2つの回答は無視してください。。。
A B C D E F G
1 品名 オーダー 注文数 M L LL
2焼肉ランチ 5L4 5 1 4 0
3唐揚ランチ 7LL3 7 4 0 3
4ハンバーグ 20L12LL1 20 7 12 1
5しゃけ弁当 10 10 10 0 0
D2セルへ
=IF(B2="","",LOOKUP(10^7,LEFT(B2,ROW($1:$20))*1))
E2セルへ
=IF(B2="","",D2-SUM(F2:G2))
F2セルへ
=IF(B2="","",IF((LEN($B2)-LEN(SUBSTITUTE($B2,"L",))=2)+(ISNUMBER(B2)),0,LOOKUP(10^7,LEFT(REPLACE(B2,1,FIND("L",B2),),ROW($1:$20))*1)))
G2セルへ
=IF(B2="","",IF(((LEN($B2)-LEN(SUBSTITUTE($B2,"L",)))=1)+(ISNUMBER(B2)),0,LOOKUP(10^7,RIGHT(B2,ROW($1:$20))*1)))
それぞれ下へコピー。。。
最終回答でした。。。
。。。Ms.Rin~♪♪
No.7
- 回答日時:
Ms.Rinです。
。。スミマセン!!
表が違ってました~。。。
A B C D E F G
1 品名 オーダー 注文数 M L LL
2焼肉ランチ 5L4 5 1 4 0
3唐揚ランチ 7LL3 7 4 0 3
4ハンバーグ 20LL12L1 20 7 1 12
5しゃけ弁当 10 10 10 0 0
こちらが正しい表です。。。
この回答への補足
ありがとうございます。
なるほど、関数のみで出来るもんですね・・・。
「5L、5LL」の場合も可能であれば教えてください。
注文が5個で全て大盛りL(LL)サイズの意味です。
Lの後に数字が無い場合、注文全部がLの意味になる
約束で運営していますので。
5L5、5LL5と入力できない点が問題なのですが・・・。
宜しくお願いします。
No.6
- 回答日時:
こんばんは~♪
こんな表の場合です。。。
A B C D E F G
1 品名 オーダー 注文数 M LL L
2焼肉ランチ 5L4 5 1 4 0
3唐揚ランチ 7LL3 7 4 0 3
4ハンバーグ 20LL12L1 20 7 12 1
5しゃけ弁当 10 10 10 0 0
D2セルへ
=IF(B2="","",LOOKUP(10^7,LEFT(B2,ROW($1:$20))*1))
E2セルへ
=IF(B2="","",D2-SUM(F2:G2))
F2セルへ
=IF(B2="","",IF(((LEN($B2)-LEN(SUBSTITUTE($B2,"L",)))=2)+(ISNUMBER(B2)),0,LOOKUP(10^7,RIGHT(B2,ROW($1:$20))*1)))
G2セルへ
=IF(B2="","",IF((LEN($B2)-LEN(SUBSTITUTE($B2,"L",))=1)+(ISNUMBER(B2)),0,LOOKUP(10^7,LEFT(REPLACE(B2,1,FIND("LL",B2)+1,),ROW($1:$20))*1)))
それぞれ下へコピー。。。
ご参考にどうぞ。。。
。。。Ms.Rin~♪♪
No.5
- 回答日時:
A No.1です。
もう寝ようと、入浴していて気がつきましたが、5Lの解釈がまだ違ってますね。条件分岐が複雑になるので、ユーザー定義関数では無理で、VBAでの処理を組まなければダメかもしれません。乗りかかった船で、もう少しやってみますので、全てのバリエーションを明確にしていただけますか。ただの、5なんてのもありそうですね。
この回答への補足
遅い時間までありがとうございます。
ご推察の通り5Lの場合だけ「L1個・M4個」となってしまいます。
ただの「5」の場合はM5個となりOKでした。
――――――――――――――――――――――――――――
お客様の言い方が「M○○個、L○○個ちょうだい」
となる場合、全スタッフがスムーズに記録できるのですが
大概の場合は「弁当5個ちょうだい・・・あっ、2個大盛りね」
などとなってしまいます。
そこで長年の手順として
(1)まずは全ての数量を記録する、これを普通盛りサイズMと見なす。
(2)次に例外の大盛りL、特盛りLLを個数とともに右に書き加える
となっているのです。
――――――――――――――――――――――――――――
全てのバリエーションを記します。(セル入力値)
(5) ・・・・・M5個
(5L2) ・・・・M3個 L2個
(5L2LL1)・・・M2個 L2個 LL1個
(5L)・・・・・L5個
(5LL) ・・・・LL5個
※例えば5Lを5L5とすれば、注文が5個でそのうちLが5個の意味ですから
現状で問題なく値が得られます。しかし高齢のスタッフも多く手順変更
は最後にしたいと考えています。
よろしくお願いします。
No.4
- 回答日時:
A No.1です。
早とちりしておりました。下記でいかがでしょうか。
Function subMatchNo(targetString As String, patternString As String) As Variant
Dim regEX As Object
Dim Matches As Object
Dim match As Object
Set regEX = CreateObject("VBScript.RegExp")
regEX.MultiLine = False
regEX.Pattern = patternString
regEX.ignorecase = True
regEX.Global = False
On Error GoTo errorHandle
Set Matches = regEX.Execute(targetString)
If Matches(0).subMatches.Count > 0 Then
subMatchNo = Val(Matches(0).subMatches.Item(0))
If subMatchNo = 0 Then subMatchNo = 1
Else
subMatchNo = 0
End If
Set Matches = Nothing
Set regEX = Nothing
Exit Function
errorHandle:
subMatchNo = 0
End Function
......................A................B.........C.........D.........E
..1..................................................L.......LL.........M
..2...焼肉ランチ..............5L..........1.........0.........4
..3...唐揚ランチ............7L3.........3.........0.........4
..4...ハンバーグ......10L2LL1.........2..........1.........7
..5...............合計...........................6..........1........15
C2:=subMatchNo($B2,"L(\d*)")
D2:=subMatchno($B2,"LL(\d*)")
E2:=subMatchno($B2,"^(\d*)")-SUM(C2:D2)
No.3
- 回答日時:
ANo1さんと同様、ワークシート関数で行う方法はあるかもしれませんが、少なくとも私には難しい(やるとすると式が長くなりすぎる。
)私のサンプルは正規表現を使わない方法です。
ANo1さんの方がすっきりとしたサンプルですが、せっかく考えたので・・
Function GetSizeCount(ByVal OrderStr As String, ByVal OrderSize As String) As Integer
Dim L1, L2, L3, L, LL, M As Integer
Dim OStr, OSize As String
'念のためにセル入力値を大文字に変換
OStr = StrConv(OrderStr, vbUpperCase)
OSize = StrConv(OrderSize, vbUpperCase)
If OStr = "" Then
'注文情報が無い
GetSizeCount = 0
Exit Function
End If
If IsNumeric(OStr) Then
'数字のみの場合はMだけ
If OrderSize = "M" Or (OSize <> "L" And OSize <> "LL") Then
'要求サイズがM(またはL,LL以外)の場合は数量を返す
GetSizeCount = CInt(OStr)
Exit Function
Else
'要求サイズがL,LLの場合は0を返す
GetSizeCount = 0
End If
End If
L1 = InStr(OStr, "L") '1個目のLの位置
If L1 = 1 Then
'先頭がLで始まっている場合の対応
OStr = "1" & OStr
L1 = 2
End If
L2 = InStr(L1 + 1, OStr, "L") '2個目のLの位置
L3 = InStr(L2 + 1, OStr, "L") '3個目のLの位置
'Mサイズの数量は常に末尾なので最後のLの位置以降を数量とする
M = CInt(Mid(OStr, Application.WorksheetFunction.Max(L1, L2, L3) + 1, Len(OStr)))
If OSize = "M" Then
'要求のサイズがMならL、LLの個数取得はしない
GetSizeCount = M
Exit Function
End If
If L1 = 0 Then
'最初のLが無ければL,LLともに0とみなす
LL = 0
L = 0
ElseIf L1 = L2 - 1 Then
'最初の数字はLL(1番目のLと2番目Lが連続している、つまりLL)
LL = CInt(Left(OStr, L1 - 1))
If L3 = 0 Then
'3個目のLが無ければLは0とみなす
L = 0
Else
L = CInt(Mid(OStr, L2 + 1, L3 - L2 - 1))
End If
Else
'最初の数字はL(2番目のLが1番目と離れている)
L = CInt(Left(OStr, L1 - 1))
If L2 = 0 Then
'2個目のLが無ければLLは0とみなす
LL = 0
Else
LL = CInt(Mid(OStr, L1 + 1, L2 - L1 - 1))
End If
End If
'要求サイズによって該当する数量を返す
If OSize = "L" Then
GetSizeCount = L
ElseIf OSize = "LL" Then
GetSizeCount = LL
Else
GetSizeCount = M
End If
End Function
この回答への補足
ありがとうございます。問題なく動きました。
やっとここまで来たぞという感じです。
ANo.1さんに補足説明しましたが、質問の仕方が
悪かったようです。
再度、教えていただければ幸いです。
よろしくお願いします。
No.1
- 回答日時:
下記正規表現を利用した、ユーザー定義関数を用いる案です
データが沢山あると、重くて実用的ではないかもしれません。その場合は、VBAで処理する様に組んでやる必要があるかも。また、Mは一番最後にあるとしています。もっと軽い方法を使った回答が出てくると思いますが、ご参考まで。
Function subMatchNo(targetString As String, patternString As String) As Variant
Dim regEX As Object
Dim Matches As Object
Dim match As Object
Set regEX = CreateObject("VBScript.RegExp")
regEX.MultiLine = False
regEX.Pattern = patternString
regEX.ignorecase = False
regEX.Global = False
On Error GoTo errorHandle
Set Matches = regEX.Execute(targetString)
If Matches(0).subMatches.Count > 0 Then
subMatchNo = Val(Matches(0).subMatches.Item(0))
Else
subMatchNo = 0
End If
Set Matches = Nothing
Set regEX = Nothing
Exit Function
errorHandle:
subMatchNo = 0
End Function
実行例です
......................A................B....C....D....E
..1.............................................L..LL....M
..2...焼肉ランチ..............5L....5....0....0
..3...唐揚ランチ............7L3....7....0....3
..4...ハンバーグ......10L2LL1...10....2.....1
..5...............合計....................22....2....4
ユーザー定義関数の使用方法です(以下、下の行にコピー)
C2:=subMatchNo($B2,"(\d*)L")
D2:=subMatchNo($B2,"(\d*)LL")
E2:=subMatchNo($B2,"(\d)$")
参考URL:http://officetanaka.net/excel/vba/tips/tips38.htm
この回答への補足
早速ありがとうございます。
問題なく動きましたが、私の質問が足りなかったようです。
申し訳ありません。
例えばハンバーグの「10L2LL1」は
M=3個 L=2個 LL=1個
の意味になります。
―――――――――――――――――――――――――――
ハンバーグ10個お願いしま~す!! はいよ~
そのうちLが2個で、LLが1個で~す!
―――――――――――――――――――――――――――
こんな感じです。
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで納品書(入伝票)を作成 7 2022/04/14 10:15
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- Excel(エクセル) スプレッドシート 関数で集計したい 2 2023/01/08 17:09
- その他(Microsoft Office) EXCEL VLOOKUPに関する質問 5 2023/02/08 11:38
- キッズ・子供服 至急です 赤白帽子のサイズ選びについてです。 1 2022/10/31 14:04
- Excel(エクセル) エクセルの条件付き書式 4 2023/04/17 11:05
- レディース 明日友人の結婚式がありYahooショッピングでパーティードレスを注文したのですが、火曜日に注文して木 3 2023/04/08 14:42
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- アジア 今月、成田からマレーシアへANAで旅行予定です。 荷物に付いてよくわからないので教えて下さい。 お預 1 2022/07/12 19:11
- レディース 女性に質問です。 LLサイズやそれ以上の方は何処で服を購入してますか? オシャレな服が欲しいのですが 3 2023/01/11 13:23
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
【お題】 ・ありそうだけど、絶対に無いことわざを教えてください。
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
店員も客も斜め上を行くデパートの福袋
シュールを通り越して店員も客も斜め上を行くデパートの福袋に入ってそうなものを教えて下さい。 よかったらレビューもしてください。
-
エクセルで集計したい。
CGI
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一人で外食をする人を見るとと...
-
異性の同僚と二人きりでランチ...
-
ランチからひとりだけ抜けて輪...
-
東天紅で食事する時の服装について
-
女性のほうからランチに誘う場合
-
明日昼に既婚女性をランチに誘...
-
夫婦について 皆さんは友達と遊...
-
受け身で誘われ待ち体質の同僚...
-
都内ホテルのランチブッフェ
-
ランチはディナーよりお得?
-
高校生でもOK!!
-
マッチングアプリの男にLINEで...
-
気があるんでしょうか?
-
職場の社員食堂で男性が女性と...
-
元職場の人に久しぶりに会いた...
-
神奈川と千葉の間は?
-
仕事で使う「ランチョン」と「...
-
誘った方が毎回予約するのは当...
-
新橋でデート~ランチ~
-
平日にしかできないこと
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ランチからひとりだけ抜けて輪...
-
一人で外食をする人を見るとと...
-
異性の同僚と二人きりでランチ...
-
東天紅で食事する時の服装について
-
職場の社員食堂で男性が女性と...
-
神奈川と千葉の間は?
-
夫婦について 皆さんは友達と遊...
-
女性のほうからランチに誘う場合
-
誘った方が毎回予約するのは当...
-
毎日ランチに誘ってくる彼氏持...
-
臨月に飲みに行くことについて ...
-
苦手な人とのランチについて。 ...
-
ネッ友の年上(9歳↑)の男性と会...
-
セブンの事で質問なんですがセ...
-
「社会の底辺と関わってはいけ...
-
受け身で誘われ待ち体質の同僚...
-
お昼休憩を一人でとるのはおか...
-
気があるんでしょうか?
-
エクセルでM・L・LLサイズ...
-
ランチはディナーよりお得?
おすすめ情報