• ベストアンサー

エクセル 関数 マクロ

エクセルの関数で5項目の文字(仮に【あ~お】)が合ったらカウントする関数、但しプルダウンで絞るとその分カウントに比例すること。 で下記関数を作成しましたが、 =SUMPRODUCT((SUBTOTAL(103,INDIRECT("AA"&ROW(AA10:AA10000))))*(AA10:AA10000="あ")) AA列10行~10000行にあがあればカウントする。動作確認済み この関数を右列にコピーしていきたいんですが、自動でABに変更にならない箇所があります。対策教えていただきたく。

質問者が選んだベストアンサー

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (720/1490)
回答No.10

 私が頼んだ情報は出してくれないのですね。私の言っていることが理解できないのか、情報を出したくないのか判りませんが、情報がないとできないので勝手に決めます。  プルダウンと書いてありますが、フィルターですよね。私はINDIRECTが出てきたらフィルターと刷り込まれているので、フィルターだと思い込んでいました。他の方は、文字通りプルダウンだと思い、フィルターの考慮をしていません。 以下の条件です。 ・検索文字は「あ」だけ(質問にあった数式と同じ) ・J列に連番又は項目が入っている(必ず何か入っていて空白が無い) ・K17~FZ10000が計算対象 ・計算結果はK1~FZ1 に表示 ・ワークエリアはGZ列を使う。(本当はA列に作った方がいいのですが、空いてないと思うので) GZ17 =SUBTOTAL(103,J17) GZ10000 迄コピペ。 K1: =COUNTIFS($GZ17:$GZ10000,1,K17:K10000,"あ") FZ1 迄コピペ。 (これなら短いので、7種類加算しても大した長さになりません)  J列が必ず何か入っているとは限らない場合、別の列にして下さい。とこにもない場合、1列作って下さい  画像を貼りたい場合、新しい質問を立てればいいです。どうせタダだし。

rieeir3580
質問者

補足

いろいろありがとうございます。 正直この関数も見よう見まねでなにも理解しておりません。 新たな質問で今の形の一部を写真貼ります。 ご確認ください。 表題、同じで新たに質問します。 すみませんが画像目を通してください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (11)

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.12

ごめんなさい、誤解していました。 SUBTOTALとあるので、非表示行は数えないんですね? ならば、 Option Explicit Function GetMyCount(tgRng As Range, KeyRng As Range) As Long Dim LastRow As Long Dim c As Long Dim i As Long c = 0 '行末を取得 LastRow = Cells(Rows.Count, tgRng.Column).End(xlUp).Row For i = 16 To LastRow If ((Rows(i).Hidden = False) And _ (Cells(i, tgRng.Column).Value = KeyRng.Value)) Then c = c + 1 End If Next i GetMyCount = c End Function という関数にして、 J4=GetMyCount(J:J,$I4) と埋め 下方向と横方向に必要数複写する対応はいかがでしょうか。

rieeir3580
質問者

お礼

いろいろありがとうございました。 感謝です

全文を見る
すると、全ての回答が全文表示されます。
  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.11

https://okwave.jp/qa/q10040651.html の画像を確認しました。 ならば、後記コードを貼り付け、 J4=GetMyCount(J:J,$I4) を埋め、下方向と横方向に必要数複写する対応はいかがでしょうか。 Option Explicit Function GetMyCount(tgRng As Range, KeyRng As Range) As Long    Const SCol = 10 'J列の列番号  Const DataRng = "[Sheet1$J15:FZ10000]" 'データのシート名と範囲    Dim SQL As String  Dim cn As Object  Dim rs As Object  'SQL用環境設定  Set cn = CreateObject("ADODB.Connection")  Set rs = CreateObject("ADODB.Recordset")  cn.Provider = "Microsoft.ACE.OLEDB.12.0"  cn.Properties("Extended Properties") = "Excel 12.0;HDR=No;IMEX=1"  cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name     'SQL全文を組み立て  SQL = "SELECT" & vbCrLf  SQL = SQL & "count(*) as MyCnt" & vbCrLf  SQL = SQL & "FROM " & DataRng & vbCrLf  SQL = SQL & _     "Where [F" & tgRng.Column - SCol + 1 & "] = '" & _     KeyRng.Value & "'" & vbCrLf    'SQL文を実行して結果を取得  rs.Open SQL, cn  GetMyCount = rs("MyCnt")  '後処理  rs.Close  Set rs = Nothing  cn.Close  Set cn = Nothing   End Function

全文を見る
すると、全ての回答が全文表示されます。
  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.9

