Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12083 / 13645 ツリー ←次へ | 前へ→

【12115】ユーザー定義関数について つん 04/3/24(水) 12:57 質問
【12119】Re:ユーザー定義関数について Jaka 04/3/24(水) 13:56 発言
【12120】Re:ユーザー定義関数について こうちゃん 04/3/24(水) 14:18 発言
【12124】Re:ユーザー定義関数について つん 04/3/24(水) 14:32 発言
【12138】自動再計算をやめて・・・ つん 04/3/24(水) 19:30 お礼
【12160】Re:ユーザー定義関数について つん 04/3/25(木) 15:07 お礼
【12176】Re:ユーザー定義関数について 角田 04/3/25(木) 18:47 回答
【12187】Re:ユーザー定義関数について つん 04/3/26(金) 9:19 発言
【12410】再チャレンジ! つん 04/4/2(金) 16:15 質問
【12415】Re:再チャレンジ! Jaka 04/4/2(金) 17:17 発言
【12464】やっぱ違ってた。 Jaka 04/4/5(月) 13:04 発言
【12465】え?どこが? つん 04/4/5(月) 13:31 お礼
【12466】忘れてた・・・・ つん 04/4/5(月) 13:44 発言
【12470】Re:忘れてた・・・・ Jaka 04/4/5(月) 16:00 発言
【12416】Re:再チャレンジ! 角田 04/4/2(金) 17:21 回答
【12428】Re:再チャレンジ! ni 04/4/2(金) 21:47 発言
【12474】検証中 つん 04/4/5(月) 16:40 お礼
【12476】Re:検証中 ni 04/4/5(月) 17:34 発言
【12479】ああああ!(>_<) つん 04/4/5(月) 19:11 発言
【12484】出来ました! つん 04/4/6(火) 9:34 お礼
【12467】Re:再チャレンジ! つん 04/4/5(月) 13:47 お礼
【12469】Re:再チャレンジ! 角田 04/4/5(月) 14:46 回答
【12472】Re:再チャレンジ! つん 04/4/5(月) 16:34 お礼

【12115】ユーザー定義関数について
質問  つん E-MAIL  - 04/3/24(水) 12:57 -

引用なし
パスワード
   こんにちは。いつもお世話になります。
久々に質問させていただきます。
ユーザー定義関数についての質問です。よろしくお願いします。

アンケート入力・集計をしています。

列:質問項目
行:回答者(1行1件、430件)

各質問の回答項目には連番がふってあって、回答されている項目の数字を入力するようになっています。不明・無回答は「N」と入力。
一つの質問に、複数回答も多々あり、その場合は、1つのセルに、カンマ区切りで、複数の数字が入力されています。

集計は、質問項目毎に各回答項目がいくつ選択されているかカウントするものです。
そのカウント用に、ユーザー定義関数を作りました。
が・・・問題が発生してしまいました。

以下は作ったユーザー定義関数です。
'==============================================
Function mySub(argR1 As Range, argR2 As Range) As Long
'argR1 : 数えたいカテゴリの数字あるいは「N」
'argR2 : カウントする範囲
  
  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  '参照するセルの値を代入
  buf = argR2.Value      '集計する範囲の値を代入
  
  For Each e1 In buf
    e3 = Split(e1, ",")   'カンマ区切りの数字を分割
    
    For Each e2 In e3
      If strR1Value = e2 Then
        lngA = lngA + 1
      End If
    Next e2
    
  Next e1
  
  mySub = lngA

End Function
'==============================================

この関数は一応正常には動くようです。
しかし、広範囲にコピペしたときに、フリーズしてしまうのです。
コピペして、再計算されて、きちんと値も表示されます。
しかし、その時点でフリーズしてしまい、強制終了の憂き目にあいます(T_T)
おそらくエクセルのリソースの問題なのだと思いますが、
なにか対処方法はないでしょうか?

ファイルを客先にお渡しすることになると思うので、あまり不安定なままではまずいと思いますし、最終的には作業列を作って普通の関数で対応するのがベターかなあ?とは思ってます。

しかし、もし「ここをこうすれば良い(安全)」みたいなことがあれば、出来たらユーザー定義関数で対応したいと思っています。
よろしくお願いします。

