• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBAのデータの連続する個数の検索)

ExcelVBAのデータの連続する個数の検索方法

このQ&Aのポイント
  • ExcelVBAを使用して、データの連続する個数を求める方法について説明します。
  • A~Fの各列ごとに、121以上の数字が連続する個数を出力し、最大値を求める方法について解説します。
  • 具体的なデータの例を示しながら、連続する個数の計算方法と最大値の求め方を詳しく説明します。

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

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

こんにちは。お邪魔します。 元の表の下に、  1行空けて  "最大値"タイトル  "最大値"各列の値  "連続する個数"タイトル  "連続する個数"各列各連続区間の数(行数不明) といった順にに出力するように書きました。 (連続する区間の数がUnkwonですから仕方ないかと) 1コ、とか、2コ、とか、単位を表示したい場合は、 [セルの書式設定][表示設定]で工夫した方がいいと思います。 処理の流れだけ、以下。  ・テーブル全体を捉える  ・行数を取得する  ・テーブルを各列毎にループ  ・各列を 下に一行拡張させた範囲で捉えなおして各単セル毎にループ    各単セルの値が閾値以上である場合、カウンタを1増加    各単セルの値が閾値未満で 且 カウンタが0より大きい場合、     カウンタが各列の最大値より大きい場合、最大値を更新     各連続区間の"連続する個数"について     出力する行位置を増加させながら、出力(→初期化)   各単セル毎のループが終わったら各列の最大値を出力(→初期化) こんな感じです。 ' ' =========================ここから=========================== Sub Re_7681627c()   Const THRESH As Double = 121# ' 閾値を指定。   Dim rCol As Range ' ループ内で【各列】をポイントする変数   Dim rH As Range ' ループ内で【各単セル】をポイントする変数   Dim nRows As Long ' テーブルの行数(レコード数)   Dim nPrtRow As Long ' "連続する個数"を出力する行位置   Dim nCnt As Long ' "連続する個数"カウンタ   Dim nLongest As Long ' 各列の"最大値"   With Cells(2, 2).CurrentRegion ' 運用に合わせて適宜指定してください     nRows = .Rows.Count     For Each rCol In .Columns       nPrtRow = nRows + 4       For Each rH In rCol.Resize(nRows + 1).Cells         If rH.Value >= THRESH Then           nCnt = nCnt + 1         ElseIf nCnt > 0 Then           If nCnt > nLongest Then nLongest = nCnt           nPrtRow = nPrtRow + 1           rCol.Cells(nPrtRow).Value = nCnt           nCnt = 0         End If       Next rH       rCol.Cells(nRows + 3).Value = nLongest       nLongest = 0     Next rCol     .Cells(nRows + 2, 1).Value = "最大値"     .Cells(nRows + 4, 1).Value = "連続する個数"   End With End Sub ' ' =========================ここまで===========================

emiberry
質問者

お礼

数式がそのまま使えて、しかも説明付きでとてもわかりやすかったです。 とても勉強になりました。 ありがとうございました。

その他の回答 (3)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

VBAを使わずとも、データがあるシートをSheet1とすると、 Sheet2に例えば以下のような式を入れて (Sheet1の同じセルが121以上かを判定して、以上なら、Sheet2の1つ上のセルの値に+1する。 違ったら0を入れる。一番上の列だけ1つ上のセルがないので、+1でなく1を入れる) 例)sheet2のA1セル =if(row()=1,if(sheet1!A1 >= 121,1,0),if(sheet1!A1 >= 121,1 + offset(A$1,row()-1,0,1,1)) これをA1セルに入れてコピー&A1セルからF???(最大行)セルまで指定して貼り付けし、 sheet3に A1セルに =max(sheet2!A:A) B1セルに =max(sheet2!B:B) ・・・ とかいう風にしたら最大値は式だけで求まるはずですが。 Sheet2に出てくる結果 A/B/C/D/E/F 0/0/0/0/0/0 0/0/0/0/0/1 1/1/1/1/1/2 0/2/0/2/0/0 0/0/0/3/0/0 1/1/1/4/1/1 2/0/2/5/2/2 Sheet3には、MAXを求めるので 2/2/2/5/2/2 とでてくる。 (未検証。多少数式を間違っているかもしれませんがご勘弁。)

emiberry
質問者

お礼

こういうやり方もあるんですね。参考になりました。ありがとうございました。

回答No.2

最大値:Aを求めるには、次式が最速です。 A = Application.WorksheetFunction.Max(Range("A1:A100")) 「最大値を求める範囲と、要求される最大値の個数をどういう方法で取得するか。」 ということが明確になっていれば簡単だと思います。 Application.WorksheetFunctionが使えない場合は、 For W=1 To X For Y=1 To Z If Cells(W,Y).Value>A Then A= Cells(W,Y).Value End If Next Y Next W 「最大値を求める範囲と、要求される最大値の個数を取得したデータがXとZです。 最大値の同値個数は、 B= Application.WorksheetFunction.Countif(Range("A1:A100"),A)

emiberry
質問者

お礼

細かな説明付きで参考になりました。 ありがとうございました。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

一案です。 10行目から連続個数、15行目にMAX数を表示しています。 ご例示のデータサイズによる暫定版ですので後は調整して下さい。 Sub sample() Dim i As Integer, j As Integer, n As Integer Dim wk() n = -1 flg = False For j = 1 To 6 For i = 1 To 7 If Cells(i, j) >= 121 Then If flg Then wk(n) = wk(n) + 1 Else flg = True n = n + 1 ReDim Preserve wk(n) wk(n) = wk(n) + 1 End If Else flg = False End If Next For i = 0 To UBound(wk) Cells(i + 10, j) = wk(i) Next Cells(15, j) = Application.Max(wk) Erase wk: n = -1 flg = False Next End Sub

emiberry
質問者

お礼

プロシージャの作成方法も含めて、数値の求め方はとても参考になりました。 ありがとうございました。

関連するQ&A