VBAで課題カウントを行う関数を作り、 この関数式をセルに埋める対応はいかがでしょうか。 添付画像の右半分に後記VBAのコードを貼り、 K15セルに =GetMyCount(K:K,K13) を埋め 必要数右方向に複写します。 計算式埋めているK13は、数える対象の文字列の埋まったセルです。 Option Explicit Function GetMyCount(tgRng As Range, KeyRng As Range) As Long Const SCol = 11 'K列の列番号 Const DataRng = "[Sheet1$K17:FZ10000]" 'データのシート名と範囲 Dim SQL As String Dim cn As Object Dim rs As Object 'SQL用環境設定 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=No;IMEX=1" cn.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name 'SQL全文を組み立て SQL = "SELECT" & vbCrLf SQL = SQL & "count(*) as MyCnt" & vbCrLf SQL = SQL & "FROM " & DataRng & vbCrLf SQL = SQL & _     "Where [F" & tgRng.Column - SCol + 1 & "] = '" & _     KeyRng.Value & "'" & vbCrLf 'SQL文を実行して結果を取得 rs.Open SQL, cn GetMyCount = rs("MyCnt") '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Function

全文を見る
すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率48% (720/1490)
回答No.8

 ワークエリアを使えば、FZ列まであっても1瞬で計算できる数式が可能です。VBA よりそっちの方がいいと思うのですがどうでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率48% (720/1490)
回答No.7

それは大変ですね。FZ迄入れてみましたが、1ヶ所入力する毎にしばらく止まりました。 VBA にすると、リアルタイムでなく、ボタンを押すたびに計算になります。 いくつか補足をお願いします。 ・文字7つはどこに入っているか。(例えばA1~A7の様に、入っていないなら場所を決めて入れて下さい) ・計算結果をどの列に出力するか(1列目でいいか) ・開始位置はK17 、終了行・終了列共に決まっていないという解釈でいいか。 ・17~10000 なのになぜ 3万カウントなのか。1列づつのカウントではなく、全体カウントなのか。

rieeir3580
質問者

補足

いろいろご検討ありがとうございます。 列に1マス 1WEEK か1Day これが今年度来年度と追加になっていく感じ 行に1イベント単位で増えていきます 1イベントにあ~き(7ショップ分)があり、日程間にあ~きを入力して各ショップのボリューム感を表す感じにしたいです。 行はイベントごと随時増えていきますので 数千数万になっていきます。 画像貼れれば伝わるかと思いましたが・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.6

>この関数を右列にコピーしていきたいんですが、自動でABに変更にならない箇所があります。 提示の数式でINDIRECT関数を使っている理由を補足してください。 Excelに組み込まれた関数はセル番地を指定するとき絶対番地と相対番地を自在に扱うことができます。 例えば提示の数式をAA2に組み込んだとします。 それをAB2セルへコピーするとINDIRECT関数の"AA"は文字列なので"AB"に変化しませんがSUMPRODUCT関数の(AA10:AA10000=”あ")は相対番地指定なので(AB10:AB10000=”あ")に変化します。 このことから対策方法をご自身で探せると思います。

全文を見る
すると、全ての回答が全文表示されます。
  • SI299792
  • ベストアンサー率48% (720/1490)
回答No.5

INDIRECTのR1C1形式です。 R10C27の様に列も数字で指定します。列の数式指定が可能になります。 第二パラメータでFALSE を指定するのですが, だけで省略しています。(, もつけないとA1形式になります) VBA にするのは可能ですが、簡単に修正はできないので、確認します。 ・実際にAA10:AA10000なのか、それとももっと多いのか ・その数式は何処からどこまで入れるのか (というのは、私が数式を入れたら一瞬で出ました、もしかしたら実際もっと多いのではないかと思いました。件数を把握しておかないと、スピードの検証ができません) ・「あ」だけでいいのか「あ」~「お」か。それとも「あ」「い」「か」「き」の様に自由指定にするのか

rieeir3580
質問者

お礼

丁寧な回答ありがとうございます。 実際は文字は7つ 実際には行はK17~K10000で 随時増えていきます。 列もありまして、とりあえずFZまで設けてますが、これも随時増えていきます。 現在この範囲で3万カウントになっております。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#2です。 配列数式ですが =SUM(IF(A2:A11=D1:F1,1,0))を入れて、SHIFT+CTRL+ENTERでも D1,E1,F1のどれか1文字と一致したら件数を加える、が出せます。 D1,E1,F1が、あ、え、お ーー A2:A11が あ い う え お あ い か え お の時、関数の結果は6です。 セルデータが1文字でなくても、完全一致で良いなら同じ式でOK。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

#2です。 すみません。COUNTIFSでは、OR条件で複数条件指定はできません、でした。 =COUNTIF(A2:A11,D1)+COUNTIF(A2:A11,E1)+COUNTIF(A2:A11,F1) 条件は、例えば、D1:F1に、「あ、う、お」とある場合 のような長々した式になりそうです。 == この質問の意図、状況が十分文章で、説明されていない。 == VBAを使うに、処理方法をVBAに、決めて、WorksheetFunctionを使ってCountIf関数の、条件数分の繰り返しで、各々を加え、出せば簡単なように思った。  >SUMPRODUCT((SUBTOTALを使うのは思い付きか、WEB記事の真似では。