あ、集計表ですが、計算対象範囲は、1列430行で、
計算式を入れる範囲は、16行×48列=768セル です。

それと、上記のエラーとは関係ないですが、私はユーザー定義関数はあまり作ったことがありません。
エラー処理も、今回は、返り値をLong型にしましたので、エラー時は「999」を返すようにとりあえずしてみました。
通常は、どういうやり方がベターなのでしょうか?
また、ユーザー定義関数を作る場合の注意点等々、アドバイスいただけたら幸いに思います。

よろしくお願い申し上げます。

【12119】Re:ユーザー定義関数について
発言  Jaka  - 04/3/24(水) 13:56 -

引用なし
パスワード
   こんにちは。

>広範囲にコピペしたときに、フリーズしてしまうのです。
配列の作りすぎじゃないんですか?

Function mySub(argR1 As Range, argR2 As Range) As Variant

配列を消す。
Erase buf

エラーの時(注 As Variant)
mySub = CVErr(xlErrValue)

全く解決策じゃなく、適当な事言ってすみません。
ユーザー定義関数って、ほとんど全く作った事ありません。

【12120】Re:ユーザー定義関数について
発言  こうちゃん E-MAIL  - 04/3/24(水) 14:18 -

引用なし
パスワード
   つんさん、Jakaさん、こんにちは

ながめてたらJakaさんに先をこされました^^;
私も回答ではなくて恐縮ですが・・

e3が動的配列なので

>配列を消す。
>Erase buf
Erase e3

あと、自動再計算を止めてコピーしたらいかがでしょ?

【12124】Re:ユーザー定義関数について
発言  つん E-MAIL  - 04/3/24(水) 14:32 -

引用なし
パスワード
   Jakaさん、こうちゃんさん、どうもありがとうございます(*^_^*)

>e3が動的配列なので
>>配列を消す。
>>Erase buf
>Erase e3

ああ!確かに「Erase」必要ですよね!
オブジェクト変数の解放とかは割とマメにするんだけど、
配列の解放は失念しておりました。

Jakaさんのレスを読んで、私も「Erase e3」も必要かな?と思い、
両方入れて試してみました。
でも、やっぱり駄目でした(T_T)
「Erase」で、だいぶマシになったような気がしますが、(実行した感触)

>あと、自動再計算を止めてコピーしたらいかがでしょ?

一度試してみますね(*^_^*)
今、ちょっと他の急ぎの仕事が来たので、後ほど・・になってしまいますが。

引き続き、情報ありましたら宜しくお願いします〜

【12138】自動再計算をやめて・・・
お礼  つん E-MAIL  - 04/3/24(水) 19:30 -

引用なし
パスワード
   こうちゃんさん、どもども

>>あと、自動再計算を止めてコピーしたらいかがでしょ?

