Excel VBA 質問スレッド №2156 (解決済)

数の合計についてのVBA

投稿者 : KOJI     投稿日時 : 2025/11/20(Thu) 05:03:11     OS : Windows 10     EXCEL : Excel 2003
職場に「料理名と数」が入ったエクセル表があります。
セルはA1からA9とします。

A1  ●料理欄
A2  親子丼×2
A3  天丼×2
A4  親子丼×3
A5  天丼×3
A6  親子丼×3
A7  親子丼×2
A8  ●合計欄
A9  親子丼×9 天丼×5

上の表から、
① 料理欄の「親子丼×〇」を検索する
② 親子丼の「数(2,3,3,2)」を取り出す
③「数の合計(10)」を出す
④「数の合計(10)」と「合計欄(9)」が違う場合、
  合計欄のセルを赤く塗る

VBAで①~④を行うことはできますか?

諸先輩方の知恵をお借りしたいと思います。
回答をよろしくお願いいたします。

スポンサーリンク
[返信 1] Re : 数の合計についてのVBA
投稿者 : tkit     投稿日時 : 2025/11/20(Thu) 08:23:05
https://www.moug.net/faq/viewtopic.php?t=83142
では、諦めたのですね。

VBAで作るには、「親子丼×」「天丼×」という文字列を検索する必要があります。
実際の運用では変わりますよね。
また、大文字小文字の違いも重要ですし、×xxなど、見た目同じに見えるものも
違うものとされます。

まずは、1つのセルに文字列に100%「×」という文字が1つだけ存在するのか
が重要です。

ほとんどがあります。とか場合によっては2つあります。では、
上手くいかないケースがあります。

提示するデータに他のパターンは無いですか?

[返信 2] Re : 数の合計についてのVBA
投稿者 : てらてら     投稿日時 : 2025/11/20(Thu) 20:26:57
こんにちは。
取り敢えず、親子丼の合計までのコードを示します。
前の方がおっしゃるように、文字が不定となれば不具合を起こす事になります。
文字列でゴリゴリやろうとするとコードも複雑になり、不具合も起こりやすくなってあまり良いやり方とは言えません。

本来なら、料理名と個数を列で分けて管理する方がExcelっぽい使い方になり、プログラムも簡単に書けるようになるでしょう。

参考にしてみてください。

Sub macro()
    Dim i As Long
    Dim str As String
    Dim num As Long
    Dim myArray As Variant

    For i = 2 To 100
        str = Cells(i, "A")
        
        '空白が来たら抜ける
        If str = "" Then Exit For
        '「●合計欄」が来たら抜ける
        If InStr(str, "●合計欄") > 0 Then Exit For
        
        If InStr(str, "親子丼") > 0 Then
            myArray = Split(StrConv(Cells(i, "A"), vbNarrow), "×")
            num = num + myArray(1)
        End If
        
    Next i

    MsgBox "親子丼の合計=" & num
End Sub

[返信 3] Re : 数の合計についてのVBA
投稿者 : ピロリ     投稿日時 : 2025/11/20(Thu) 20:50:55
https://www.moug.net/faq/viewtopic.php?t=83142 で教えてもらった式では、
・合計(数字)が半角なので比較が面倒とか、
・合計欄の入力される料理は順不同なので比較が厄介とか、
・「かつ丼」が追加になったらどうしよう・・・ みたいなことなのでしょうかね?

ちなみに①~④に親子丼の話しか出てきませんが、全ての料理についての合計をチェックする
ってことですよね?
例題の通りならば、下のような感じで処理できるのかなぁって気がしますが、Excel2003 上で
動くかは分かりません。(環境が無いので試しようもない・・・ 動かなかったらご免なさい)

