【VBA】データが途切れた回数をカウントする方法

このQ&Aのポイント
  • 添付画像のような1行ごとにデータが入力されている表があります。このデータには、データが入力されているセルと空白セル(黄色のセル)があります。1行ごとに、最初にデータが入力されたセルから最後にデータが入力されたセルまでの間に、空白が発生した回数が何回あるのかをカウントしたいと思っております。
  • 空白セルの数をカウントするのではなく、データが途切れた回数をカウントしたいのです。VBAを使って、上記のような処理は可能でしょうか?私は現在VBAを勉強中で知識が浅いため分かりませんでした。もし可能であれば、その方法を教えていただけると大変助かります。
  • 【VBA】データが途切れた回数をカウントする方法について教えてください。添付画像のような1行ごとにデータが入力されている表がありますが、データが入力されているセルと空白セル(黄色のセル)が混在しています。1行ごとに、最初にデータが入力されたセルから最後にデータが入力されたセルまでの間に、空白が発生した回数が知りたいです。空白セルの数ではなく、データが途切れた回数をカウントする方法を教えてください。
回答を見る
  • ベストアンサー

【VBA】データが途切れた回数をカウントする方法

添付画像のような1行ごとにデータが入力されている表があります。 このデータには、データが入力されているセルと空白セル(黄色のセル)があります。 1行ごとに、最初にデータが入力されたセルから最後にデータが入力されたセルまでの間に、空白が発生した回数が何回あるのかをカウントしたいと思っております。 空白セルの数をカウントするのではなく、データが途切れた回数をカウントしたいのです。 VBAを使って、上記のような処理は可能でしょうか? 私は現在VBAを勉強中で知識が浅いため分かりませんでした。 もし可能であれば、その方法を教えていただけると大変助かります。 お手数お掛けいたしますが、よろしくお願い致します。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 > 空白セルの数をカウントするのではなく、データが途切れた回数をカウントしたいのです。 う~んと、そのご説明では、添付画像のサンプル上から、3、5、3、1、2という結果になるのでは? と思いますが、添付画像のサンプルを解釈する限りでは、 「空白でない区間に挟まれた空白区間の数」みたいな感じでしょうか? 簡単そうでいて案外頭を悩ませますね。 添付画像のサンプルを再現して動作を確認したものを3例掲げます。 書き方は山ほどありますが、ポイントは3段階のフラグをどう扱うかという一点になります。  各行毎、列方向に二重にループして    空白でない区間に未だ当たってない場合の初期値として  vbUseDefault    空白区間から空白でない区間に入ったら  vbFalse    空白でない区間から空白区間に入ったら  vbTrue   というように定義した変数を使って、    vbTrue が vbFalse に変わる(空白区間から空白でない区間に入る)段階   をカウントします。 ' ' /// Sub Re8516841()   Dim i As Long   Dim j As Long   Dim triIsBlank As VbTriState   Dim cnt As Long   For i = 3 To 7     triIsBlank = vbUseDefault     cnt = 0     For j = 2 To 17       If Cells(i, j) <> "" Then         If triIsBlank = vbTrue Then cnt = cnt + 1         If triIsBlank Then triIsBlank = vbFalse       ElseIf triIsBlank = vbFalse Then         triIsBlank = vbTrue       End If     Next j     Cells(i, 18) = cnt   Next i End Sub ' ' /// あえて馴染みやすい(?)ように、整数型で表すと、以下のようになります。 ' ' /// Sub Re8516841c()   Dim i As Long   Dim j As Long   Dim nMode As Integer   Dim cnt As Long   For i = 3 To 7     nMode = -2     cnt = 0     For j = 2 To 17       If Cells(i, j) <> "" Then         If nMode = -1 Then cnt = cnt + 1         If nMode Then nMode = 0       ElseIf nMode = 0 Then         nMode = -1       End If     Next j     Cells(i, 18) = cnt   Next i End Sub ' ' /// あえて2つの論理値を組み合わせて書くと、以下のようになります。 個々の記述については誰でも解る基本的な記述になっていますが、 全体としては却って、条件分岐の仕方が解り難いと感じる方も少なくないでしょう。 ' ' /// Sub Re8516841a()   Dim i As Long   Dim j As Long   Dim cnt As Long   Dim flgStart As Boolean   Dim flgOnBlank As Boolean   For i = 3 To 7     flgStart = False     flgOnBlank = False     cnt = 0     For j = 2 To 17       If Cells(i, j) <> "" Then         If flgOnBlank = True Then         cnt = cnt + 1         flgOnBlank = False         End If         If flgStart = False Then flgStart = True       ElseIf flgStart = True And flgOnBlank = False Then         flgOnBlank = True       End If     Next j     Cells(i, 18) = cnt   Next i End Sub ' ' /// 大事なのは、使う方、ご本人が、解り易いと感じるものを使う、 ということになるかと思います。