OKでした。
コピーしたのち、再計算させたら、スムーズに行きました。
とりあえず、最終的にこれで計算させて、
相手さんへ渡すファイルは、値のコピーで数式を消した状態で渡そうかな
と思っています。
向こうで何をされるかわからんもんね(^^;

どうもありがとうございました。

【12160】Re:ユーザー定義関数について
お礼  つん E-MAIL  - 04/3/25(木) 15:07 -

引用なし
パスワード
   Jaka さん、こんにちは〜

>mySub = CVErr(xlErrValue)
やってみました。
CVErr・・・ヘルプ見てみました。
なるほど〜
次回からは、ちゃんとこれでやろう♪
どうもありがとうございました。

>全く解決策じゃなく、適当な事言ってすみません。
いえいえ、参考になりました(*^_^*)

>ユーザー定義関数って、ほとんど全く作った事ありません。
みんなあまり作らないのかな?
色々情報集まるかな?ってちょっと期待したんやけど・・・

【12176】Re:ユーザー定義関数について
回答  角田 WEB  - 04/3/25(木) 18:47 -

引用なし
パスワード
   こんちゃ(^o^)ノ
>>ユーザー定義関数って、ほとんど全く作った事ありません。
>みんなあまり作らないのかな?
バリバリでっせ♪

>色々情報集まるかな?ってちょっと期待したんやけど・・・
関数記述セルの数自体が多いから、数自体の問題か、Splitの問題かって
考えてたんだけど‥‥‥
どう手を入れてもボトルネック解消にはならないかな〜と思ってたのね。

それで、関数2個によるコンビネーションじゃ駄目?

関数1
 列方向(↓)のセル範囲全体を引数で指定して、その範囲のセル内容を
 全て連結した文字列を返す。
 Join関数が使えるかと思ったけど、セル範囲/セル範囲をVariant配列
 に入れたもの、どっちでもエラーになるから、自分でループしつつ
 カンマを間に挿入しながら文字列を繋げる。

関数2
 今の関数セルに記述するもの
 「関数1」が作った文字列を引数で受け取り、その文字列をSplit関数で
 配列に分解。
 その配列をFilter関数で「チェック文字」で抽出して、新たな配列を作る。
 その配列の要素数が答え(自分でループして数えても良し)。

>あ、集計表ですが、計算対象範囲は、1列430行で、
>計算式を入れる範囲は、16行×48列=768セル です
今のボトルネックは、768セルが各々一斉に毎度毎度430セルを参照
している事(768×430)。
とりあえず、「1列430行」のセルを1セルに集約しておけば、
768セルにある関数が参照するセルも1セルだけなので総計で768で済む。

というのは‥‥‥どう?

【12187】Re:ユーザー定義関数について
発言  つん E-MAIL  - 04/3/26(金) 9:19 -

引用なし
パスワード
   角田 さん、おはよーございます。
レス、ありがとうございました(*^_^*)

>バリバリでっせ♪
おお!頼もしい♪

>それで、関数2個によるコンビネーションじゃ駄目?
>
>関数1
> 列方向(↓)のセル範囲全体を引数で指定して、その範囲のセル内容を
> 全て連結した文字列を返す。
> Join関数が使えるかと思ったけど、セル範囲/セル範囲をVariant配列
> に入れたもの、どっちでもエラーになるから、自分でループしつつ
> カンマを間に挿入しながら文字列を繋げる。
>
>関数2
> 今の関数セルに記述するもの
> 「関数1」が作った文字列を引数で受け取り、その文字列をSplit関数で
> 配列に分解。
> その配列をFilter関数で「チェック文字」で抽出して、新たな配列を作る。
> その配列の要素数が答え(自分でループして数えても良し)。
>
>>あ、集計表ですが、計算対象範囲は、1列430行で、
>>計算式を入れる範囲は、16行×48列=768セル です
>今のボトルネックは、768セルが各々一斉に毎度毎度430セルを参照
>している事(768×430)。
>とりあえず、「1列430行」のセルを1セルに集約しておけば、
>768セルにある関数が参照するセルも1セルだけなので総計で768で済む。
>
>というのは‥‥‥どう?

うーん、い・・いまいち、わかってないんだけど(^^;
ユーザー定義関数を二つ作って、一度に二つ使うってこと?
一度試行錯誤してみますわ。
しかし、今、忙しくて取り組めないんです。
今月いっぱいはあっぷあっぷしそう・・・
4月に入って、少し余裕が出来たらチャレンジしてみます。
そんときわからんかったら、また教えてくださいね。

どうもありがとー

【12410】再チャレンジ!
質問  つん E-MAIL  - 04/4/2(金) 16:15 -

引用なし
パスワード
   角田 さん、皆さん、こんにちは。

角田さんにせっかくアドバイスを頂いていたのに、
忙しくてしばらく放置しておりました。
やっと余裕が出てきましたので、再チャレンジしております。

アンケート集計自体は、あれから、客先とのやりとりの末、最終的に形ががらりと変わり、ユーザー定義関数など全然必要なくなってしまいました(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」単独で使った場合でも、ちと問題があるようです。
単独で使った場合、エラーにはなりませんでしたが、それを「値のコピー」をしてみても、コピー先には「数式」の形でしかコピーされませんでした。

うーん、角田さんのアドバイスと私がやってること違うんやろうか?

【12415】Re:再チャレンジ!
発言  Jaka  - 04/4/2(金) 17:17 -

引用なし
パスワード
   こんにちは。

>アンケート集計自体は、あれから、客先とのやりとりの末、最終的に形ががらりと変わり、ユーザー定義関数など全然必要なくなってしまいました(T_T)
ギャグですか?

いや多分違うと思います。
家で試したファイルを忘れてきちゃったので、うる覚えの記憶で...。
(97のヘルプには、無い。)

e3 = Split(arg_str, ",")

確か、こんな感じだったと思います。
MsgBox Filter(e3, 数えたい文字, True) + 1

Falseにすると対象文字以外の値が入った配列の要素数が...。(+1する必要があったかも)

外れていると思いますので、詳しくはヘルプ見てね!

所で、つんさんは、WinMeでOffice2003を使っているんですか?
(Meで使えるの?)

*******************************
これだとどうなるのかなぁ?と、ちょっと前に作ってみただけです。
遅くて広範囲ペーストだとどうなるかわからないけど..。

Function mySubAPP(argR1 As Range, argR2 As Range) As Variant
  Dim e1 As Range
  Dim Stt As String, Wwd As String
  Dim lngA As Long, ST As Long
  
  If argR1.Count > 1 Then
    mySubAPP = CVErr(xlErrValue)
    Exit Function
  End If
  
  lngA = 0
  Stt = argR1.Value   '検索値
  Wwd = "," & Stt & ","
  For Each e1 In argR2
    ST = 1
    Do Until InStr(ST, e1.Value, Wwd) = 0
      lngA = lngA + 1
      ST = InStr(ST + 1, e1.Value, Wwd) + Len(wd) + 1
    Loop
    If Left(e1.Value, Len(Stt) + 1) = Stt & "," Then
      lngA = lngA + 1
    ElseIf Len(e1.Value) = Len(Stt) And e1 = Stt And e1.Value <> "" Then
      lngA = lngA + 1
    End If
    If Right(e1.Value, Len(Stt) + 1) = "," & Stt Then
      lngA = lngA + 1
    End If
  Next
  mySubAPP = lngA
End Function

【12416】Re:再チャレンジ!
回答  角田 WEB  - 04/4/2(金) 17:21 -

引用なし
パスワード
   つんさん、こば〜
>Function mySub2(arg_r As Range) As String
>Function mySub(argR1 As Range, arg_str As String) As Long
これは完璧です。でも‥‥‥
>これで、「=mysub(A5,mysub2(B1:B4))」という形で使ってみました。
という使い方では、2つに分けた意味がありません。
ひとつの関数で結合&分解しているのと同じ負荷が掛かります。
つんさんが最初に作ったのと同じ様に個々のセルで毎回毎回、対象範囲を
処理してしまいますから‥‥‥
>集計表ですが、計算対象範囲は、1列430行で、
>計算式を入れる範囲は、16行×48列=768セル
768セル×参照先430セル⇒33万回

先ず、作業「行」をひとつ用意して、その行の各セルに例えば
[B10] =mysub2(B1:B4)
といった風にして、『その列の文字列合体』結果を出します。
それで、集計結果のセルには
 =mysub(A5, $B$10 )
とします。

こうすると、元データの1列を舐める処理は、データの列数分の回数だけで済みます
集計セルからは、[B10]などの単一セルを参照するだけなので、集計セルの数と
同じ回数しか参照しませんね。
>集計表ですが、計算対象範囲は、1列430行で、
>計算式を入れる範囲は、16行×48列=768セル
mysub2 ‥‥‥ 48×430⇒20640
mysub ‥‥‥ 768×1 ⇒  768
(計)            21408回

セル参照処理を31万回も省けます。

【12428】Re:再チャレンジ!
発言  ni  - 04/4/2(金) 21:47 -

引用なし
パスワード
   つんさん、みなさん、こんばんは

配列数式を使う方法を最近おぼえたので作ってみました。

結果を書き出す範囲を選択して、数式バーに
=mySub(A5:A8,A15:A17)
のようにキーインして、Ctrl+Shift+Enter で配列数式として入力して下さい。

Option Explicit

'配列数式で与える
Function mySub(argR1 As Range, argR2 As Range) As Variant
'argR1 : 数えたいカテゴリの数字あるいは「N」
'argR2 : カウントする範囲
Dim kensakuti As Variant
Dim hanni As Variant
Dim ans As Variant
Dim tbl() As String
Dim e3 As Variant
Dim i As Long, j As Long, k As Long
Dim n As Long
Dim ncount As Long, q As String

kensakuti = argR1.Value
hanni = argR2.Value

If Right$(TypeName(kensakuti), 1) = ")" Then  '複数セル
  ReDim ans(LBound(kensakuti, 1) To UBound(kensakuti, 1), _
      LBound(kensakuti, 2) To UBound(kensakuti, 2))
End If

'カウントする範囲のデータをバラバラにして、tbl()に記憶
n = 0
For i = LBound(hanni, 1) To UBound(hanni, 1)
  For j = LBound(hanni, 2) To UBound(hanni, 2)
    e3 = Split(CStr(hanni(i, j)), ",")
    ReDim Preserve tbl(n + UBound(e3) + 1)
    For k = 0 To UBound(e3)
      tbl(n + k) = CStr(e3(k))
    Next
    n = n + UBound(e3) + 1
  Next
Next

For i = LBound(kensakuti, 1) To UBound(kensakuti, 1)
  For j = LBound(kensakuti, 2) To UBound(kensakuti, 2)
    q = kensakuti(i, j)
    ncount = 0
    For k = 0 To n
      ncount = ncount + IIf(tbl(k) = q, 1, 0)
    Next
    ans(i, j) = ncount
  Next
Next

mySub = ans

End Function

セル参照は2回+書き出しに1回だけなので、ひょっとすると速いかも。

【12464】やっぱ違ってた。
発言  Jaka  - 04/4/5(月) 13:04 -

引用なし
パスワード
   私が、Filterの勉強用に使ったコード。
因みに97では、動きませんでした。

Sub nmdj()
  Dim tb(1 To 10)
  For i = 1 To 10
    tb(i) = i
  Next
  tb(5) = 3
  MsgBox UBound(Filter(tb, 3, False))
  MsgBox UBound(Filter(tb, 3, True))
  MsgBox tb(3) & "-" & tb(5) & Filter(tb, 3, False)(3)
  For i = 0 To UBound(Filter(tb, 3, True))
    MsgBox "抽出文字" & UBound(Filter(tb, 3, True)) + 1 & "コ中の " & _
        Filter(tb, 3, True)(i)   '3を2個表示
  Next
  For i = 0 To UBound(Filter(tb, 3, False))
    MsgBox "抽出文字以外" & UBound(Filter(tb, 3, False)) + 1 & "コ中の " & _
        Filter(tb, 3, False)(i)  '3を除いた物8個表示
  Next
  Erase tb
End Sub

【12465】え?どこが?
お礼  つん E-MAIL  - 04/4/5(月) 13:31 -

引用なし
パスワード
   Jaka さん、こんにちは〜

金曜日にアップしてくださったコード試してみました。
再計算には時間はかかるようですが、フリーズはしませんでした(^^)V

これって、検索するのに、数字をカンマ込みで検索していってるのね。
配列がその分少ないから、リソースの節約になってんのかな・・・

「Filterの勉強用に使ったコード」はまた後ほど見ます・・・(>_<)

【12466】忘れてた・・・・
発言  つん E-MAIL  - 04/4/5(月) 13:44 -

引用なし
パスワード
   うちは、会社ではWindows98se+Excel2002どす。
で、家ではWindowsXP+Excel2002どす。
でも、家ではあまりエクセル起動させません(^^;

2003って、WindowsXPか2000でしか動かないって聞いたことあるにゃ。
だから、バージョンアップ案内来てたけど、却下になったのでありました。
2003ってどうなんだろう?

【12467】Re:再チャレンジ!
お礼  つん E-MAIL  - 04/4/5(月) 13:47 -

引用なし
パスワード
   角田さん、こんにちは〜
レスありがとうございました。

>これは完璧です。でも‥‥‥
>>これで、「=mysub(A5,mysub2(B1:B4))」という形で使ってみました。
>という使い方では、2つに分けた意味がありません。

...( ̄Δ ̄;)

>ひとつの関数で結合&分解しているのと同じ負荷が掛かります。
>つんさんが最初に作ったのと同じ様に個々のセルで毎回毎回、対象範囲を
>処理してしまいますから‥‥‥

なるほど・・・そうですよね(^^;

>先ず、作業「行」をひとつ用意して、その行の各セルに例えば
>[B10] =mysub2(B1:B4)
>といった風にして、『その列の文字列合体』結果を出します。
>それで、集計結果のセルには
> =mysub(A5, $B$10 )
>とします。

やってみました。
でも、広範囲にコピーしたらやっぱりフリーズしちゃいました(T_T)
Jakaさんのでフリーズが免れたので、

  e3 = Split(arg_str, ",")

これが駄目なのかなあ?
難しいなあ(T_T)

【12469】Re:再チャレンジ!
回答  角田 WEB  - 04/4/5(月) 14:46 -

引用なし
パスワード
   こんちゃ♪
>でも、広範囲にコピーしたらやっぱりフリーズしちゃいました(T_T)
>Jakaさんのでフリーズが免れたので、
>  e3 = Split(arg_str, ",")
>これが駄目なのかなあ?
じゃぁ、Split無しで、直接、連結文字列を舐める方法では?

Dim i As Integer
Dim j As Integer
Dim strWK As String
Dim argWK As String
argWK = arg_str & ","
lngA = 0
j = 1
For i = 1 To Len(argWK)
 If (Mid(argWK,i,1) = ",") Then
  If (j = i) Then
   strWK = ""
  Else
   strWK = Mid(argWK,j,(i-j))
  End If
  If (strR1Value = strWK) Then
   lngA = lngA + 1
  End If
  j = i + 1
 End If
Next i

【12470】Re:忘れてた・・・・
発言  Jaka  - 04/4/5(月) 16:00 -

引用なし
パスワード
   つんさん、こんにちは。

>配列がその分少ないから、リソースの節約になってんのかな・・・
>Jakaさんのでフリーズが免れたので、
>  e3 = Split(arg_str, ",")
>これが駄目なのかなあ?

いやっ^^;
私のは、全く配列を使っていません。
で、下記コードみたいにセル範囲を配列に入れただけの場合とか、
e3 = Split(arg_str, ",")だけの場合とか、色々組み合わせを考えて見るのも手かもしれませんね。
んでもって、最終的には広範囲過ぎて、やっぱしダメやったて、泣くかもしれませんけどね。

Dim ragtb as variant
ragtb = argR2.value

  For Each e1 In ragtb
    ST = 1
    Do Until InStr(ST, e1.Value, Wwd) = 0
      lngA = lngA + 1
      ST = InStr(ST + 1, e1.Value, Wwd) + Len(wd) + 1
    Loop
    If Left(e1.Value, Len(Stt) + 1) = Stt & "," Then
      lngA = lngA + 1
    ElseIf Len(e1.Value) = Len(Stt) And e1 = Stt And e1.Value <> "" Then
      lngA = lngA + 1
    End If
    If Right(e1.Value, Len(Stt) + 1) = "," & Stt Then
      lngA = lngA + 1
    End If
  Next
  mySubAPP = lngA
  Erase ragtb

>うちは、会社ではWindows98se+Excel2002どす。
>で、家ではWindowsXP+Excel2002どす。
えっ、そうなのっ!
つい最近2003は、Win2000以上しか動かないと知ったもんで、
つんさんがどこかで「うちのは、2003やけど動きました。伝〃」と回答されているのを見たような気がしまして、つんさんとこのノートは、確かMeなのに何で2003が動くの?? どうやったら動くようになるの? と、なったわけでして...。
でも両方    Office XPなんやね。
2002と2003、両方XPって言うんだよね?
わたくし、97と2000しか触った事ありません。

>でも、家ではあまりエクセル起動させません(^^;
なして?
ゲームはどこいったんやろ!

【12472】Re:再チャレンジ!
お礼  つん E-MAIL  - 04/4/5(月) 16:34 -

引用なし
パスワード
   度々ありがとうございます♪

>じゃぁ、Split無しで、直接、連結文字列を舐める方法では?
>Dim i As Integer
>Dim j As Integer
>Dim strWK As String
>Dim argWK As String
>argWK = arg_str & ","
>lngA = 0
>j = 1
>For i = 1 To Len(argWK)
> If (Mid(argWK,i,1) = ",") Then
>  If (j = i) Then
>   strWK = ""
>  Else
>   strWK = Mid(argWK,j,(i-j))
>  End If
>  If (strR1Value = strWK) Then
>   lngA = lngA + 1
>  End If
>  j = i + 1
> End If
>Next i

これで試したところ、OKでした!
それに結構早かった!
やっぱり、「Split」で配列作るところがネックやったんかなあ?
配列ってやっかいなんですね(T_T)

【12474】検証中
お礼  つん E-MAIL  - 04/4/5(月) 16:40 -

引用なし
パスワード
   ni さん、こんにちは〜
レスありがとうございます。

niさんのも試させて頂きました〜♪
・・・が、エラーが出るにゃ(T_T)

「argR1」に複数セルを指定した場合は、エラーは出ないんですが、
結果が・・・
単数セルを指定した時は、
For i = LBound(hanni, 1) To UBound(hanni, 1)
で、エラーになります。

実際は、一つの値を数えていくので、「複数セル」を選択することはありえない
(選択した場合は、その時点でエラーにする)
ので、そのへんを考えて、コードを解読して修正していったらいいかな?
と思って、いまやってます。
ちょっと頭がごちゃごちゃになってきて(^^;
時間がかかりそう〜しばしお待ちを〜

いろんな方にサンプルを頂いたので、検証やら解読やらで嬉しい悲鳴を上げております(^^;
なにせ、万年初心者・・・遅いレスになるかもしれませんが、お許し下さいませ。

【12476】Re:検証中
発言  ni  - 04/4/5(月) 17:34 -

引用なし
パスワード
   ▼つん さん:
>・・・が、エラーが出るにゃ(T_T)
しまった^^;検索値が一つの場合のことを、途中で忘れてしまいました。

>実際は、一つの値を数えていくので、「複数セル」を選択することはありえない
>(選択した場合は、その時点でエラーにする)
>ので、そのへんを考えて、コードを解読して修正していったらいいかな?
>と思って、いまやってます。
いろいろな検索値を、その値ごとに集計するのでしょう?
毎回毎回、検索される範囲を読み込むと時間がかかると思って、
「配列数式」で、1回しか読み込まないようにしています。

それで、(ここ、大事です)集計結果を書き出す範囲を選択して、
検索したい値が入ったセル範囲と、検索されるデータの範囲を指定して、
(ここも重要!)Ctrl+Shift+Enter で数式を確定すると、
「配列数式」として入力できます。入力した式が { }で囲われます。

検索したい1個1個のデータに対して個々に数式を与えたのでは
私の方法は値打ちありません(;_;)

【12479】ああああ!(>_<)
発言  つん E-MAIL  - 04/4/5(月) 19:11 -

引用なし
パスワード
   ni さん!ごめんなさい!

>毎回毎回、検索される範囲を読み込むと時間がかかると思って、
>「配列数式」で、1回しか読み込まないようにしています。
>それで、(ここ、大事です)集計結果を書き出す範囲を選択して、
>検索したい値が入ったセル範囲と、検索されるデータの範囲を指定して、
>(ここも重要!)Ctrl+Shift+Enter で数式を確定すると、
>「配列数式」として入力できます。入力した式が { }で囲われます。

「配列数式」っちゅーことをすっかり失念してました(>_<)
最初に読んだときは、ふむふむ・・・と思ってたのに、
今日試したときは、ちゃんと前後を読まずにコードだけ試しました。
ごめんなさーい(T_T)
今日はもう家なので、明日またちゃんと「配列数式」でやってみます。

ほんまに、ごめんなさい・・・・くすん(T_T)

【12484】出来ました!
お礼  つん E-MAIL  - 04/4/6(火) 9:34 -

引用なし
パスワード
   ni さん、おはようございます。

出来ました!
数式配列にしたら、無事正しい値が出て、更にフリーズもせず、
スピードも速かったにゃ!!ちょっと感動〜

数式配列ってのは、たまに聞くし、1〜2度触ったことはあるんだけど、
どうもイマイチわかってなくて・・・ちゃんとマスターすれば便利そうですね。
普通のワークシート関数でも。

ところで、数式配列にしてる場合は、コピペする場合、貼り付け先に
コピー元のセルを含んでいるとエラーになるんですね?
複数行、複数列に渡ってコピペする場合は、面倒なんでいつもコピー元も含めて
範囲指定してたのだけど、今回それでしたら、
「配列に一部を変更できません」になってもた・・・

うーん、勉強になりました。ありがとうございました(^o^)

12083 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free