VBAで最大値と最大値までのデータ数を教えてください

このQ&Aのポイント
  • VBAを使って、A列の最大値と最大値までのデータ数を求める方法がわかりません。
  • A列にはデータが並んでおり、A列の最大値をC列に入力することはできました。
  • しかし、最大値がどの行に位置するかを求める方法が分かりません。E列にその行の番号を表示したいです。
回答を見る
  • ベストアンサー

VBAにて最大値と最大値までのデータの数を教えて

はじめまして。VBA初心者です。 誰か教えてください。 下記のようにA列にデータが並んでおります。 A列はどこまでデータがあるかは、分かりません。 その中で、  何とか独自でC列の1行目に、A列の最大値を記入する事まではできました。 しかし、A列の最大値が数字が入力されているA列の1行目から何番目にその 最大値がくるのかの計算が分かりません。   E列の1行目にその何番目にくるかをしめしたいのですが、 C列の1行目で示すように最大値の値をA列で何番目になるのかの方法を教えてください。 Rangeを使用して、Range("A1:最大値")を選択して、countするとよいのではと思い、 挑戦していましたが、"最大値"の部分をどのように表記していいかわかりません。  どなかた分かる方がいらっしゃいましたらよろしくお願いします。       A列    B列    C列   D列   E列 1行    3    最大値   10   個数    4 2行    5 3行    7 4行   10 5行    9 6行    2 …     … …     …

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

  • ベストアンサー
  • soixante
  • ベストアンサー率32% (401/1246)
回答No.1

何も難しく考えずに Max関数とMatch関数を使えばいいのでは? Sub aaa() Dim Rng As Range, Wsf As Object Set Wsf = Application.WorksheetFunction Set Rng = Range(Cells(1, 1), Cells(1, 1).End(xlDown)) Cells(1, 3).Value = Wsf.Max(Rng) Cells(1, 5).Value = Wsf.Match(Wsf.Max(Rng), Rng, 0) Set Rng = Nothing Set Wsf = Nothing End Sub

chi-pan-kun
質問者

お礼

ご返答ありがとうございます。早速やってみましたが、すぐにできました。 初心者なもので2~3時間悩んでおりましたが、一瞬にして解決しました。ありがとうございます。 関数をうまく使用するとよいですね。 いろいろな参考書なども参考にしていますがifの条件分岐を使用して最大値を算出しており、これらを参考にしましたが、教えて頂いた内容が大変シンプルで分かりやすかったです。 記載して頂いた内容の最後の分の Set Rng = Nothing Set Wsf = Nothing はどのような意味があるのですか?? 初心者な質問ですみません。

その他の回答 (1)

  • soixante
  • ベストアンサー率32% (401/1246)
回答No.2

#1です。 オブジェクト型変数を使い終わったら開放しておくのが、メモリ上も効率が良いと 何かの本で習いました。 以下ご参照ください。 http://www.moug.net/tech/exvba/0150027.html

chi-pan-kun
質問者

お礼

 ご丁寧にありがとうございました。大変参考になりました。 特に長いVBAプログラムを作成するさいなどは、適宜Nothingを使用する必要性がありそうですね。  また、変数と宣言Setステートメントついても、うまく理解できていない部分がありましたので、ありがとうございます。  ご参照くださいました変数やSetを使用して、上述の質問内容の最大値とその最大値の個数の部分を、 以前は、C列とE列に代入していましたが 違うフォルダの違うExcelシートの特定部分に代入したいのですが…       A列    B列    C列    D列   E列 1行    3    最大値   10   個数    4 2行    5 3行    7 4行   10 5行    9 6行    2 …     … …     …  ご示し頂きました内容を抜粋すると、たぶん※印の部分の代入場所を変更するとよいと思うのですが、その前後も変更すべき点があると思いまして… Sub aaa() Dim Rng As Range, Wsf As Object Set Wsf = Application.WorksheetFunction Set Rng = Range(Cells(1, 1), Cells(1, 1).End(xlDown)) ※Cells(1, 3).Value = Wsf.Max(Rng) ※Cells(1, 5).Value = Wsf.Match(Wsf.Max(Rng), Rng, 0) Set Rng = Nothing Set Wsf = Nothing End Sub 度々で申し訳ありません。よろしくお願い致します。