Sub Sample()
    Dim i As Long, buf1 As Variant, buf2 As Variant
    Dim dic1 As Variant, dic2 As Variant
    '料理欄の Dictionaryを作成(料理ごとの合計を計算)
    Set dic1 = CreateObject("Scripting.Dictionary")
    For i = 2 To 7
        If 0 < InStr(Cells(i, "A"), "×") Then
            buf1 = Split(Cells(i, "A"), "×")
            If dic1.exists(buf1(0)) = False Then
                dic1.Add buf1(0), Val(StrConv(buf1(1), vbNarrow))
            Else
                dic1(buf1(0)) = dic1(buf1(0)) + Val(StrConv(buf1(1), vbNarrow))
            End If
        End If
    Next i
    '合計欄の Dictionaryを作成(料理ごとの合計を計算)
    Set dic2 = CreateObject("Scripting.Dictionary")
    If Range("A9") <> "" Then
        buf1 = Split(Range("A9"), " ")
        For i = 0 To UBound(buf1)
            If 0 < InStr(buf1(i), "×") Then
                buf2 = Split(buf1(i), "×")
                If dic2.exists(buf2(0)) = False Then
                    dic2.Add buf2(0), Val(StrConv(buf2(1), vbNarrow))
                Else
                    dic2(buf2(0)) = dic2(buf2(0)) + Val(StrConv(buf2(1), vbNarrow))
                End If
            End If
        Next i
    End If
    '各々の Dictionaryを比較(料理の種類と料理ごとの合計が一致?)
    Range("A9").Interior.Color = vbRed
    If dic1.Count = dic2.Count Then
        For Each buf1 In dic1
            If dic1(buf1) <> dic2(buf1) Then Exit Sub
        Next buf1
        Range("A9").Interior.ColorIndex = xlNone
    End If
End Sub

[返信 4] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/21(Fri) 14:09:11
> https://www.moug.net/faq/viewtopic.php?t=83142
> では、諦めたのですね。
モーグさんでは「関数」で回答していただき、粗削りですが、
目的は達成しました。むしろ、関数の勉強になりました。

SUM関数しか知りませんでしたが、SUMIF関数があまりにも
あまりにも便利すぎて、衝撃を受けました。VBAの前に、
関数を勉強するだけでもかなり自動化できますね。

> まずは、1つのセルに文字列に100%「×」という文字が
> 1つだけ存在するのかが重要です。
料理欄では、必ず「1つのセルに×(カケル)は1つ」です。

しかし、合計欄では「1つのセルに×は1個以上」あります。
1つのセルに「親子丼×9」または「親子丼×9 天丼×5」など
個数は様々です。

[返信 5] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/21(Fri) 14:19:23
■[返信 1] tkitさん(2025-11-20 08:23:05)の記事
大変申し遅れました。

回答ありがとうございます。

[返信 6] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/21(Fri) 14:33:11
■[返信 2] てらてらさん(2025-11-20 20:26:57)の記事
回答ありがとうございます。

> 本来なら、料理名と個数を列で分けて管理する方がExcelっぽい使い方になり、
> プログラムも簡単に書けるようになるでしょう。
本当におっしゃる通りですし、モーグさんの先輩方も同じ意見です。

表は、プロのシステム屋が作った宿泊(料理)予約システムであり、
データがエクセルに自動的に貼り付けられたものです。
セルで細かく分けると「表が大きくなる」「表がまとまらない」ので、
合計欄が「親子丼×9 天丼×5」みたいにごちゃ混ぜになったのだと
思います^^;。プロの気持ちもよくわかります。

> 取り敢えず、親子丼の合計までのコードを示します。
ありがとうございます。ステップ実行で1つ1つ勉強させていただきます。

[返信 7] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/21(Fri) 14:52:56
■[返信 3] ピロリさん(2025-11-20 20:50:55)の記事
回答ありがとうございます。

> https://www.moug.net/faq/viewtopic.php?t=83142 で教えてもらった式では、
モーグさんで教えていただいた関数では、かなり粗削りですが
目的は達成できました。関数の勉強になりました。