rieeir3580
質問者

お礼

関数、VBAとも全くの無知識です。 おっしゃる通りネットでこんなのできないかを探した結果です。ただ重すぎて計算時間がかかっております。 今後もデータ量は随時増えていくため改良したいと考えてます

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>5項目の文字 5つの文字の1文字にについて、該当が何セルあるかカウントしたい、であれば、>但しプルダウンで絞ると=5文字のどれか(複数指定在り)を指定するのは、難しいのでは。 VBAを使えば、できる範囲の課題でしょう。質問表題の「マクロ」が添えられているが、どういう意図か?だいたいはマクロはできないという質問者はここでは、多いが。 >質問の「プルダウン」は、エクセルの入力規則の「リスト」を指す、のでしょうが、5セルに、その入力規則(同じ内容)を設定しておくことになると思うが、そんなことを考えているのか? プルダウンで(例えば)4回別の文字を指定したら、別セルに4文字設定できるのは、難しいのでは。 関数では複数条件的な情報も、複数セルに個別にその値が実現している か式の中に使用者が埋め込むか)ことを、要求するのが普通。 >複数条件的な情報をAND条件でカウントするなら、COUNTIFS関数などの利用を考え直してはどうか。 それでも関数の条件に、指定文字のどれか、の条件を組み立てるのは難しそうだ(複雑になりそう)。

rieeir3580
質問者

お礼