関連するQ&A

  • 条件にあてはまるデータの数をカウントするエクセルVBA

    下記のようにA列に1~3のコードがありB~E列には測定値があります。 B列以降の測定値のカウント(+3の個数、+2の個数…)を列ごとにVBAでカウントしてます。 A列に関係なくカウントするコードは記述して実行できましたが A列の条件が1の時だけカウントするVBAが良くわかりません。 シート A    B    C  ・・・E 1    -1   +1  ・・・ 1    +2   0 2     0   0 3    -3   0 1    -1   +3 101行目以降 +3    カウント数 … +2      〃 +1      〃 0       〃 -1      〃 -2      〃 -3      〃   A列に関係なくカウントするコード sub カウント() Dim 行 As Long Dim 列 As Long For 列 = 2 To 5 For 行 = 101 To 107 Cells(行, 列).Value = Application.WorksheetFunction.CountIf(Range(Cells(2, 列), Cells(100, 列)), Cells(行, 1)) Next 行 Next 列 End Sub

  • VBAについて

    はじめまして、以下のVBAについて質問させてください。 A列にデータの個数だけ連番を振りたくて、以下のVBAを入力しました。 連番を振るシートは複数あり、そのシートによってデータの個数は異なります。 しかし、以下のVBAだと最初のシートの個数に応じて、後のシートの連番も振られてしまいます。データの個数に応じてシートごとに連番を振るには、どうすればよいのでしょうか…?!どうか迷える子羊をお助け下さい(T_T) '一番はじめのシートを選択 Sheet "一番".Select 'A列に連番を振る Dim sh As Variant For sh = 3 To Worksheets.Count Dim number As Integer Dim 行2 As Long number = 1 '2行目~最終行までループ For 行2 = 3 To Cells(Rows.Count, 2).End(xlUp).Row Worksheets(sh).Cells(行2, 1) = number number = number + 1 Next 行2 Next sh

  • エクセルVBAで月別最大値を取得したい

    いつもお世話になっております。 要件がエクセルVBAで・・という事で困っています。エクセルの2010を使用しています。 今、添付画像のように、A列に日付、B列に金額が入っており、D列に月表示、E列に各月の金額MAXを入れたいのですが、どのように記述したら良いかわかりません。 調べてみたところ、月の切り替わりに空白が挿入されていれば、下記ソースで月毎のMAXが 抜けることが分かりました(D、E列への転記はわかりませんでしたが・・)。 Sub test1() Dim Rng As Range Dim c As Range Set Rng = Range(Range("B1"), Cells(Rows.Count, Range("B1").Column).End(xlUp))_ .SpecialCells(xlCellTypeConstants) For Each c In Rng.Areas c(c.Count).Offset(1).Value = WorksheetFunction.Max(c) Next End Sub データを抜きたいファイルおよび、シートが大量にあり、とりあえずsheet(1)だけでも 何とかしたいのですが、方法がわかりません。Accessならば集計クエリでグループ化、 最大値を抽出してやればいいのですが。 ご教示いただけますでしょうか。 宜しくお願い致します。

  • Excel VBAの繰り返し構文について

    A列に日付、B列に曜日、C列に休、D列に1直、E列に2直、という形の年間シフトを作成しています。 初期値としてA2セルに数字を入力→C列が空白の時だけD列に記入するマクロを作成したと思っています。 現在仮として、 Sub C列のセルが空白の行のD列に数値を入力() 下端行 = Range("A" & Rows.Count).End(xlUp).Row '下端検出 For 行 = 3 To 下端行 '1行目から下端行まで1行ずつ繰り返す If Range("C" & 行).Value = "" Then 'その行のC列のセルの値が空白の時 Range("A2").Copy 'A2をコピーする Range("D" & 行).PasteSpecial Paste:=xlPasteFormulas 'その行のA列のセルを起点に 'して数式を貼り付ける End If Next End Sub というマクロを置いていますが、「Range("A2").Copy」の部分を 「A2を初期値として、最初にC列が空白でなくなる時まで初期値を繰り返し、次にC列が空白になった場合は初期値+1の数をD列に入力する。 ただし初期値+1の最大数は6までとする(要するに1~6の繰り返しです)」 という感じに変更したいのですが、どうすればいいのかさっぱりです…。 VBAレベルはこの質問をする程度なのでかなり初級です。

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).~」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

  • エクセルVBAのヒントをください

    エクセルのある列に、文字列が入っているとします。 たとえば、Aであったり、Cであったり、A,C,Fとカンマ区切りで複数の文字列(個数は不定) が入っていたりします。 このとき、一行に一つの文字列しか含まないように、カンマで区切られた文字列を展開し、 複数行に分けて格納したいと思っています。 たとえば、一番上の行のセルにA、二番目の行に「C,D,A」、三番目の行にB、四番目の行に 「E,A」と入っていたら、各行に一文字列のみ入るように、上からA、C、D、A、B、E、Aという行を 作りたいと思います。各セルに含まれる文字列の個数は不定で、規則性はありません。 基本的に、 (1)各セルに含まれているカンマの数を調べる (2)カンマの数だけ次の処理を繰り返す  ・行挿入   ・最初のカンマの位置を調べる   ・先頭からカンマまでを切り取る   ・上記の値をセルに入力  ・行挿入   ・2番目のカンマの位置を調べる   ・1番目のカンマの位置+1から2番目のカンマの位置まで切り取る   ・上記の値をセルに入力 上記をカンマの数だけ繰り返す。 といった具合にしていくのだと思いますが、このような処理をするのに はどの程度のVBAのスキルが必要ですか? 上記のヒントや、参考になるサイト、書籍があればご教授ください。

  • 重複データのカウント

    VBAで進められなくて困っております。お知恵をお借りしたくよろしくお願い致します。 Excel2003使用 C列に入っている数字がどれくらいC列にあるか数えて、結果をD列に反映したいのですがうまくいかず困っております。 結果前 A列 B列 C列 11  105  11105 11  108  11108 11  108  11108 12  153  12153 12  161  12161 結果イメージ A列  B列  C列  D列 11  105  11105  1 11  108  11108  2 11  108  11108  2 12  153  12153  1 12  161  12161  1 ※作業を行っているシートは都合によりSheet2になっております。   1行目は項目が入っている為、データは2行目からです。 With Sheets("Sheet2") .Range("C2",.Range("C"&.Rows.Count).End(xlUp)).Offset(,2).Formula=_ "=IF(OR(D2="""",COUNTIF(Sheet2!C:C,D2)=0,""""))" End With データの数量は5000件以上、場合によっては1万以上になります。 以上、宜しくお願いたします。

  • VBAの修正を助けてください

    下記のコードはC列の日付別、Z列数字の1、をA列のデータ別でBW列カウントするものなのですが、 一つ条件を追加してF列が数字の1~6の場合のA列のデータ別でカウントしたいのです。 F列が数字の1の場合は1のカウントを表示、2の場合は2のカウント表示、それぞれの数字に応じてのカウント回数を出力したいのですが、お詳しい方法を教えてください。よろしくお願いします。 Sub カウント() Dim dic As Object Dim lastRow As Long Dim r As Long Dim key As String Set dic = CreateObject("Scripting.Dictionary") 'Dictionaryオブジェクト lastRow = Range("A" & Rows.Count).End(xlUp).Row 'A列最終行 'データ収集 For r = 2 To lastRow '2行目から最終行まで If (DateValue(Cells(r, "C").Value) >= DateValue("2010/6/01")) And (DateValue(Cells(r, "C").Value) <= DateValue("2010/4/01")) Then key = Range("A" & r).Value & Chr(0) & Range("Z" & r).Value 'キー値はA列注目行の値+Z列注目行の値(間にchr(0)) If Not dic.exists(key) Then 'キー値が無ければ dic.Add key, 1 'キーを追加して、値(個数)を1に Else '既にキー値があれば dic(key) = dic(key) + 1 'そのキーの値(個数)+1 End If End If Next For r = 2 To lastRow '2行目から最終行まで key = Range("A" & r).Value & Chr(0) & "1" '探す値はA列注目行の値+"1"(間にchr(0)) Range("BW" & r).Value = dic(key) 'BW列にその値(個数)を表示 Next End Sub

  • エクセルVBAについて教えてください。

    DSUMを使ってVBAで自動計算をさせたいのですがうまくいきません。  ・Sheetsデータにデータを置いていて、A1からU1610までデータが入ってます。  ・Sheets集計用は計算させるための(条件を入れる)シートで、A1からE列まで(選択する項目によって何行目になるかわかりません。)  ・mycountでE列のデータが入ってる行を出してます。  ・部屋タイプで1K~1LDKを選ぶとDSUMの式のタイプに1を入れたいのです。(1K~1LDKの場合はCells(1,3) 下記のように書いてみましたが上手くいきません。 どなたかご教授いただけると助かります。 mycount = "=COUNT(集計用!E2:E300)" Sheets("集計用").Cells(5, 7).Value = Range("g10") = " =DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" '部屋タイプの選択 If Sheets("フォーム").Range("c30") = "1K~1LDK" then  タイプ = 3 ElseIf Sheets("フォーム").Range("c30") = "2K~2LDK" Then タイプ = 6 ElseIf Sheets("フォーム").Range("c30") = "3K~3LDK" Then  タイプ = 9 ElseIf Sheets("フォーム").Range("c30") = "4K~4LDK" Then タイプ = 12 Else Sheets("フォーム").Range("c30") = "その他" Then タイプ = 15 End If

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

    A~Fの各列ごとに、121以上の数字が連続する個数を出力し、出力したデータの最大値を求めたいのですが、どうやって式を組んだらいいか、わかりません。 アドバイスいただけましたら幸いです。 A / B / C / D / E / F 118.19 / 118.11 / 118.22 / 118.20 / 118.20 / 118.74 120.93 / 120.86 / 120.96 / 120.92 / 120.92 / 121.44 123.45 / 123.35 / 123.45 / 123.43 / 123.43 / 123.88 120.97 / 121.04 / 120.94 / 121.00 / 120.97 / 120.93 118.57 / 119.48 / 118.69 / 121.52 / 118.48 / 119.69 123.48 / 123.35 / 123.44 / 123.43 / 123.41 / 123.61 123.59 / 120.47 / 123.58 / 123.57 / 123.57 / 123.74 連続する個数 1コ / 2コ / 1コ / 5コ / 1コ / 2コ 2コ / 1コ / 2コ / - / 2コ / 2コ 最大値 2コ /2コ /2コ /5コ /2コ /2コ