1366691507 《特定のキーワードを含む文字列から数字の部分だけを抽出し、その数値を合計後、任意のセルに反映させる関数もしくはマクロ》


表題の件で質問があります。
今、添付の図のようにデータが並んでおります。

このデータの中から、【P】を含むセル内を検索し、さらにハイフン(-)の後ろについている数字を抽出し、合計します。
そして合計した値を、そのセルがあった列の任意のセルに出す。
図の場合ですとB16ですね。
次の列の場合はC16といったように。
そのような処理を関数もしくはマクロで可能でしたら、お教えいただきたい次第です。
よろしくお願いします。

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

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント200pt

こんな感じのことでしょうか。

Option Explicit

'//--------------------------------------------
Sub MainSample()
'//--------------------------------------------
    Range("B16").Value = StrSumIf(Range("B1:B15"), "【P】")
    Range("C16").Value = StrSumIf(Range("C1:C15"), "【P】")
End Sub

'//--------------------------------------------
Function StrSumIf(範囲 As Range, 文字列 As String)
'//--------------------------------------------
    StrSumIf = 0
    Dim セル As Range
    Dim 分割結果
    For Each セル In 範囲
        If InStr(セル.Value, 文字列) Then
            分割結果 = Split(セル.Value, "-")
            If UBound(分割結果) = 1 Then
                If IsNumeric(分割結果(1)) Then StrSumIf = StrSumIf + CDbl(分割結果(1))
            End If
        End If
    Next
End Function

コードを標準モジュールにおけば、B16 に直接下記のように書いても使えます。

=StrSumIf(B1:B15, "【P】")
id:moon-fondu

ありがとうございます、うまくいきました!

2013/04/25 09:15:38

その他の回答1件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント200pt

こんな感じのことでしょうか。

Option Explicit

'//--------------------------------------------
Sub MainSample()
'//--------------------------------------------
    Range("B16").Value = StrSumIf(Range("B1:B15"), "【P】")
    Range("C16").Value = StrSumIf(Range("C1:C15"), "【P】")
End Sub

'//--------------------------------------------
Function StrSumIf(範囲 As Range, 文字列 As String)
'//--------------------------------------------
    StrSumIf = 0
    Dim セル As Range
    Dim 分割結果
    For Each セル In 範囲
        If InStr(セル.Value, 文字列) Then
            分割結果 = Split(セル.Value, "-")
            If UBound(分割結果) = 1 Then
                If IsNumeric(分割結果(1)) Then StrSumIf = StrSumIf + CDbl(分割結果(1))
            End If
        End If
    Next
End Function

コードを標準モジュールにおけば、B16 に直接下記のように書いても使えます。

=StrSumIf(B1:B15, "【P】")
id:moon-fondu

ありがとうございます、うまくいきました!

2013/04/25 09:15:38
id:taknt No.2

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

ポイント100pt

標準モジュールに以下のソースを貼りつけてください。

Function keykazan(ar As Range, st As String)

    Dim c As Range
    
    Dim kekka As Long
    
    kekka = 0
    
    For Each c In ar
        d = c.Value
        If InStr(d, st) > 0 Then
            kekka = kekka + 数値取得(c)
        End If
    Next c

    keykazan = kekka

End Function

Function 数値取得(r As Range)
  Dim myStr As String
  Dim myN As String
  Dim i As Long
    For i = 1 To Len(r.Value)
        myStr = Mid(r.Value, i, 1)
        If myStr Like "[0-9]" Then
            myN = myN & myStr
        End If
    Next i
    If IsNumeric(myN) Then
        数値取得 = myN * 1
    Else
        数値取得 = ""
    End If
End Function

使い方
セルに
=keykazan(B1:B15,"【P】-")
と入れれば、B1からB15の間で 【P】-を含む文字列がある数値を加算します。

id:moon-fondu

ありがとうございます、でも100行以上ある場合、なぜか数値の合計が合わなかったんですよね(>_<)

2013/04/25 09:15:12
id:taknt

えー 合わないんですか。

2013/04/25 12:16:39

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

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

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

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

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