(無知ゆえに)関数を舐めていましたし、SUM関数しか知りませんでした。
しかし、SUMIF関数のあまりの便利さに・・・・衝撃を受けました。
VBAの前に、関数を勉強するだけでもかなり自動化できると思います。

> ちなみに①~④に親子丼の話しか出てきませんが、全ての料理についての合計をチェックする
> ってことですよね?
おっしゃる通りです。

> 例題の通りならば、下のような感じで処理できるのかなぁって気がしますが、Excel2003 上で
> 動くかは分かりません。(環境が無いので試しようもない・・・ 動かなかったらご免なさい)
とんでもございません。
ステップ実行で1つ1つ勉強させていただきます。

会社の従業員は人手不足であり、現場はかなり披露困憊しています。
関数やVBAで自動化を進めていき、少しでも単純作業をなくさないと
会社員として生き残れません。皆様から勉強させていただきます。

[返信 8] Re : 数の合計についてのVBA
投稿者 : ピロリ     投稿日時 : 2025/11/22(Sat) 07:50:41
■[返信 7] KOJIさん(2025-11-21 14:52:56)の記事
> SUMIF関数のあまりの便利さに・・・・
> 関数やVBAで自動化を進めていき、少しでも単純作業をなくさないと・・・
ご要望は、料理欄と合計欄の突き合わせと、不一致時の合計欄の赤色塗り潰しって話でしたが、
SUMIFのように、料理欄を集計して合計の出力ってことなら、下のような感じでしょうか。
担当の方も、電卓叩いて合計入力しなくて済むし、料理欄に「かつ丼」が追加になっても式を
直す手間も要らないし・・・
ちなみに、Excel2003って、Dictionaryオブジェクト使えてます?(その辺りが心配ですが)

Sub Sample2()
    Dim i As Long, buf As Variant, str As String
    Dim dic As Variant
    '料理欄の Dictionaryを作成(料理ごとの合計を計算)
    Set dic = CreateObject("Scripting.Dictionary")
    For i = 2 To 7
        If 0 < InStr(Cells(i, "A"), "×") Then
            buf = Split(Cells(i, "A"), "×")
            If dic.exists(buf(0)) = False Then
                dic.Add buf(0), Val(StrConv(buf(1), vbNarrow))
            Else
                dic(buf(0)) = dic(buf(0)) + Val(StrConv(buf(1), vbNarrow))
            End If
        End If
    Next i
    '料理ごとの合計を出力
    str = ""
    For Each buf In dic
        str = str & " " & buf & "×" & StrConv(dic(buf), vbWide)
    Next buf
    Range("A9") = Mid(str, 2)
End Sub

[返信 9] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/22(Sat) 19:26:07
> ちなみに、Excel2003って、Dictionaryオブジェクト使えてます?(その辺りが心配ですが)
はじめて聞きましたが、ネット検索で調べたら、
2003でもDictionaryオブジェクトは使えるようです。

[返信 10] Re : 数の合計についてのVBA
投稿者 : 通りすがり     投稿日時 : 2025/11/23(Sun) 15:37:18
続き
https://www.moug.net/faq/viewtopic.php?t=83144

[返信 11] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/23(Sun) 18:23:26
■[返信 10] 通りすがりさん(2025-11-23 15:37:18)の記事
> 続き
> https://www.moug.net/faq/viewtopic.php?t=83144
回答ありがとうございます。

追加で、実際にVBAを書いてくださったとは!!!!!
本当にありがとうございます。

[返信 12] Re : 数の合計についてのVBA
投稿者 : 通りすがり     投稿日時 : 2025/11/23(Sun) 19:31:16
■[返信 11] KOJIさん(2025-11-23 18:23:26)の記事
> ■[返信 10] 通りすがりさん(2025-11-23 15:37:18)の記事
> > 続き
> > https://www.moug.net/faq/viewtopic.php?t=83144
> 回答ありがとうございます。

