• ベストアンサー

EXCEL VBA における個数のカウント方法について

すいませんEXCEL VBAについて質問があります。     A列   1行  みかん 2行  みかん 3行  (空欄) 4行  みかん 5行  ぶどう 6行  みかん 7行  みかん 8行  ぶどう 9行  (空欄) ・ ・ 50行 A列は「みかん」若しくは「ぶどう」の値又は空欄のいずれかになっている。 空欄は無視して(1行~4行はみかんが3つ連続で並んだと考える)、 50 行までの間に「みかん」が最大で何回連続で並んだかを調べ、その最大の値をB1セルに入れる。 これをVBAで処理するにはどうしたらいいのでしょうか。 For ~NextとIfで条件分岐 というような形になるのかなと思ったのですが どうしても思い浮かびません。 どうぞよろしくお願いします。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

Dim r  As Range Dim cnt As Long Dim x  As Long With ActiveSheet   For Each r In .Range("A1:A50")     If r.Value = "みかん" Then       cnt = cnt + 1     ElseIf r.Value <> "" Then       If cnt > x Then         x = cnt       End If       cnt = 0     End If   Next   If cnt > x Then     x = cnt   End If   .Range("B1").Value = x End With 「空欄ではなく、かつ "みかん"ではない」という条件の時にカウントアップした変数cntをリセットする。 という点に着目したほうが良さそう。 で、リセットの前に最大値かどうか調べて最大値だったらその変数xを置き換えておく。 最後のセルA50が"みかん"で終わる可能性もあるなら、そこが最大値かどうかのチェックも必要です。

takohasisa
質問者

お礼

ありがとうございました。やっと理解できました。 空欄でないかつみかんでないときにcntをリセットするというところまでは自分で出来たのですが、 リセット前に最大値の変数xを置き換えるという処理がわかりませんでした。 どうもありがとうございました。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 こちらの場合は、カタカナや半角比較でも可能にしていること、文字列の後ろに空白が入っても、空白を取って比較する、というのが利点かな?後は、他の人と変わらないです。ただ、これは、人に教えるためではなくて、あくまでも、自分の練習、自分で作ってみないと分からない部分があります。 '---------------------------------------- Sub TestCount1()   Dim i As Long   Dim k As Long   Dim mx As Long   Dim flg As Boolean   Const sFND As String = "みかん"      For i = 1 To 50     If StrComp(Trim(Cells(i, 1).Value), sFND, 1) = 0 And flg = False Then       flg = True       k = 1     ElseIf StrComp(Trim(Cells(i, 1).Value), sFND, 1) = 0 Then       k = k + 1     ElseIf Cells(i, 1).Value <> "" _       And StrComp(Trim(Cells(i, 1).Value), sFND, 1) <> 0 Then       flg = False       If mx < k Then         mx = k       End If     End If   Next i   Cells(1, 2).Value = mx End Sub '-------------------------------------------

takohasisa
質問者

お礼

ありがとうございました。構造がやっと理解できました。 最大値を変数mxとして置き換えるというところが自分では思い浮かびませんでした。 またわからないことがあったらお願いいたします。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.5