HNK1001
質問者

お礼

cj_mover様 早々にご回答くださり誠にありがとうございます。 私の説明が足りなかったにも関わらず、意図を理解してくださり感謝しております。 ご指摘いただいたとおり「空白でない区間に挟まれた空白区間の数」を求めたかったのです。 「vbUseDefault」を使って空白区間から空白でない区間に入る段階をカウントするという方法があったのですね。 また、3パターンの記述例と大変分かりやすい解説もいただき、とても勉強になりました。 ご教示いただいたVBAで動作確認しましたら、希望通りの結果を得ることができました! 本当にありがとうございました(#^.^#)

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

ANo.2です。 先ほどのユーザ関数では全て空の時に-1になってしまいますので、コードの最後の所を以下の様に修正してください。これで全て空の時は0になります。 fCount = UBound(sCount) ↓ fCount = WorksheetFunction.Max(0, UBound(sCount))

HNK1001
質問者

お礼

mt2008様 早々にご回答くださり誠にありがとうございます。 関数「Trim/Split/UBound」を組み合わせて、空白エリアをカウントするという方法はとても勉強になりました。 ご教示いただいたVBAで動作確認しましたら、希望通りの結果を得ることができました! 本当にありがとうございました(#^.^#)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

ユーザ関数を作ってみました。 下のコードを標準モジュールに入れた後、R3セルに =fCount(B3:Q3) の様に式を入れて下さい。 Function fCount(rRange) As Long   Dim rOne As Range   sSTring = ""   For Each rOne In rRange     sOne = rOne.Text     If sOne = "" Then sOne = " "     sSTring = sSTring & sOne   Next rOne   sSTring = WorksheetFunction.Trim(sSTring)   sCount = Split(sSTring, " ")   fCount = UBound(sCount) End Function セル範囲の文字を全部(空白はスペースに置換して)くっ付け、ワークシート関数のTrimで余計なスペースを除去した後でSplit関数で文字を分割し、その要素数を返しています。

関連するQ&A

  • エクセルで、特定の数字が出た回数をカウントする方法はありますでしょうか??

    いつも、いつもお世話になっております^ ^ エクセルで、特定の数字が出た回数を カウントする方法はありますでしょうか?? データ数が10000以上あるのですが、 その中から特定の数字が出た回数をカウントし、 別のセルにその数値を表示したいと思っております。 例)データ(Aセルに入力)   4   5   2   7   5   5   3   5  としましたら、  5と2を特定の数字とし、  Bセルに5と2が出た回数をカウントする方法は、  ありますでしょうか??  2が1回出現、  5が4回出現していますので、  この場合はB1セルに5と表示できればと思っております。 どなたか知識を分けていただければ幸いです。 よろしくお願いいたしますm(_ _)m

  • エクセルデータのカウント

    A1:E5にデータが入力してあります。(空白セルもあり) C列、D列、E列のどれか1つのセルにでもデータ(数値) が入っている行の数をカウントして、A6に表示する 方法を教えてください。 たとえばF列に、=COUNT(C1:E1)を計算する行を入れて、 A8で=COUNTIF(F1:F5,">=1")をすれば、できるのだと思うのですが、 そのために行を増やしたくないのです。

  • カウントについて

    エクセルをつかってカウント処理を考えています. どなたかアドバイス頂けないでしょうか。 下記のような表があります. 例えば、セルA1~3まで100とあり、セルA4~5まで400とセルA1~3とセルA4~5の数値はおなじです。3行分だったり2行分だったりと不規則コードが下に続いていきますが,まとまった数値になります. そのA列の同じコード番号全てに対して、B列にカウント数を入力したいのです。 B列のカウント数入力箇所は、セルA1~3までだとするとセルB3に最大値のカウント数がくるようにしたいのです。 コード  カウント数      100              100               100      3        200               200      2        500               500               500               500      4       

  • 空白のセルのカウントについて

    インターネット等で色々検索したのですが、うまく回答が導き出せなかったのでこちらで質問させていただきます。 添付したような表があるとき、B列にある空白のセルを都道府県別にカウントするにはどのようにしたら良いか教えてください。 例には都道府県を使用しましたが、実際には1000行を超えるデータとなりA列には同じ値が入力されます。 結果として 北海道:1 愛知:2 東京:2 福岡:0 というような答え導き出す方法を教えてください。 よろしくお願いします。

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

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

  • エクセル データのカウント

    C列からG列の5行目以降に数値データが入っています。 ただ、全てのセルに入力し足るのではなくところどころに空白セルがあります。 それぞれの列についてデータの入力してあるセルの数を数えてそれを各列の2行目に表示したいのですがどうしたらいいでしょうか?

  • Excel VBAのカウントについて

    Excel2003で表を作成しています。 画像のような表を作成しているのですが、 左のデータから右の表に数を入力するのに、VBAで出来ないでしょうか? COUNTIFを使おうと思ったのですが、COUNTの条件が3つありますし、 左のABCの列は500行くらいデータが入っているので出来ればVBAで出来たらと思いました。

  • 不規則エリアの連続計算方法(VBA)

    度々お世話になっております。 エクセルVBA勉強中の初心者です。 現在、下記のような数値データが入力されています。 処理したいのは、 A列・・・・・・・・・・・・処理後B列 1行目 空白・・・・・・空白 2行目 1・・・・・・・・・・・1 3行目 2・・・・・・・・・・・2 4行目 3・・・・・・・・・・・3 5行目 4・・・・・・・・・・・4 6行目 5・・・・・・・・・・・5 7行目 空白・・・・・・空白 8行目 1・・・・・・・・・・・6→第一エリア目の最終行と足し算 9行目 3・・・・・・・・・・・8→同上 10行目 4・・・・・・・・・・・9→同上 11行目 6・・・・・・・・・・・11→同上 12行目 空白・・・・・・空白 13行目 2・・・・・・・・・・・13 →第二エリア目の最終行と足し算 14行目 4・・・・・・・・・・・15 →同上 15行目 7・・・・・・・・・・・18 →同上  ・                ・  ・                ・ 各エリアは、各1000行程度、エリアの数は、10~20になるため、どうしてもVBAで処理したいと考えております。 (空白~空白をエリアと名付けています。) 各エリアの数、行数ともに区々ですが、最大値を迎えた後、空白行が必ず入るようにデータが入力されています。 このようなデータをVBAで処理したいのですが、可能なのでしょうか? 参考書、過去ログなどを見てあれこれやってみたのですが、パニック状態です。 わかりにくい質問で恐縮ですが、良い方法をご教授いただければ幸いです。 宜しくお願いいたします。

  • エクセルVBAで質問です。

    エクセルVBAで質問です。 不用な空白行を削除したいのですが、どのようにコードを書いたらいいでしょうか? 添付の画像のような表を作っています。 添付のではAAからGGまでデータが入っていますが、いつもデータ数は違います。ただし20行目 より多くなることはありません。データ範囲の5行目から20行目まででおさまります。 このような条件で、データのない空白行を自動で削除するようにしたいと考えています。 よろしくお願いします

  • VBAで数値グループをCOUNTする方法

    お世話になっております。 VBAを勉強中の初心者です。 過去ログを検索したのですが、どうしても見つからなかったため、質問させていただきました。 現在、下記のようなexcelデータをVBAで処理しようと考えているのですが、方法が分からなく、困っています。 処理したいデータ例は、下記の通りです。     A列 1行目 空白 2行目 3 3行目 4 4行目 5 5行目 4 6行目 3 7行目 空白 8行目 空白 9行目 空白 10行目 7 11行目 10 12行目 12 13行目 8 14行目 6 15行目 空白  ・  ・ 上記のようなデータが、A列のみ約1000行程度、高さが異なる山の数が、50程度あります。 (A列を折れ線グラフで見たときに、データは必ず山状になるので、山の数と表現しております。) 今回、処理したいのは、上記のような山の数、2行目~6行目を一山、10行目~14行目を二山として、合計で何山あるのかをCOUNTしたいと考えています。 この山の数を次のVBA処理で活用したい為、COUNTしたいのですが、山(群)の、COUNT方法が分かりません。 このとき、空白行の数、数値データ入力行の数は区々ですが、各区間空白行が必ず、1~10行迄入力されている状況です。 とても分かりにくい質問で大変恐縮ですが、上記のような山を1群と見たときの、山のCOUNTは、VBAで可能なのでしょうか? ご検討を宜しくお願いいたします。

専門家に質問してみよう