> 追加で、実際にVBAを書いてくださったとは!!!!!
> 本当にありがとうございます。
私は通りすがりですけど?

[返信 13] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/23(Sun) 19:37:37
> > 追加で、実際にVBAを書いてくださったとは!!!!!
> > 本当にありがとうございます。
> 私は通りすがりですけど?
ややこしい回答ですみませんでした。

追加情報のお知らせ、本当にありがとうございました。

[返信 14] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/23(Sun) 19:50:23
■[返信 2] てらてらさん(2025-11-20 20:26:57)の記事
> こんにちは。
> 取り敢えず、親子丼の合計までのコードを示します。

> Sub macro()
> Dim i As Long
> Dim str As String
> Dim num As Long
> Dim myArray As Variant

> For i = 2 To 100
> str = Cells(i, "A")

> '空白が来たら抜ける
> If str = "" Then Exit For
> '「●合計欄」が来たら抜ける
> If InStr(str, "●合計欄") > 0 Then Exit For

> If InStr(str, "親子丼") > 0 Then
> myArray = Split(StrConv(Cells(i, "A"), vbNarrow), "×")
> num = num + myArray(1)
> End If

> Next i

> MsgBox "親子丼の合計=" & num
> End Sub

VBAコードを試してみました。メッセージボックスで、
「料理欄の合計数」が表示されました。セルの位置に関係なく
メッセージが表示されるので、大変便利です。

セル上の、料理欄の「親子丼の数」を変更したら、
メッセージボックスの「数」も変わりました!!!!
コード自体が「数」を検索し、表示しているのですね。

[返信 15] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/23(Sun) 20:15:42
■[返信 3] ピロリさん(2025-11-20 20:50:55)の記事
> Sub Sample()
> Dim i As Long, buf1 As Variant, buf2 As Variant
> Dim dic1 As Variant, dic2 As Variant
> '料理欄の Dictionaryを作成(料理ごとの合計を計算)
> Set dic1 = CreateObject("Scripting.Dictionary")
> For i = 2 To 7
> If 0 < InStr(Cells(i, "A"), "×") Then
> buf1 = Split(Cells(i, "A"), "×")
> If dic1.exists(buf1(0)) = False Then
> dic1.Add buf1(0), Val(StrConv(buf1(1), vbNarrow))
> Else
> dic1(buf1(0)) = dic1(buf1(0)) + Val(StrConv(buf1(1), vbNarrow))
> End If
> End If
> Next i
> '合計欄の Dictionaryを作成(料理ごとの合計を計算)
> Set dic2 = CreateObject("Scripting.Dictionary")
> If Range("A9") <> "" Then
> buf1 = Split(Range("A9"), " ")
> For i = 0 To UBound(buf1)
> If 0 < InStr(buf1(i), "×") Then
> buf2 = Split(buf1(i), "×")
> If dic2.exists(buf2(0)) = False Then
> dic2.Add buf2(0), Val(StrConv(buf2(1), vbNarrow))
> Else
> dic2(buf2(0)) = dic2(buf2(0)) + Val(StrConv(buf2(1), vbNarrow))
> End If
> End If
> Next i
> End If
> '各々の Dictionaryを比較(料理の種類と料理ごとの合計が一致?)
> Range("A9").Interior.Color = vbRed
> If dic1.Count = dic2.Count Then
> For Each buf1 In dic1
> If dic1(buf1) <> dic2(buf1) Then Exit Sub
> Next buf1
> Range("A9").Interior.ColorIndex = xlNone
> End If
> End Sub

VBAコードを試してみました。
料理欄の「親子丼の合計数(10)」、合計欄の「合計(9)」が
違うので、セルが赤く塗られました。これが理想の形です。
実は「数の間違い」を知りたかったのです!これを毎日毎日、
電卓で手作業で行っていました。ムダな単純作業でした。

