1371175032 質問です

エクセルで文字が混じった数字の小計と合計を出す
関数かまたはマクロをお願いします

    100件/50人
    50件/25人
小計  150件/75人

    100件/50人
    50件/25人
小計  150件/75人

合計  300件/150人

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/06/14 13:56:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント90pt

以下のコードを、標準モジュールに書いてください。

Function sum_item_person(ParamArray args() As Variant)

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "(\d+)件/(\d+)人"
    re.Global = True

    item = 0
    person = 0
    
    For Each r In args
        For Each c In r
            Set remat = re.Execute(c.Value)
            If remat.Count > 0 Then
                item   = item   + remat(0).SubMatches(0)
                person = person + remat(0).SubMatches(1)
            end if
        Next c
    Next r

    sum_item_person = CStr(item) & "件/" & CStr(person) & "人"

End Function

関数の引数には、セルの範囲を指定します。
指定した範囲で、「(数字)件/(数字)人」となっているセルだけを合計の対象とします。
セル範囲を複数指定することも可能です。
例えば、こんな使い方ができます。

=sum_item_person(A1:B6, D10:F12)

シートのイメージだと、こんな感じです。

 AB
1  72件/48人
2  25件/12人
3  3件/10人
4 小計=sum_item_person(B1:B3)
5   
6  22件/8人
7   
8  34件/7人
9   
10 14件/15人
11小計=sum_item_person(B6:B10)
12  
13  
14合計=sum_item_person(B4,B11)
他2件のコメントを見る
id:a-kuma3

足し算するところも変えなきゃダメかな、と思ったんですが、パターンを変えるだけで計算できそうです。

    re.Pattern = "(\d+)件/(\d+)人"

のところを、このように変えてください。

    re.Pattern = "([\d,]+)件/([\d,]+)人"
2013/07/22 11:29:46
id:inosisi4141

早速ありがとうございました。
上手くいきました。助かりました。

2013/07/22 11:42:53

その他の回答1件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

Function 合計(ar As Range)

    Dim c As Range
    
    Dim k1 As Long
    Dim k2 As Long
    
    k1 = 0
    k2 = 0
    
    For Each c In ar
        d = c.Value
        d1 = Replace(d, "人", "")
        d2 = Split(d1, "件/")
        
        k1 = k1 + d2(0)
        k2 = k2 + d2(1)
        
    Next c

    合計 = CStr(k1) & "件/" & CStr(k2) & "人"

End Function

標準モジュールに 上記のソースを記述してください。

"件/"が 区切り
"人"は 最後に くっついているものとし、みな同一とします。
変更する場合は、この記述を変更してください。
"人"は なくても いいですが、結果には つきます。

使い方は
=合計(A1:A3)
というように 合計したいセルの範囲を指定してください。

他3件のコメントを見る
id:inosisi4141

ありがとうございます。
添付してあるのがサンプルデータです。
質問に書いてあるデータでは説明が不十分でした。
申し訳ございません。

2013/06/14 13:53:33
id:taknt

添付したものでも 大丈夫だと思いますよ。

2013/06/14 14:04:26
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント90pt

以下のコードを、標準モジュールに書いてください。

Function sum_item_person(ParamArray args() As Variant)

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "(\d+)件/(\d+)人"
    re.Global = True

    item = 0
    person = 0
    
    For Each r In args
        For Each c In r
            Set remat = re.Execute(c.Value)
            If remat.Count > 0 Then
                item   = item   + remat(0).SubMatches(0)
                person = person + remat(0).SubMatches(1)
            end if
        Next c
    Next r

    sum_item_person = CStr(item) & "件/" & CStr(person) & "人"

End Function

関数の引数には、セルの範囲を指定します。
指定した範囲で、「(数字)件/(数字)人」となっているセルだけを合計の対象とします。
セル範囲を複数指定することも可能です。
例えば、こんな使い方ができます。

=sum_item_person(A1:B6, D10:F12)

シートのイメージだと、こんな感じです。

 AB
1  72件/48人
2  25件/12人
3  3件/10人
4 小計=sum_item_person(B1:B3)
5   
6  22件/8人
7   
8  34件/7人
9   
10 14件/15人
11小計=sum_item_person(B6:B10)
12  
13  
14合計=sum_item_person(B4,B11)
他2件のコメントを見る
id:a-kuma3

足し算するところも変えなきゃダメかな、と思ったんですが、パターンを変えるだけで計算できそうです。

    re.Pattern = "(\d+)件/(\d+)人"

のところを、このように変えてください。

    re.Pattern = "([\d,]+)件/([\d,]+)人"
2013/07/22 11:29:46
id:inosisi4141

早速ありがとうございました。
上手くいきました。助かりました。

2013/07/22 11:42:53

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません