|
角田 さん、皆さん、こんにちは。
角田さんにせっかくアドバイスを頂いていたのに、
忙しくてしばらく放置しておりました。
やっと余裕が出てきましたので、再チャレンジしております。
アンケート集計自体は、あれから、客先とのやりとりの末、最終的に形ががらりと変わり、ユーザー定義関数など全然必要なくなってしまいました(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」単独で使った場合でも、ちと問題があるようです。
単独で使った場合、エラーにはなりませんでしたが、それを「値のコピー」をしてみても、コピー先には「数式」の形でしかコピーされませんでした。
うーん、角田さんのアドバイスと私がやってること違うんやろうか?
|
|