[[20050419140335]] 『21 や22 などカッコつきのカウント』(ROSE) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『21 や22 などカッコつきのカウント』(ROSE)

結合されたセルの中に長い文章があって、その途中にに21)、22)、23)・・・30)が入っています。
いくつ入っているかカウントしたいのですが、=COUNTIF(A1,"21)")のようなものを足そうとしても、この式すら0が返ります。
どんな関数にしたらいいでしょうか。
宜しくお願いします。


 =COUNTIF(A1:A30,"21)") “21)”の数を数えたいのならでは?
       ~~~~              (dack)

セルは結合されているのでA1のみです。
21)×××、22)××、23)××とあるとすれば「3」を返したく、21)××・・・30)××とあるとすれば「10」を返したいのです。(ROSE)


 ) の数でよければ、 =LEN(A1)-LEN(SUBSTITUTE(A1,")",""))
 こんな数式で求められますが。
(純丸)(o^-')b

ありがとうございます。それも考えたのですが、文章の中に沢山の括弧が出てくるのでダメなのです。(ROSE)


 _| ̄|○ 残念! 
 気を取り直して、カウントするのは、21〜30ですか?
 カウントしない21〜30もあるのですか?(21日など)
(純丸)(o^-')b

ありがとうございます。
@ABからはじまって、Sまでしかないので、21)、22)と増えていくのです。50)程度まであれば十分だと思います。
(@からSまでだけはLEN関数で出ているので、21)からを足そうとしても、カウントできないというわけなのです)
よろしくお願い致します。(ROSE)


 (1) 後ろに ) が付いている 21〜50 を数える。
 (2) 数字は1回しか出て来ない。
 (3) 例えば、(530) のような記述は無い。(後ろ3ケタがカウントする数字と同じ)
 以上を条件として、下記数式でどうでしょう?
(純丸)(o^-')b

 =SUMPRODUCT(COUNTIF(A1,"*"&ROW(A21:A50)&")*"))

実際に文章が入っている結合されたセルがB3なので、
=SUMPRODUCT(COUNTIF(B3,"*"&ROW(A21:A50)&")*"))
と入れたら、「1」となりました。
本当は8と返るはずなのですが・・・
どこかおかしな箇所があるのでしょうか。(ROSE)


 う〜ん、B3に入力されているのが全角ってことはないですか?
 どこかのセルに「21)22)」などと入力して上記数式を試したら
 どうなりますか?
(純丸)(o^-')b

試してみました。
文字数を少なめにしたら正しくカウントしました。
でも、被カウント文字以外の文字を沢山増やしたら、カウントできなくなりました。
文字数制限があるようですね。どうしましょうか・・・(ROSE)


 これですかねぇ、、、。だとしたら回避策は作業列を作って文を分けるしか
 無いかも。後はマクロ達人さんの降臨を願って下さい。
(純丸)(o^-')b
[[20040929155005]] 『置換の限界文字数』(しぇい)

900字までいかなくてもアウトになるようです。
後はマクロになるのですね。
分かりました。
ご尽力いただき感謝しております。
有難うございました。(ROSE)

 こちらの続きでしょうか?↓
[[20040322154541]] 『@やAなどの○つき文字のカウント』(りんご) 

 =SUMPRODUCT(LEN(A1)-LEN(SUBSTITUTE(A1,ROW(A21:A50)&")",)))/3では、どうでしょう? (LOOKUP)


 なるほど、SUBSTITUTEで配列を使うのですね。勉強になります。
 ROSEさん、うまくカウントされるといいですね。
(純丸)(o^-')b

 あら すいません勘違いでしたねヾ(^-^;) ごめんちゃい
 書き込みしたあとにそのまま打合せに行ってしまって・・・
 (dack)


 昨日帰宅してマクロを考えてみました。ユーザー定義関数です。
 標準モジュールに貼り付けて、=mycount(B3) のように
 使ってみて下さい。
(純丸)(o^-')b 

 Function mycount(myr As Range) As Integer
 Dim i As Integer
 mycount = 0
 For i = 21 To 50
   If InStr(1, myr.Value, i & ")") > 0 Then
     mycount = mycount + 1
   End If
 Next i
 End Function

まるで小人の靴屋さんのようです。
一夜明けたら解決していました。
驚きました・・・
純丸さん、LOOKUPさん、有難うございます。

追加で質問をしても宜しいでしょうか。

●LOOKUPさん、りんごさんの時の式にプラスして完璧な式となりました。
 教えて頂きたいのは、式の最後を3で割るのはどういう仕組みによるものでしょうか。ということです。

●純丸さん、21)から50)は、ユーザーファンクションで解決しましたが、@〜Sも含めてのカウントとなると
 何をどのように追加すれば宜しいでしょうか。

厚かましくて恐縮ですが、もし宜しければお教え願えますでしょうか。(ROSE)


 >式の最後を3で割るのはどういう仕組みによるものでしょうか
 21)や30)は、3桁ですから、削除された文字列/3が、文字列の数でしょう?    (LOOKUP)

 >21)や30)は、3桁ですから
 式が難しかったので頭がよく回りませんでしたが、そうですね。
 式は21)や50)のない長さを本来の長さから引く、ということですから、
 確かに3で割らないと辻褄があいませんね。
 分かりやすいご講義、有難うございました。(ROSE)


 @〜S、21)〜50) 対応版です。
(純丸)(o^-')b ※マックだとだめなようです、念のため。

 Function mycount(myr As Range) As Integer
  Dim i As Integer
  mycount = 0
 '@〜S
  For i = 9312 To 9331
    If InStr(1, myr.Value, ChrW(i)) > 0 Then
      mycount = mycount + 1
    End If
  Next i
 '21)〜50)
  For i = 21 To 50
    If InStr(1, myr.Value, i & ")") > 0 Then
      mycount = mycount + 1
    End If
  Next i
 End Function

純丸さん、ありがとうございました。
衝突?してしまいました。
マックではないので大丈夫です。
お陰さまで正しい数値が返りました。
9312から9331が@〜Sの特別なコードかと思いますが、例えば@だとcode=11553になるようです。
マクロになると、JISコードではないコードを使うのですね。
こういうのは何処で調べたら分かるのでしょうか。
何度も質問ばかりで申し訳ございませんが、教えていただけますでしょうか。(ROSE)


 え〜と、私もマクロ初心者なのでヘルプやWebを見ながらやっています。
 コードについては調べる内に、AscW関数に行き当たったので、それで
 逆に取得しました。どうしてもわからない事がある時は、この学校で
 質問しています。とまぁ、こんなところです。
(純丸)(o^-')b

ご返信ありがとうございます。
AscW関数で検索しましたところ、http://www.interq.or.jp/student/exeal/dss/ref/vbscript/function/string.html
を見つけました。
少しずつ調べてみることにします。
皆様ありがとうございました。(ROSE)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.