| 
    
     |  | 角田 さん、皆さん、こんにちは。 
 角田さんにせっかくアドバイスを頂いていたのに、
 忙しくてしばらく放置しておりました。
 やっと余裕が出てきましたので、再チャレンジしております。
 
 アンケート集計自体は、あれから、客先とのやりとりの末、最終的に形ががらりと変わり、ユーザー定義関数など全然必要なくなってしまいました(T_T)
 尽力下さった皆様、なんだか申し訳ない・・・でも、高額・・ちゃう!後学の為、もちっと頑張ってみます。
 
 ということで、
 
 >関数1
 > 列方向(↓)のセル範囲全体を引数で指定して、その範囲のセル内容を
 > 全て連結した文字列を返す。
 > Join関数が使えるかと思ったけど、セル範囲/セル範囲をVariant配列
 > に入れたもの、どっちでもエラーになるから、自分でループしつつ
 > カンマを間に挿入しながら文字列を繋げる。
 >
 >関数2
 > 今の関数セルに記述するもの
 > 「関数1」が作った文字列を引数で受け取り、その文字列をSplit関数で
 > 配列に分解。
 > その配列をFilter関数で「チェック文字」で抽出して、新たな配列を作る。
 > その配列の要素数が答え(自分でループして数えても良し)。
 
 一度お返事したときに書きましたように、ちょっと自信がないのですが、
 二つ関数を作って、一度に使うということかな?と思い、
 考えてみました。
 
 関数1
 Function mySub2(arg_r As Range) As String
 
 Dim r As Range
 Dim strData As String
 
 For Each r In arg_r
 strData = strData & "," & r.Value
 Next r
 
 mySub2 = Mid(strData, 2)
 
 End Function
 
 関数2
 Function mySub(argR1 As Range, arg_str As String) As Long
 
 Dim strR1Value As String
 Dim buf, e1, e2, e3
 Dim lngA As Long
 
 If argR1.Count > 1 Then
 mySub = 999
 Exit Function
 End If
 
 strR1Value = argR1.Value
 
 e3 = Split(arg_str, ",")
 
 For Each e2 In e3
 If strR1Value = e2 Then
 lngA = lngA + 1
 End If
 Next e2
 
 mySub = lngA
 
 End Function
 
 これで、「=mysub(A5,mysub2(B1:B4))」という形で使ってみました。
 結果は、mySub2のセル範囲が狭い場合は、ちゃんと値を返してくれるのですが、実際に使う、430行分になると、どうしてもエラーになってしまいます。
 関数の合わせ技がマズイのかな?と思ったのですが、
 「mySub2」単独で使った場合でも、ちと問題があるようです。
 単独で使った場合、エラーにはなりませんでしたが、それを「値のコピー」をしてみても、コピー先には「数式」の形でしかコピーされませんでした。
 
 うーん、角田さんのアドバイスと私がやってること違うんやろうか?
 
 |  |