「数の間違い」を予約担当者に伝え、
表の「合計欄」を作り直し・印刷させる。これが私の最終目的です。
予約担当者が、合計欄の最終チェックを行わないから困っていました。

[返信 16] Re : 数の合計についてのVBA
投稿者 : KOJI     投稿日時 : 2025/11/23(Sun) 20:45:10
> ご要望は、料理欄と合計欄の突き合わせと、不一致時の合計欄の赤色塗り潰しって話でしたが、
> SUMIFのように、料理欄を集計して合計の出力ってことなら、下のような感じでしょうか。

> Sub Sample2()
> Dim i As Long, buf As Variant, str As String
> Dim dic As Variant
> '料理欄の Dictionaryを作成(料理ごとの合計を計算)
> Set dic = CreateObject("Scripting.Dictionary")
> For i = 2 To 7
> If 0 < InStr(Cells(i, "A"), "×") Then
> buf = Split(Cells(i, "A"), "×")
> If dic.exists(buf(0)) = False Then
> dic.Add buf(0), Val(StrConv(buf(1), vbNarrow))
> Else
> dic(buf(0)) = dic(buf(0)) + Val(StrConv(buf(1), vbNarrow))
> End If
> End If
> Next i
> '料理ごとの合計を出力
> str = ""
> For Each buf In dic
> str = str & " " & buf & "×" & StrConv(dic(buf), vbWide)
> Next buf
> Range("A9") = Mid(str, 2)
> End Sub

VBAコードを試してみました。

 ●料理欄
 親子丼×2
 天丼×2
 親子丼×3
 天丼×3
 親子丼×3
 親子丼×2
 ●合計欄
 親子丼×9 天丼×5



  ●料理欄
 親子丼×2
 天丼×2
 親子丼×3
 天丼×3
 親子丼×3
 親子丼×2
 ●合計欄
★親子丼×10 天丼×5

と自動的に表示されました。
他にも「料理欄の数」を変更したら「合計欄の数」も変わりました。
「親子丼の数」が実際に検索されているのですね。

[返信 17] Re : 数の合計についてのVBA
投稿者 : KOJI ひとり情シス     投稿日時 : 2025/11/25(Tue) 06:26:55
■[返信 2] てらてらさん(2025-11-20 20:26:57)の記事
> Sub macro()
> Dim i As Long
> Dim str As String
> Dim num As Long
> Dim myArray As Variant

> For i = 2 To 100
> str = Cells(i, "A")

> '空白が来たら抜ける
> If str = "" Then Exit For
> '「●合計欄」が来たら抜ける
> If InStr(str, "●合計欄") > 0 Then Exit For

> If InStr(str, "親子丼") > 0 Then
> myArray = Split(StrConv(Cells(i, "A"), vbNarrow), "×")
> num = num + myArray(1)
> End If

> Next i

> MsgBox "親子丼の合計=" & num
> End Sub

num = num + myArray(1) の
myArray(1) の意味がどうしても理解できません。
変数の後ろに()と数字、
これは配列と考えてよいのでしょうか。

[返信 18] Re : 数の合計についてのVBA
投稿者 : 少しは調べる     投稿日時 : 2025/11/25(Tue) 07:42:51
こいうとこ見れば
https://search.yahoo.co.jp/search?p=array+vba&fr=top_ga1_sa&ei=UTF-8&ts=6483&aq=3&oq=Array&at=s&ai=5647f869-1355-48ca-b394-b1829bf888e3

[返信 19] Re : 数の合計についてのVBA
投稿者 : KOJI ひとり情シス     投稿日時 : 2025/11/25(Tue) 09:53:27
■[返信 18] 少しは調べるさん(2025-11-25 07:42:51)の記事
回答ありがとうございます。

他のコードは、ネット検索やステップ実行ですべて調べたのですが、
ここだけは調べてもどうしてもわかりませんでした。
本当にありがとうございました。

