
EXCEL2010で複数(約14シート)からLARGE関数で金額の高い上位数名を表示させてます。
この金額のある行を表示させる為、何か良い方法がないでしょうか?
添付画像のように、1~10行目までに=LARGE(A:N!O5:O1048214,1) の式で1~10位迄
出しており、この10行分の項目を下に一覧で出したいのです。
現在は「すべてのシートを選択」し、「検索」で「*位の金額を入力」し、該当箇所に飛んだら
「シートを解除」し、行をコピペする、という作業を10回しています。

No.5ベストアンサー
- 回答日時:
続けてお邪魔します。
画像を拝見すると、「計」Sheetの16行目はなにもデータがないのですね?
今までのコードは16行目が項目行になっている前提のコードで、
A列最終行の1行下へ随時データを貼り付けるようにしていました。
A16セルにデータがないというコトなのでA2セルに表示されたと思います。
もう一度コードに手を加えてみました。
>Alt+F8から「実行」をする度にシートが増えていき・・・
途中でエラーになっているために作業用のSheetがどんどん増えてきているものと思われます。
現状の状態で不要なSheet見出し上で右クリック → 削除 → 注意画面が出ますが、無視してSheetを削除してください。
(不要なSheetをすべて削除します)
そうした上で今までのコードはすべて消去し、↓のコードにしてみてください。
Sub Sample3()
Dim i As Long, k As Long, lastRow As Long, myRow As Long, lastCol As Long
Dim str As String, c As Range, r As Range, wS As Worksheet
Application.ScreenUpdating = False
Set wS = Worksheets("計")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
'//↓★項目行より後のデータを消去
lastCol = wS.Cells(16, Columns.Count).End(xlToLeft).Column
If lastRow > 16 Then
Range(wS.Cells(17, "A"), wS.Cells(lastRow, lastCol)).ClearContents
End If
'//↑★
Worksheets.Add after:=Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Range("A1") = "ダミー"
For k = 1 To 14 '//「A」Sheet~「N」Sheetまで(Sheet見出しの一番左~14番目のSheetまで)
Set wS = Worksheets(k)
lastCol = wS.Cells(4, Columns.Count).End(xlToLeft).Column
lastRow = wS.Cells(Rows.Count, "O").End(xlUp).Row
If lastRow > 4 Then
With Range(wS.Cells(5, lastCol + 1), wS.Cells(lastRow, lastCol + 1))
.Formula = "=MID(CELL(""filename"",A1),FIND(""]"",CELL(""filename"",$A$1))+1,31)&""_""&O5"
.Value = .Value
End With
myRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
Range(wS.Cells(5, "O"), wS.Cells(lastRow, "O")).Copy
.Cells(myRow, "A").PasteSpecial Paste:=xlPasteValues
Range(wS.Cells(5, lastCol + 1), wS.Cells(lastRow, lastCol + 1)).Copy
.Cells(myRow, "B").PasteSpecial Paste:=xlPasteValues
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
With Range(.Cells(2, "C"), .Cells(lastRow, "C"))
.Formula = "=RANK(A2,A:A)"
.Value = .Value
End With
End If
.Range("A1").CurrentRegion.Sort key1:=.Range("C1"), order1:=xlAscending, Header:=xlYes
End If
Next k
.Range("A1").CurrentRegion.Sort key1:=.Range("A1"), order1:=xlDescending, Header:=xlYes
Set wS = Worksheets("計")
'//▼ココから
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row '//★
If .Cells(i, "C") > 10 Then Exit For
str = Left(.Cells(i, "B"), InStr(.Cells(i, "B"), "_") - 1)
Set c = Worksheets(str).Range("O:O").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Worksheets(str).Cells(c.Row, "A").Resize(, lastCol).Copy wS.Cells(i + 15, "A") '//17行目から★
Next i
For k = 1 To 14
Worksheets(k).Columns(lastCol + 1).Clear
Next k
'//▲ココまで
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub
※ 「計」Sheetの16行目(項目行)で最終列を取得していますので、
16行目は他のSheetと同じ項目名を同じ列数だけ入力しておいてください。
※ 今回は作業用のSheetの上位10位まですべてを「計」Sheetの17行目以降に表示するようにしてみました。
これではどうでしょうか?m(_ _)m
何度もご提案頂き、ありがとうございます。
が、やはり「400」エラー表示→OK→Sheet作成→a1にダミー文字
という状態になり、うまく動きませんでした。
残念ながら、ここで一度締め切ろうと思います。
長々とご協力頂きありがとうございました。
No.7
- 回答日時:
またまた顔を出します。
アップされている画像は小さすぎて詳細が判らないのですが、
>6行目にヘッダーにあたる部分があり、7行目から一覧を出しています。
すなわち各Sheetの6行目が項目行でデータは7行目以降にあるのですね?
最初の質問文の中に
>=LARGE(A:N!O5:O1048214,1) の式で・・・
とありましたので、勝手に4行目が項目行でデータは5行目以降にあるものだと判断してのコードでした。
↓のコードにしてみてください。
Sub Sample4()
Dim i As Long, k As Long, lastRow As Long, myRow As Long, lastCol As Long
Dim str As String, c As Range, r As Range, wS As Worksheet
Application.ScreenUpdating = False
Set wS = Worksheets("計")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
lastCol = wS.Cells(16, Columns.Count).End(xlToLeft).Column
If lastRow > 16 Then
Range(wS.Cells(17, "A"), wS.Cells(lastRow, lastCol)).ClearContents
End If
Worksheets.Add after:=Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Range("A1") = "ダミー"
For k = 1 To 14 '//「A」Sheet~「N」Sheetまで(Sheet見出しの一番左~14番目のSheetまで)
Set wS = Worksheets(k)
lastCol = wS.Cells(6, Columns.Count).End(xlToLeft).Column '←各Sheet6行目で最終列取得//★
lastRow = wS.Cells(Rows.Count, "O").End(xlUp).Row
If lastRow > 6 Then '//★
With Range(wS.Cells(7, lastCol + 1), wS.Cells(lastRow, lastCol + 1)) '//★
.Formula = "=MID(CELL(""filename"",A1),FIND(""]"",CELL(""filename"",$A$1))+1,31)&""_""&O5"
.Value = .Value
End With
myRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
Range(wS.Cells(7, "O"), wS.Cells(lastRow, "O")).Copy '//★
.Cells(myRow, "A").PasteSpecial Paste:=xlPasteValues
Range(wS.Cells(7, lastCol + 1), wS.Cells(lastRow, lastCol + 1)).Copy '//★
.Cells(myRow, "B").PasteSpecial Paste:=xlPasteValues
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
With Range(.Cells(2, "C"), .Cells(lastRow, "C"))
.Formula = "=RANK(A2,A:A)"
.Value = .Value
End With
End If
.Range("A1").CurrentRegion.Sort key1:=.Range("C1"), order1:=xlAscending, Header:=xlYes
End If
Next k
Set wS = Worksheets("計")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
If .Cells(i, "C") > 10 Then Exit For
str = Left(.Cells(i, "B"), InStr(.Cells(i, "B"), "_") - 1)
Set c = Worksheets(str).Range("O:O").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Worksheets(str).Cells(c.Row, "A").Resize(, lastCol).Copy wS.Cells(i + 15, "A")
Next i
For k = 1 To 3
Worksheets(k).Columns(lastCol + 1).Clear
Next k
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub
※ コード内の「★」の部分で行合わせしています。
(前回の「5」が「7」に変わっているヶ所が多々あると思います)
今度はどうでしょうか?m(_ _)m
No.6
- 回答日時:
何度もごめんなさい。
前回のコードで無意味な行がありました。
>Next k
の次の
>.Range("A1").CurrentRegion.Sort key1:=.Range("A1"), order1:=xlDescending, Header:=xlYes
の1行を消去してください。
どうも失礼しました。m(_ _)m
No.4
- 回答日時:
No.1・3です。
たびたびごめんなさい。
エラーの原因について、投稿後思ったのですが、
試し用の新しいBookで操作されていませんか?
各Sheet名を取得するため、ワークシート関数のCELL関数を使用しています。
これは名前付きファイルの場合のみ有効ですので、
どんな名前でも良いので、一旦ファイルを保存 → 新たに開きなおしてマクロを実行してみてください。
そうしないとSheet名の取得ができません。
これがエラーの直接の原因かどうか判りませんが、試してみてください。
※ 尚、前回のコードは「計」Sheetのランク(I列)一切無視してすべてのデータを並び替え、
上位10位を表示するようにするコードです。m(_ _)m
No.3
- 回答日時:
No.1です。
>「計シート」の2行目(16行目ではなく)に第1位の方の情報が反映されたのですが
どうも失礼しました。項目行を1行見間違えていました。
前回のコードは項目行が15行目になっているというコードですので、
今回は16行目が項目行でデータは17行目以降に表示させるコードにしてみました。
前回の修正部分はコード内の▼~▲になっています。
Sub Sample2()
Dim i As Long, k As Long, lastRow As Long, myRow As Long, lastCol As Long
Dim str As String, c As Range, r As Range, wS As Worksheet
Application.ScreenUpdating = False
Set wS = Worksheets("計")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
'//↓★項目行より後のデータを消去
lastCol = wS.Cells(16, Columns.Count).End(xlToLeft).Column
If lastRow > 16 Then
Range(wS.Cells(17, "A"), wS.Cells(lastRow, lastCol)).ClearContents
End If
'//↑★
Worksheets.Add after:=Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Range("A1") = "ダミー"
For k = 1 To 14 '//「A」Sheet~「N」Sheetまで(Sheet見出しの一番左~14番目のSheetまで)
Set wS = Worksheets(k)
lastCol = wS.Cells(4, Columns.Count).End(xlToLeft).Column
lastRow = wS.Cells(Rows.Count, "O").End(xlUp).Row
If lastRow > 4 Then
With Range(wS.Cells(5, lastCol + 1), wS.Cells(lastRow, lastCol + 1))
.Formula = "=MID(CELL(""filename"",A1),FIND(""]"",CELL(""filename"",$A$1))+1,31)&""_""&O5"
.Value = .Value
End With
myRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
Range(wS.Cells(5, "O"), wS.Cells(lastRow, "O")).Copy
.Cells(myRow, "A").PasteSpecial Paste:=xlPasteValues
Range(wS.Cells(5, lastCol + 1), wS.Cells(lastRow, lastCol + 1)).Copy
.Cells(myRow, "B").PasteSpecial Paste:=xlPasteValues
End If
Next k
.Range("A1").CurrentRegion.Sort key1:=.Range("A1"), order1:=xlDescending, Header:=xlYes
Set wS = Worksheets("計")
'//▼ココから
For i = 2 To 11 '//←「作業用Sheet」のSheetの上位10位まで(1行目が項目行のため)★
str = Left(.Cells(i, "B"), InStr(.Cells(i, "B"), "_") - 1)
Set c = Worksheets(str).Range("O:O").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Worksheets(str).Cells(c.Row, "A").Resize(, lastCol).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1)
Next i
For k = 1 To 14
Worksheets(k).Columns(lastCol + 1).Clear
Next k
'//▲ココまで
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub
※ 今度はどうでしょうか?m(_ _)m
No.2
- 回答日時:
>現在は「すべてのシートを選択」し、「検索」で「*位の金額を入力」し、該当箇所に飛んだら
>「シートを解除」し、行をコピペする、という作業を10回しています。
一案ですが
オートフィルターに、トップテンと云う機能があります(バージョンにもよります)
操作方法
1.データの範囲を選択して、オートフィルターを設定
2、金額の列で、数値フィルター=>トップテンをクリック
3、順位など指定してOK
4、上位トップテンが表示されますので、そのままコピー
5、表示したい部分へ貼り付け
6、フィルターは解除
上記の操作で可能だと思います。
一度、マクロの記録を実行すれば、次からはボタン操作だけで
可能になります。
回答ありがとうございます。
複数シートを選択してのオートフィルってできないですよね?
14シートあるので1シート毎にこの作業を行うなら、
今やっている作業とあまり変わらないのです。
質問の仕方がわかりづらく申し訳ありませんでした。
No.1
- 回答日時:
こんばんは!
VBAになりますが、一例です。
>1~10行目までに=LARGE(A:N!O5:O1048214,1) の式で1~10位迄
出しており・・・
というコトですが、同順位が懸念されます。
とりあえず同一Sheet内に同順位はなく、別Sheetで同順位があっても対応できるようにしてみました。
画像を拝見すると「計」Sheetの15行目が項目行になっていて、行がかなり飛んで表示されていますが、
16行目以降に表示するコードにしてみました。
Alt+F11キー → メニュー → 挿入 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)
Sub Sample1() '//この行から
Dim i As Long, k As Long, lastRow As Long, myRow As Long, lastCol As Long
Dim str As String, c As Range, r As Range, wS As Worksheet
Application.ScreenUpdating = False
Set wS = Worksheets("計")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
lastCol = wS.Cells(15, Columns.Count).End(xlToLeft).Column
If lastRow > 15 Then
Range(wS.Cells(16, "A"), wS.Cells(lastRow, lastCol)).ClearContents
End If
Worksheets.Add after:=Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Range("A1") = "ダミー"
For k = 1 To 14 '//「A」Sheet~「N」Sheetまで(Sheet見出しの一番左~14番目のSheetまで)
Set wS = Worksheets(k)
lastCol = wS.Cells(4, Columns.Count).End(xlToLeft).Column
lastRow = wS.Cells(Rows.Count, "O").End(xlUp).Row
If lastRow > 4 Then
With Range(wS.Cells(5, lastCol + 1), wS.Cells(lastRow, lastCol + 1))
.Formula = "=MID(CELL(""filename"",A1),FIND(""]"",CELL(""filename"",$A$1))+1,31)&""_""&O5"
.Value = .Value
End With
myRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
Range(wS.Cells(5, "O"), wS.Cells(lastRow, "O")).Copy
.Cells(myRow, "A").PasteSpecial Paste:=xlPasteValues
Range(wS.Cells(5, lastCol + 1), wS.Cells(lastRow, lastCol + 1)).Copy
.Cells(myRow, "B").PasteSpecial Paste:=xlPasteValues
End If
Next k
.Range("A1").CurrentRegion.Sort key1:=.Range("A1"), order1:=xlDescending, Header:=xlYes
Set wS = Worksheets("計")
For i = 1 To 10 '//←「計」SheetのI1~I10セル
Set c = .Range("A:A").Find(what:=wS.Cells(i, "I"), LookIn:=xlValues, lookat:=xlWhole)
str = Left(.Cells(c.Row, "B"), InStr(.Cells(c.Row, "B"), "_") - 1)
Set r = Worksheets(str).Columns(lastCol + 1). _
Find(what:=.Cells(c.Row, "B"), LookIn:=xlValues, lookat:=xlWhole)
Worksheets(str).Cells(r.Row, "A").EntireRow.Copy _
wS.Cells(Rows.Count, "A").End(xlUp).Offset(1)
Next i
wS.Columns(lastCol + 1).Clear
Application.DisplayAlerts = False
.Delete
Application.DisplayAlerts = True
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub '//この行まで
※ 一発で解決!とはいかないと思いますが、
とりあえずはこの程度で・・・m(_ _)m
回答ありがとうございます。マクロ実行したところ、
str = Left(.Cells(c.Row, "B"), InStr(.Cells(c.Row, "B"), "_") - 1)で、
実行時エラー'91' オブジェクト変数またはwithブロック変数が設定されていません
と出て、できませんでした。
後、「計シート」の2行目(16行目ではなく)に第1位の方の情報が
反映されたのですが、2位以下は表示されませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Excel(エクセル) Excelの複数ファイルの複数行を別ファイル1つのシートにVBA、マクロで集約する方法 5 2022/09/13 06:30
- Excel(エクセル) EXCEL マクロで 同じフォルダ内の複数ファイルの複数行全体を選択して1つのファイルに集約 4 2022/09/27 18:41
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Excel(エクセル) エクセルで割り振りをする方法 7 2022/08/02 14:02
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】エラー【#DIV/0!】が...
-
セルにぴったし写真を挿入
-
EXCELのVBAで複数のシートを追...
-
勤怠表について ABS、TEXT関数...
-
オートフィルターの絞込みをし...
-
エクセル画像(写真)挿入
-
【マクロ】【画像あり】関数が...
-
エクセルシートの見出しの文字...
-
【Officer360?Officer365?の...
-
Excelで4択問題を作成したい
-
エクセルの複雑なシフト表から...
-
空白のはずがSUBTOTAL関数でカ...
-
エクセル
-
グループごとの人数のカウント
-
グループごとの人数のカウント
-
エクセル GROUPBY関数について...
-
エクセルのリストについて
-
エクセルについて
-
グループごとの個数をカウント...
-
エクセルの関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
【マクロ】WEBシステムから保存...
-
エクセルの循環参照、?
-
エクセル ドロップダウンリスト...
-
エクセルのdatedif関数を使って...
-
特定のセルだけ結果がおかしい...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【エクセル】期限アラートについて
-
iPhoneのExcelアプリで、別のシ...
-
【関数】同じ関数なのに、エラ...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
【マクロ】宣言は、何のために...
-
VBA チェックボックスをオーバ...
-
Excelについての質問です 並べ...
-
【マクロ】アクティブセルの2...
-
【関数】不規則な文章から●●-●●...
おすすめ情報
先ほどNo.3で頂いたのを貼り付けてやってみたのですが、
今度は「sheet」ができて、「a1セル」に「ダミー」という言葉が入り、
エラー400 と出て終わってしまいました…。
EXCELは**データ 27.05.xlsmという名前で、sheet名は各支店番号「**」と
つけてあります。上書き保存する度に閉めて再度開いています。
Alt+F8から「ステップイン」を選ぶと1行目の「Sub Sample2()」が黄色くマーキング
されました。Alt+F8から「実行」をする度にシートが増えていき、
A1セルに「ダミー」と入っていきます。
うまく説明できずにすみません。画像を添付します。
ご連絡遅くなって申し訳ありませんでした。
ようやく時間が取れて、No.5&6で再試行してみました。が、やはり「400」と出て
エラーになってしまいました。
で、関係あるかどうかも分からないのですが、各シートのレイアウトが
影響しているのかも?と思って補足します。
添付画像0612左のように、各シートは1~4行目はシート内の合計値を算出させており、
5行目は空白、6行目にヘッダーにあたる部分があり、7行目から一覧を出しています。
計算式は添付画像0612右です。
13シート全てが上記と同じレイアウトになっており、
14シート目の「計」シートのM~Q列で串刺し計算をしたものを出し、
「計」シートのI列でLARGE関数で数値を出す、と設定してあります。
関係ありますでしょうか?
もしお時間がありましたら、あと少しお付き合い頂けると嬉しいです。
よろしくお願い致します。