ご回答ありがとうございます。 VBA=マクロと勘違いしておりました。 VBA勉強したいと考えてますが、なかなか覚えられません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelの関数がわかりません

    ExcelでSubtotalによって抽出されたデータを、Sumproduct関数で種類の数をカウントする方法がわかりません。 それぞれ、=subtotal(3,範囲) =SUMPRODUCT(1/COUNTIF(範囲,範囲)) までは、出来上がっておりますが、上記を組み合わせると数式エラーが発生します。 どのように組み合わせればよいか、または、全く違う方法があるのか是非お教えいただきたいと思います。

  • エクセルの配列関数の制限について

    エクセルの配列関数の制限について V列にX列・Y列・Z列・AA列・AB列・AC列・AE列・AG列・P列を参照した配列関数を 下のように入力しています。 {=SUM((Y$1:Y$500=F7)*(Z$1:Z$500=H7)*(AA$1:AA$500)*(P7="○"),(AB$1:AB$500=F7) *(AC$1:AC$500=H7)*(AE$1:AE$500=H7)*(AG$1:AG$500)*(P7="×"))} このY列・Z列・AA列・AB列・AC列・AE列・AG列は、ぞれぞれ200行くらいしか 文字が入力されていない場合には、配列関数の結果がうまく表示されました。 これらのセルの200行以降から300行・400行と項目を増やしていったところ、 配列関数の結果がうまく表示されないセルが出てきました。 これは、配列関数の参照するセルに制限があるということでしょうか?

  • 説明:エクセル関数で条件が二つの時の数値抽出

    質問ではないですが、No8332355 の回答の説明です。 下記の式 =SUMPRODUCT(($AA$75:$AA$152=X75)*($AB$75:$AB$152=Y75),$AC$75:$AC$152) の説明です。 まず、SUMPRODUCT の第1引数ですが、 ($AA$75:$AA$152=X75) は”配列数式”と呼ばれていて、{$AA$75=X75,$AA$76=X75,$AA$77=X75,・・・,$AA$152=X75} という配列データを返します。 1つづつの式は比較論理式ですから、値が一致すれば1、しなければ0となります。 (例えば、3行目で一致するとすれば、{0,0,1,0,0・・・,0}となります。) 同様に ($AB$75:$AB$152=Y75) は {$AB$75=Y75,$AB$76=Y75,$AB$77=Y75,・・・,$AB$152=Y75} となります。 この配列数式を掛け算すると、個々の対応する配列位置のデータが掛け合わされた配列データができます。つまり、X75とY75の値がAA列、AB列で一致した行のみ1となり、他は0になります。 SUMPRODUCT は、この配列と、AC列のデータを個々に掛け合わせて足し合わせるので、結果として検索列が一致した行のAC列のデータが取り出せる、というわけです。 配列数式については、ググってみれば、いろいろ解説が書かれたページがヒットしますので、そちらをご覧になって下さい。 伝わりましたかね?

  • エクセル SUMPRODUCT関数でOR検索

    添付画像のような表があります。 '=SUMPRODUCT((B:B="男")*(C:C="新潟")*(D:D="B")*ROW(A:A)) で、B列が男、C列が新潟、B列がB のデータがある行番号を返してくれます。 B列がBではなく、B列がAまたはABのデータがある番号を検索する場合はどうかなと思い、 '=SUMPRODUCT((B:B="男")*(C:C="新潟")*OR((D:D="A"),(D:D="AB"))*ROW(A:A)) としてみたら、該当データがないにもかかわらずB列がBの行番号が帰りました。SUMPRODUCTで検索する場合、ORを使う場合はどのように書けばよいのでしょうか? ’=SUM(SUMPRODUCT((B:B="男")*(C:C="新潟")*(D:D="A")*ROW(A:A)),SUMPRODUCT((B:B="男")*(C:C="新潟")*(D:D="AB")*ROW(A:A))) のようにそれぞれを求めて合算するしかないのでしょうか?

  • エクセルの条件付きでデータの種類をカウントする関数

    エクセルの条件付きで重複データや空白データをカウントせず、種類数をカウントする関数の書き方を教えてください。 C列の5行目から14行目に「品目」が入力され、D列に「売れた数」が入力されているとします。売れていない場合は「売れた数」は空白。品目等のデータがない行もあります。品目には重複しているものもあります。 ここで、G5セルに「売れた品目の種類数」を表示させる関数をどのように書けばよいか教えてください。 SUMPRODUCTやCOUNTIFまたはMATCH関数を使っていろいろ試してみましたが、うまくいきません。

  • エクセル関数で質問です。

    初心者なので上手く説明はできませんが宜しくお願いします。 例えば 列はA~E 行は1~50で1~50までの数字があるとします。 質問ですが例えば2行目AB列に5と10が並んでるとします他にも同じく5と10が同じように違う行で 並んでいるのですがそのカウント仕方が解りません数字1つの場合はカウントの仕方は解るのですが 数字が2つ3つ重なる数字のカウントの仕方が解りませんので教えて下さい

  • エクセルの関数やマクロで

    A列に以下のように入力したいのですが。 aa ab ac ad ae af 上記のようにアルファベット順で入力して、azまでいったら、今度はbaからbzでまで入力します。そのような感じでzzまで入力していきたいのですが。 この入力作業を、関数やマクロで行なうことは可能でしょうか? おわかりになる方がいましたら教えて下さい。

  • エクセルの関数について

    下記のようなことが関数で出来ますか? A1セルに「AA AB AC AD AE」というデータがあったときに、 B1に、A1に「AB」か「AC」という文字列があればそれを取り出す。なければブランク(もしくは#N/A) かつ優先順位もつけたい。 (「AB」も「AC」もある場合は「AB」) 「AA」と「AB」の間など、文字間は必ず半角スペースがあいている状態です。 具体的な例は↓の画像のような感じです。 かなり高度だと思うんですが、関数で実現できますでしょうか? よろしくお願いします。

  • エクセルの関数でダブルカウントを避ける方法

    エクセルの関数機能で回答お願いいたします! _______A_______B_______C_______D_______E_______F 1____品名___値____設定____下限___上限 2_____AA______1______(1)______0______1.6 3_____AB_____1.5_____(2)_____1.4_____2.1 4_____AC______2______(3)_____1.8_____2.2 5_____AD______1______(4)_____2.2_____2.6 6____AE______3____(5)_____2.5_____3.1 このような表があります。   AA~AEまで5つの商品があり、 それぞれに値があります。 それらを 下限(D列)≦ 値 <上限(E列) の範囲に 当てはまる 品数 をカウントしたいのですが これをカウントし、F列に答えを返すと、 (1)0~1.6の間には  3つ (2)1.4~2.1の間には 2つ (3)1.8~2.2の間には 1つ (4)2.2~2.6の間には 0つ (5)2.5~3.1の間には 1つ となり、下限と上限の間にある値をダブッてカウントしてしまうのです。 F列の縦合計が 品名の数と同じようになるように、ダブらずに集計したいのですが ダブらないでカウントする条件を設定したいのです。 たとえば 品名ABの場合、 下限と上限の範囲には 2つヒット(設定(1)と(2))してしまうので この場合、(1)の方にカウントし、(2)にはカウントしない という風にし、絶対にダブルカウントせずに下限と上限の間の設定が2箇所ヒットした場合 常に下限が小さい方にカウントさせる方法はないでしょうか? もしもっとシンプルに以上の解決策を ご存知でしたら是非それも教えてください。 よろしくお願いいたします!!!

  • エクセル中で≠を意味する関数は?

    エクセルを使っています。sumproduct関数を使用して、複数の列でそれぞれ特定の条件を満たす行の数を数えたいです。その際に、「値が○○でない」という条件を入れたいのですが、「≠」のような関数はありませんか?

専門家に質問してみよう