こんばんは こんな感じで以下がでしょうか? 「マクロの記録」で作りました。 Sub Macro1() Range("I1").Select ActiveCell.FormulaR1C1 = "=IF(RC[-8]=""みかん"",1,0)" Range("I2").Select ActiveCell.FormulaR1C1 = _ "=IF(RC[-8]=""みかん"",R[-1]C+1,IF(RC[-8]="""",R[-1]C,0))" Selection.AutoFill Destination:=Range("I2:I50"), Type:=xlFillDefault Range("I2:I50").Select ActiveWindow.ScrollRow = 1 Range("B1").Select ActiveCell.FormulaR1C1 = "=MAX(RC[7]:R[49]C[7])" End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

丸投げ質問なので、考え方だけ書く。まどろっこしいが。 A列(1セル)の直前行の値を保持する変数を1つ用意する。 またその行までの最多連の数を保持する変数を用意する 途中経過の連の数を保持する変数を用意する。 ーー For Nextで最終行までA列を順次読むが 直前行と現在行を比較して変わったら 今回の連と過去の連を比べ、大きければ過去最多を更新 (等しいか・小さけれ過去最多ばいらわない。) その時A列のセルが、空白セルならば、無いものとして処理を飛ばす 連の数もそのまま 過去最多もそのまま、 直前行もそのまま で次行の処理に移る。 また直前行と現在行を比較して変わったら、連の数を1から始める。 直前行は現在行の値にして次の行処理に移る ーーー。 最初行は比較対照が無いので特別処理をする。 最終行は、この処理が、1種の溜め込み処理なので、後じまいが必要(最多連の処理など)。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

Sub test() n = 0 nm = 0 For r = 1 To 50 s = Cells(r, 1) If s <> "" Then If s = "みかん" Then n = n + 1 Else If n > nm Then nm = n n = 0 End If End If End If Next Cells(1, 2) = nm End Sub

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

考え方のヒントです。 たとえば「みかん」を対象にした場合、 1)カウンターと最大値を控える変数を用意しておく。 2)ループの始めにカウンターをクリア(0にする) 3)上から(下からでもよい)順に見て行って、みかんが連続している間は  カウンターをインクリメントする。(+1する=連続数を数える) 4)連続が途切れた時に、カウンターの値と最大値を比較して、大きいほう  を最大値に保存する。  同時にカウンターをクリアする。(0に戻す) 5)以上を、データがある間ループさせて、終わったときに最大値に入って  いる値が、求めたい回数となっている。 (「ぶどう」が対象の場合でも同じですね)

関連するQ&A

  • EXCEL VBAで特定のセルの値による判定について

    すいません、EXCEL VBAで質問があります。 A1~A9 空欄 A10 "赤" A11~A16 空欄 A17 "青" A18~A21 空欄 A22 "青" A23~A35 空欄 A36 "赤" ・・・ A列の1000行までの間にランダムに赤か青の値が入っています。 A列の空欄のセルについて、下のセルを見ていき、 最初に来る値が赤であれば、それまでの空欄に"りんご"、青であれば"みかん"という値を入れる処理をVBAでやるにはどうしたらいいのでしょうか。 上の例でいうと、A1~A9及びA23~A35のセルには"りんご"、A11~A16及びA18~A21のセルには"みかん"と入ります。 do until~loopやfor~nextでやろうとしましたがどうにもうまくいきません。 よろしくお願いいたします。

  • EXCEL VBAで複数のシートの中から該当値を検索する方法について

    すいません、EXCEL VBAで複数のシートの中から該当する値を検索する方法について教えていただきたいことがあります。      Sheet1              A列   B列  C列   1行  11  りんご  31  2行  12  バナナ  32  3行  13  みかん  33  4行  14  ぶどう  34   ・   ・   ・     ・        Sheet2              A列   B列  C列   1行  31  すいか  11  2行  32  レモン  12  3行  33  パイン  13  4行  34  ざくろ  14   ・   ・   ・     ・ というデータが入っているブックについて 「全部のシートを検索し、A列に11の値が入っているセルの行数及びその行のB列の値」 をSheet1のD1セルとE1セルにそれぞれ返す方法はどうしたらよろしいんでしょうか。 For Each を使うのではないかと思って色々やってみたのですが、どうも上手く作動してくれません。 よろしくお願いいたします。

  • Excelで立ち上げ後しばらくすると動きが鈍くなる〔VBA〕

    VBAを使った動作がEXCEL2003を立ち上げて5分か10分くらいすると動きが異常に遅くなります。これってリソースの関係なのでしょうか? 具体的にといいますと、例えばLoop-NextにIF-End IFを組み込んだような構文で遅くなる現象がよくおきている感じがします。具体的な繰り返しも50回位というところです。この例ですと、「Activecellが空欄ならばその行を非表示にする」という作業を「1セル下にずれながら50回繰り返す」というものです。 この作業もExcelを立ち上げた当初には0.5秒くらいでしてくれるのに、しばらくすると同じ作業を5秒から10秒くらいかかってしまいます。 いままでの経験で言うと、セルに値を指示するような記述では遅くなるという現象はなく、Activecellが動いたり、シート間を行き来したり、行や列を非表示にするような記述をすると動きが重たくなる現象が起きているような気がしています。 ちなみにVBAを使わない通常の作業には全く遅いと感じることはありません。

  • エクセルVBAで分岐処理と繰り返し処理を使って最大値を求める方法

    エクセルVBAを使って列に書かれている数値の中からFor~Next、もしくはDo~Loopの繰り返し処理とIf文などの分岐処理を使ってA列の中に無造作に書かれている数値から最大値を求めることはできるのでしょうか? たとえば A 12 56 -3 85 -18 ・ ・ ・ などとA列に書かれているの文字の中から最大値=85と求めるようなものを分岐処理と繰り返し処理を使って作りたいのですが可能でしょうか? わかりにくい文章で申し訳ありませんがアドバイス等くれると助かります。

  • エクセルのVBAで

    ある列(仮にA列とします)の最終行がA30であり A25までは空白だとします。 この時に、A30の値をA29~A25=データの入力されていないセルに入力(コピー)するにはVBAでどのように記述すればいいのでしょうか? 最終行から、上にその最終行の値をデータの入力されているセルに達するまで入力(コピー)したいのですが。 分りづらい表現で申し訳ありませんが、よろしくお願い致します。

  • データのカウント方法を教えてください

    C列からK列の10行目以降に数値(1~250まで)が入力していいます(全ての行に入力されているわけではなくところどころ空欄があります。 各列について3行連続、4行連続 5行連続 5行以上連続でデータが入力されているセルの数 (C12空欄、C13~C15入力あり、C16空欄なら3行連続が1個という感じ) を数えて結果をM6~U9に表示(C行の3行連続の数をM6、4行連続の数をM7・・ D列の3行以上連続をN6,4行以上連続をN7・・・)したいのですがどうしたらいいでしょうか。workseets_changeイベントでの方法をお願いします

  • EXCEL VBAで行う複数の検索条件に合致する行の個数のカウント方法について

    すいません EXCEL VBAで教えていただきたいことがあります。    A列  B列 1行:野菜  秋物 2行:果物  秋物 3行:穀物  夏物 4行:野菜  夏物 5行:野菜  春物 6行:穀物 秋物 7行:果物  夏物 8行:野菜  秋物 ・・・以下300行まで続く というデータがあるとして、A列が「野菜」、B列が「秋物」に合致する 行の合計個数をカウントするのはどうしたらよろしいんでしょうか。 関数だとデータベース関数を使えば何とかできそうな感じなのですが VBAだと、どうもいいアイデアが浮かびません。よろしくお願いいたします。

  • Excel VBAでの値の比較

    お世話になります。 Excel VBAでの値の比較方法についてご教授頂きたく存じます。 下記のような値がセルに入っていると仮定しまして、 セルA1とセルG1を比較する セルA2とセルG2を比較する セルB1とセルH1を比較する セルB2とセルH2を比較する 値が違う場合のみ、A列、又は、B列のセルの色を変更したいのですが・・・。 下記例の場合であれば、B1とA2がセルの色が変われば良いです。    A列 B列    G列 H列 1行  1  1     1   2 2行  2  2     3   2 VBAで実現したいと思います。 何卒、宜しくお願い申し上げます。

  • Excel VBA マクロ 繰り返し処理について

    初めて、ご質問させて頂きます。excel2003で、VBAによる連続繰り返し処理をしたいのですが、プログラムの知識が全くありませんので、どなたかご教授頂けませんでしょうか。 VBAによる連続繰り返し処理の内容は、excelの1つの列に上から順番に、IPアドレスを4つずつ同じ値で、入力したいのです。 例:10.30.118.1、10.30.118.1、10.30.118.1、10.30.118.1、10.30.118.2、10.30.118.2、10.30.118.2、10.30.118.2、10.30.118.3、10.30.118.3、10.30.118.3、10.30.118.3、、、 上記の例の様に、1つの列上で上のセルから順番に、4つずつ同じ値を順番に、4000行程度入力したいのですが、手で入力するのは、大変時間がかかる為、自動で入力させたいと思っています。 恐らくfor文を使うのでしょうが、その構文がわかりません。 初心者で大変申し訳ないのですが、どなたかご教授下さい。

  • EXCEL VBAでセルの値が数値のときに2を掛ける方法について

    すいませんEXCEL VBAで教えていただきたいことがあります。 A1:H3000に数値及び文字列が入っている。 この範囲で値が数値のときは当該セルの値に*2の処理を行う (文字列の場合はそのまま) Dim i as Variant For Each i in Range("A1:H3000") IF ~ Next i というような流れでしょうか。 IFの後がテキスト本を見てもよくわかりませんでした。 よろしくお願いします。

専門家に質問してみよう