dポイントプレゼントキャンペーン実施中!

条件を指定して文字列を結合させたく、ユーザー定義関数を作成しております。

第一段階として、ワークシート関数のCONCATENATEを、選択した範囲の文字列が結合されるよう、((A1:A5)の様に)、ユーザー定義関数(仮にCONCATENATERANGE)を作成しました。

平たく言うと、SUMIFのSUMの部分を、この、CONCATENATERANGEに置換えたものが作りたいのです。

検索条件を、数値、文字列、空白以外といった条件に限定すれば、望むものができたのですが、演算子(<>,<=,>=,<,>,?,*)までを考慮するとなかなか厄介で、、、

そこで、どなたかSUMIFをコードで書ける方はいらっしゃいませんか?
私が望む関数(仮にCONCATENATERANGEIF)そのものズバリをご教示いただければありがたいのですが、何かと面倒かと思いますので。

どうぞよろしくお願いいたします。

A 回答 (2件)

COUNTIF 関数の第 2 引数に例えば ">0" と指定しても文字列はヒットしないのと同様に、下の関数は、">0" などと指定した場合に、文字列のセルは結合しません。

また、行全体や列全体は、結合の対象外としました。


Function ConcatenateRangeIf(rng As Range, cond As String) As String
  Dim i As Long, j As Long, s As String
  With rng
    '第1引数に行全体あるいは列全体を指定した場合、関数は何も返さない
    If .Address = .EntireRow.Address Or .Address = .EntireColumn.Address Then Exit Function
    For i = 1 To .Rows.Count
      For j = 1 To .Columns.Count
        If WorksheetFunction.CountIf(.Cells(i, j), cond) Then s = s & .Cells(i, j)
      Next j
    Next i
  End With
  ConcatenateRangeIf = s
End Function
「VBA にて、条件を指定して文字列結合」の回答画像2
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
MarcoRossiItaly 様の方法とは違いますが、昨日考えていたら、なんとなく完成いたしました。

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

お礼日時:2013/12/17 09:45

>平たく言うと、SUMIFのSUMの部分を、この、CONCATENATERANGEに置換えたものが作りたい



SUMじゃなくIFの部分の間違いですかね。
いずれにしても、逐一調べて合ってれば合計するだけですが。


public function ConcatenateSumif(a as excel.range, b as variant, c as excel.range) as variant
 dim h as range
 dim buf as variant
 dim i as long

 for each h in iif(c.columns.count = 1, a.rows, a.columns)
  i = i + 1
  buf = application.transpose(h.value)
  if c.columns.count = 1 then buf = application.transpose(buf)
  if isarray(buf) then buf = join(buf, "")
  if buf = b then
   concatenatesumif = concatenatesumif + c(i)
  end if
 next
end function


使い方:第3引数の向きにより縦横を判断する

=ConcatenateSumif(A1:C10,"判定値",D1:D10)
第一引数を横に結合した値(A1&B1&C1、A2&B2&C2…)がそれぞれ判定値なら、D列を合計する

=ConcatenateSumif(A1:E3,"判定値",A4:E4)
第一引数を縦に結合した値(A1&A2&A3、B1&B2&B3…)がそれぞれ判定値なら、4行目を合計する

=ConcatenateSumif(A1:A10,"判定値",D1:D10)
ふつーのSUMIFと同じ
    • good
    • 0
この回答へのお礼

質問が分かりづらくて申し訳ありません。
sumの代わりにconcatenateがしたかったのです。

どちらにしても、昨日考えていたらなんとなくできました。
ご回答ありがとうございました。

お礼日時:2013/12/17 09:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!