- ベストアンサー
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で条件分岐 というような形になるのかなと思ったのですが どうしても思い浮かびません。 どうぞよろしくお願いします。
- takohasisa
- お礼率74% (63/85)
- オフィス系ソフト
- 回答数6
- ありがとう数3
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
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が"みかん"で終わる可能性もあるなら、そこが最大値かどうかのチェックも必要です。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 こちらの場合は、カタカナや半角比較でも可能にしていること、文字列の後ろに空白が入っても、空白を取って比較する、というのが利点かな?後は、他の人と変わらないです。ただ、これは、人に教えるためではなくて、あくまでも、自分の練習、自分で作ってみないと分からない部分があります。 '---------------------------------------- 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 '-------------------------------------------
お礼
ありがとうございました。構造がやっと理解できました。 最大値を変数mxとして置き換えるというところが自分では思い浮かびませんでした。 またわからないことがあったらお願いいたします。
- rukuku
- ベストアンサー率42% (401/933)
こんばんは こんな感じで以下がでしょうか? 「マクロの記録」で作りました。 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)
丸投げ質問なので、考え方だけ書く。まどろっこしいが。 A列(1セル)の直前行の値を保持する変数を1つ用意する。 またその行までの最多連の数を保持する変数を用意する 途中経過の連の数を保持する変数を用意する。 ーー For Nextで最終行までA列を順次読むが 直前行と現在行を比較して変わったら 今回の連と過去の連を比べ、大きければ過去最多を更新 (等しいか・小さけれ過去最多ばいらわない。) その時A列のセルが、空白セルならば、無いものとして処理を飛ばす 連の数もそのまま 過去最多もそのまま、 直前行もそのまま で次行の処理に移る。 また直前行と現在行を比較して変わったら、連の数を1から始める。 直前行は現在行の値にして次の行処理に移る ーーー。 最初行は比較対照が無いので特別処理をする。 最終行は、この処理が、1種の溜め込み処理なので、後じまいが必要(最多連の処理など)。
- okormazd
- ベストアンサー率50% (1224/2412)
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)
考え方のヒントです。 たとえば「みかん」を対象にした場合、 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と求めるようなものを分岐処理と繰り返し処理を使って作りたいのですが可能でしょうか? わかりにくい文章で申し訳ありませんがアドバイス等くれると助かります。
- ベストアンサー
- オフィス系ソフト
- データのカウント方法を教えてください
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文を使うのでしょうが、その構文がわかりません。 初心者で大変申し訳ないのですが、どなたかご教授下さい。
- ベストアンサー
- Visual Basic
- EXCEL VBAでセルの値が数値のときに2を掛ける方法について
すいませんEXCEL VBAで教えていただきたいことがあります。 A1:H3000に数値及び文字列が入っている。 この範囲で値が数値のときは当該セルの値に*2の処理を行う (文字列の場合はそのまま) Dim i as Variant For Each i in Range("A1:H3000") IF ~ Next i というような流れでしょうか。 IFの後がテキスト本を見てもよくわかりませんでした。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
ありがとうございました。やっと理解できました。 空欄でないかつみかんでないときにcntをリセットするというところまでは自分で出来たのですが、 リセット前に最大値の変数xを置き換えるという処理がわかりませんでした。 どうもありがとうございました。