[返信 20] Re : 数の合計についてのVBA
投稿者 : ピロリ     投稿日時 : 2025/11/25(Tue) 10:21:41
■[返信 19] KOJI ひとり情シスさん(2025-11-25 09:53:27)の記事
> 他のコードは、ネット検索やステップ実行ですべて調べたのですが、
> ここだけは調べてもどうしてもわかりませんでした。
どういう検索をしたのか、ステップ実行のやり方も分かりませんけど、
> myArray = Split(StrConv(Cells(i, "A"), vbNarrow), "×")
1行前で myArrayへ値を入れてます。Split関数を使って・・・ じゃ、Splitって何してくれたの?って話です。
・「vba split」とかで、検索しましたか?  ← 頭に「vba 」を付けると検索し易い
・ステップ実行時に、ローカルウィンドウで変数の構成や値を確認していますか?
特に、VBAに携わるなら、ステップ実行(デバッグ)時のローカルウィンドウやイミディエイトウィンドウは
外せないと思いますよ。 老婆心ながら・・・

[返信 21] Re : 数の合計についてのVBA
投稿者 : KOJI ひとり情シス     投稿日時 : 2025/11/25(Tue) 11:12:35
■[返信 20] ピロリさん(2025-11-25 10:21:41)の記事
> > myArray = Split(StrConv(Cells(i, "A"), vbNarrow), "×")
> 1行前で myArrayへ値を入れてます。Split関数を使って・・・
ありがとうございます。

> 特に、VBAに携わるなら、ステップ実行(デバッグ)時のローカルウィンドウやイミディエイトウィンドウは
> 外せないと思いますよ。 老婆心ながら・・・
イミディエイトウインドウを表示させ、ステップ実行しながら
入力された値を一回一回確認はしていました。

値の動きはわかっていましたが、基礎知識のなさから、関数の入れ子や
()の意味がほとんど理解できていません。
こちらで聞く前に、基礎から改めて勉強します。申し訳ありません。

[返信 22] Re : 数の合計についてのVBA
投稿者 : KOJI ひとり情シス     投稿日時 : 2025/11/25(Tue) 19:29:47
回答していただいた皆様、本当にありがとうございました。

[返信 23] Re : 数の合計についてのVBA
投稿者 : てらてら     投稿日時 : 2025/11/26(Wed) 04:56:31
返答が遅れてスミマセン。

>num = num + myArray(1) の
>myArray(1) の意味がどうしても理解できません。
>変数の後ろに()と数字、
>これは配列と考えてよいのでしょうか。

そうです。

myArray = Split(StrConv(Cells(i, "A"), vbNarrow), "×")
num = num + myArray(1)

Split関数の戻り値は、
"親子丼×2" を、"親子丼" "2" という配列を返してくれます。
myArray(0) = "親子丼"
myArray(1) = "2"

となるので、そのまま合計数に追加しています。
尚、セルの値が、"親子丼×2"という形だと決め打ちしていますので、
違う形だとエラーとなります。
エラー処理をしていないので少々乱暴な書き方になります。

[返信 24] Re : 数の合計についてのVBA
投稿者 : 困惑?     投稿日時 : 2025/11/26(Wed) 13:50:16
余計にわからなくなるかも

Range("A1:E1").Value = Array("A1", "B1", "C1", "D1", "E1")

Range("A2").Value = Array("A2", "B2", "C2", "D2", "E2")(0)
Range("B2").Value = Array("A2", "B2", "C2", "D2", "E2")(1)
Range("C2").Value = Array("A2", "B2", "C2", "D2", "E2")(2)
Range("D2").Value = Array("A2", "B2", "C2", "D2", "E2")(3)
Range("E2").Value = Array("A2", "B2", "C2", "D2", "E2")(4)

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-11-27 07:43:12 )
タイトルとURLをコピーしました