
いつもお世話になっております。
先日、下記にて質問をさせて頂きましたが私の質問の仕方がわかりづらく
申し訳ございませんでした。
↓
https://oshiete.goo.ne.jp/qa/11124818.html
自分なりにいろいろと調べ、下記までたどり着いたのですが
このマクロを希望条件に変更する為の知識がなく、再度質問させて頂きました。
●シート1のB5からP61の範囲でO列をキーとして降順に並べ替えをしたい。
Sub SortTest()
Worksheets("sheet1").Activate
Worksheets("sheet1").Range("B5:P61") _
.Sort Key1:=Range("O5"), order1:=xlDescending
End Sub
上記のマクロを下記希望条件で並べ替えができるように変更したいです。
どのように修正すればよろしいでしょうか?
*希望条件
sheet1~sheet3の複数シートを対象とし
B5からO61のO列をキー、Q5~AE5のAD列をキー、AF5~AU5のAT列をキーとして降順に並べ替えをしたいです。
※対象列数は不規則です。
詳しい方、何卒ご教授願います。
A 回答 (9件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
No1,No2です
大分検証していただいた後のようなので、遅まきながら感はありますが・・・
Sortの方法の件ですが、最初のご質問文に挙げられているのはSortメソッド、No5のお礼に挙げられているのはSortオブジェクトを利用した方法になっていますね。
No1の回答は、元のご質問文に合わせて前者の回答になっていますが、ご質問文のコードであれば動作しているのですよね?
(MSDNのメソッドにもあるので、現状のExcelならほぼ使えるメソッドだと思いますが)
いろいろ試行なさっていると思いますが、エラー内容は毎回最初のエラー、
『並べ替えの参照が正しくありません。参照が並べ替えるデータ内にあることと[最優先されるキー]ボックスが空白でないことを確認してください。』
が、続いている状態なのでしょうか?
このエラーだと、キーを含め範囲指定がおかしいとしか思えませんが、単独で
Sub TEST()
Worksheets("Sheet1").Range("B5:P61").Sort _
Key1:=Worksheets("Sheet1").Range("O5"), order1:=xlDescending
End Sub
を実行してもエラーになりますか?
あるいはエラーはでないが降順にならない?
(シート名、セル範囲は実際に存在する内容にしてください)
どちらでもない場合は、コードの問題よりも最初にデータとして与えている、「シート名」及び「セル範囲の指定」におかしな内容が混ざっていないかを確認してみてください。
もしも上記のTEST()が実行できない場合は、基本的な構文が通じていない(?)という可能性がありますので、考え方を変える必要があるのかも知れません。
お世話になっております。
返信が遅くなり、申し訳ありません。
>Sortの方法の件ですが、最初のご質問文に挙げられているのはSortメソッド、No5のお礼に挙げられているのはSortオブジェクトを利用した方法になっていますね。
>No1の回答は、元のご質問文に合わせて前者の回答になっていますが、ご質問文のコード>であれば動作しているのですよね?
>(MSDNのメソッドにもあるので、現状のExcelならほぼ使えるメソッドだと思いますが)
>いろいろ試行なさっていると思いますが、エラー内容は毎回最初のエラー、
>『並べ替えの参照が正しくありません。参照が並べ替えるデータ内にあることと[最優先されるキー]ボックスが空白でないことを確認してください。』
>が、続いている状態なのでしょうか?
→動作はしております。
[最優先されるキー]~のエラーは出ておりませんが、並び替えが降順にならずバラバラな並び順になってしまいます。
>このエラーだと、キーを含め範囲指定がおかしいとしか思えませんが、単独で
>Sub TEST()
>Worksheets("Sheet1").Range("B5:P61").Sort _
>Key1:=Worksheets("Sheet1").Range("O5"), order1:=xlDescending
>End Sub
>を実行してもエラーになりますか?
>あるいはエラーはでないが降順にならない?
>(シート名、セル範囲は実際に存在する内容にしてください)
→上記単独のマクロであれば、降順に正しく並び替えられます。
それを複数シート、複数列を選択して一括で並び替えするにはどうすればよいでしょうか?
何度も申し訳ございませんが、ご教授頂けますと幸いです。
No.7
- 回答日時:
No.6です。
>シートですが、まとまっています。
>どのように修正すれば良いか…。
まず『ブック全てのシートが対象』ではなく『ある部分にまとまっているシートのみが対象』と考えた場合、その『ある部分』がどこなのかが重要ですね。
シートインデックスNoは一番左を 1 として右にカウントしていきます。
なので、
・1~〇
・△~最後のシート
・□~◇(途中の任意のシートNo.)
によってループさせる範囲が変わりますから、その情報は必要です。
ただ私の方では古い手段で書ける部分は何とかいけるかもですが、SORTオブジェクトについては作成・検証ができませんしね。
あとは並び替えようとしている範囲においてまだデータが存在してないシートもあるのでは?
その判定をどこでとるのか、それとも年度末(データ入力が全て完了した後)に実行予定なのでしょうか?
確かに一気に並べ替える訳ですから毎月等でやる必要はないでしょうけど、年度途中での纏めなどしないのかな?って。
お世話になっております。
返信が遅くなり、申し訳ありまえせん。
親身にご教授頂きましてありがとうございます。
条件等、再度見直してみたいと思います。
よろしくお願いいたします。
No.6
- 回答日時:
No.5です。
No.4に記載しておけば良かったですね。
マクロの自動記録で出来上がったマクロを実行させたらどうなるかと言う検証はされてましたかね。
仮にそちらで問題なければSORTメソッドではなく新しいSORTオブジェクトで作成した方が良いのかもですけど、
私の所持しているバージョンでは検証が出来ないのですよ。
理由は掴めないままではありますが。
あと別の確認ですが並び替えるシートはそのブック内の全てのシートですか?
それとも左から何枚目まで(1~20:実際のシート数は25でも)とか、後ろの何枚とか纏まってはいませんか?
もし纏まっているならシート名を指定せずインデックスNoを使ったループで出来るのですが。。。
こんばんは。
マクロの自動記録度は問題ありませんでした。
シートですが、まとまっています。
>インデックスNo.を使ったループ
→知識不足で申し訳ありません。
どのように修正すれば良いか…。
何度も申し訳ありません。
No.5
- 回答日時:
No.4です。
No.3のお礼についてです
こちらは自作PCでMicrosoftOfficeの新しいのは随分と購入してないんですよね。(主にvisualstudioなどの言語勉強とネットが目的なので)
昔やってた事から回答をしてはみましたが、最近の物がどう変わっているのかもわからないです。
ググると2007以降でSORTメソッドからSORTオブジェクトになってるみたいですし、うちに放置されているのは2003までですから実際に検証とかは無理かな。
>O列の数字の降順に並べ替えができません。。。
では昇順に並び変わるの?
それともデタラメになるの?
まず最初の範囲を手作業で並び替えたらどうなるのか?
同じように変になるのか、逆にちゃんと並び変わるのか?
ちゃんと並ぶなら
『マクロの自動記録』(名称変わっている?)
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub0 …
を使ってどのような作業コードが出来ているか?
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub0 …
で最近のバージョンをお持ちの方ならわかるかも。
もしデタラメであるなら前回の質問では数値にカンマが入ってましたけど、あれ自体はセルの書式設定と思ってますが当たってますか?
お世話になっております。
お忙しいところ何度もお手数をおかけして申し訳ございません。
>では昇順に並び変わるの?
>それともデタラメになるの?
→デタラメになります。
>まず最初の範囲を手作業で並び替えたらどうなるのか?
>同じように変になるのか、逆にちゃんと並び変わるのか?
→B5~O63選択し、「データ」→列 最優先されるキー「O列」→大きい順では降順に並べ変えられます。
>ちゃんと並ぶなら
>『マクロの自動記録』(名称変わっている?)
>http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub0 …
>を使ってどのような作業コードが出来ているか?~
※以下、省略いたします。
→記録したものが下記となります。
Sub Macro1()
Macro1 Macro
Range("B5:O63").Select
ActiveWorkbook.Worksheets("sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("sheet1").Sort.SortFields.Add2 Key:=Range _
("O5:O63"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("sheet1").Sort
.SetRange Range("B5:O63")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
>もしデタラメであるなら前回の質問では数値にカンマが入ってましたけど、あれ自体はセルの書式設定と思ってますが当たってますか?
→仰る通りはい、数字のカンマは書式設定です。
No.4
- 回答日時:
No.3です。
補足について回答します。
コードについては作成していないので推測での回答にもなりかねませんが、
>cellRange = Array("B5:P61,O61")
並べ替える基準セルって
>➁B5:P61,O5
セルO5ではないでしょうか?
なので、
cellRange = Array("B5:P61,O5")
このようになると思いますよ。
と言うよりも最初からこの部分はこうなっているのですよね?
>Q5:AE5,AD5、AF5:AU5,AT5
を Q5:AEx,AD5 AF5:AUy,AT5
xやyはその範囲での最終行に書き換えてください。(或いは全てのグループが同じ最終行になるのですかね?)
こんにちわ。
ご返信が遅れてしまい、申し訳ありません。
>>並べ替える基準セルって
>>➁B5:P61,O5
>セルO5ではないでしょうか?
>なので、
>>cellRange = Array("B5:P61,O5")
>このようになると思いますよ。
>と言うよりも最初からこの部分はこうなっているのですよね?
→仰る通り、そのようになっております。
ですが、それで検証してもO列の数字の降順に並べ替えができません。。。
他に何か原因がかんがえられますでしょうか?
本来、高木さんWIN様にお尋ねすることではないかと存じますが
もし何かアドバイスございましたらご教授頂けますと幸いです。
No.3
- 回答日時:
横入りをお許しください。
補足にあるセル範囲について実際のシートと見比べて頂ければわかるかもですが、
>➁B5:P61,O5、Q5:AE5,AD5、AF5:AU5,AT5、~
最初の並べ替えの範囲は5行目から61行目なのに対し、それ以降列は複数の範囲になってますがそもそも5行目だけしか指定していません。
推測ですけど並べ替えたいデータ範囲毎に最終行を取得する必要があるのではないでしょうか?
確かにそれとエラー内容とが一致するかは検証しきれてはいませんが、少なくとも1行を並べ替えるって点が気になるものでしたので。
試しに3グループ程実際のデータ最終行で指定し検証されてみるとか如何でしょう。
はじめまして。
ご指摘頂きましてありがとうございます。
>>➁B5:P61,O5、Q5:AE5,AD5、AF5:AU5,AT5、~
→ご指摘の通りですね。初歩的な間違い、大変失礼いたしました。
一度その部分を修正し、再度検証してみたいと思います。
No.2
- 回答日時:
No1です
>下記、エラーが出てしまいました。
>実行時エラー’1004’
>並べ替えの参照が正しくありません。参照が並べ替えるデータ内にあるこ>とと[最優先されるキー]ボックスが空白でないことを確認してください。
意味は、メッセージの通りでしょうから、
・指定したキーとする列が、指定範囲の外にある
・指定したキー列の値が空白である
などに該当するような、不合理な設定をなさっているものと推測されます。
データが空白である可能性が存在するなどであるなら、並べ替え前に、可能な範囲でチェックを行うようにしておく方が良いかも知れませんね。
補足で挙げられている②のデータは、最初のひとつ以外は意味をなしていませんけれど・・・???
何度もご教授頂きましてありがとうございます。
エラーについては再度、確認してみます。
>データが空白である可能性が存在するなどであるなら、並べ替え前に、可能な範囲でチェックを行うようにしておく方が良いかも知れませんね。
→アドバイス頂きましてありがとうございます。
>補足で挙げられている②のデータは、最初のひとつ以外は意味をなしていませんけれど・・・???
→「B5:P61,O5」のみ有効ということでしょうか?
>sheet1~sheet3の複数シートを対象とし
>B5からP61のO列をキー、Q5~AE5のAD列をキー、AF5~AU5のAT列をキーとして降順>に並べ替えをしたいです。
→私の説明不足で申し訳ありません。
上記質問で、出したい結果が下記としたいのです。
B5からP61のO列をキーで並べ替え(O列が数量の達成額なのでその降順並べ替え)
Q5~AE5のAD列をキーで並べ替え(AD列が売上の達成額なのでその降順で並べ替え)
AF5~AU5のAT列をキーで並べ替え(AT列が粗利の達成額なのでその降順で並べ替え)
なので、それぞれで並べ替えが必要になってきます。
こういった条件では並び替えは難しいでしょうか?
知識不足で申し訳ございません。
No.1
- 回答日時:
こんにちは
何となく規則性がありそうだけれど、はっきりとはしないので、配列に定義しておいて、それを参照しながらループする方法での例です。
また、ご質問文中の
>Q5~AE5のAD列をキー、AF5~AU5のAT列をキー
部分は、間違えだとは思いますが、ひとまずそのままにしてあります。
Sub Sample()
Dim shts, cellRange
Dim sh As Long, rg As Long, ary
shts = Array("Sheet1", "Sheet2", "Sheet3")
cellRange = Array("B5:O61,O5", "Q5:AE5,AD5", "AF5:AU5,AT5")
For sh = LBound(shts) To UBound(shts)
For rg = LBound(cellRange) To UBound(cellRange)
ary = Split(cellRange(rg), ",")
Worksheets(shts(sh)).Range(ary(0)).Sort _
Key1:=Worksheets(shts(sh)).Range(ary(1)), order1:=xlDescending
Next rg
Next sh
End Sub
こんにちわ。
今回もご教授頂きましてありがとうございます。
>>Q5~AE5のAD列をキー、AF5~AU5のAT列をキー
>部分は、間違えだとは思いますが、ひとまずそのままにしてあります。
→大変失礼いたしました。
本来、対象範囲の1列前をキーとしたい為、「B5からO61のO列をキー」が誤っており
正しくは「B5からP61のO列をキー」となります。
記載間違い、ご指摘頂きましてありがとうございます。
ただ、その条件ではない対象範囲(対象列数が不規則な為)もある為
ご教授頂きましたマクロを私の環境に当てはめて、修正しました。
そのマクロで実行しましたところ下記、エラーが出てしまいました。
実行時エラー’1004’
並べ替えの参照が正しくありません。参照が並べ替えるデータ内にあることと[最優先されるキー]ボックスが空白でないことを確認してください。
文字数制限がある為、修正しましたモジュールは補足に記載させて頂きます。
恐れ入りますが、再度ご教授頂けますと幸いです。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Excelでの並べ替えを全シートまとめて処理したい
Excel(エクセル)
-
【マクロ】複数シートのデータを自動で並び替えしたい
Excel(エクセル)
-
マクロで並べ替えを複数のシートそれぞれに行う方法を教えてください
Excel(エクセル)
-
-
4
マクロを複数シートに実行するには?
Excel(エクセル)
-
5
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
6
特定のセルに数値が入っているシートのみ印刷する方法
Excel(エクセル)
-
7
【VBA】指定した検索条件に一致したら別シートに転記したい
Visual Basic(VBA)
-
8
エクセルのマクロで条件一致のデータを別シート(複数)に転記したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
indirect 関数を使った複数シー...
-
Excelにて、ユーザーフォームで...
-
【再質問】【マクロ】複数シー...
-
【Excel VBA】Worksheets().Act...
-
エクセルで円グラフに引き出し...
-
Excelで、空白を表示したい
-
エクセルで、時間 0:00を表示...
-
エクセルの主軸と第2軸の0を合...
-
DATEDIFでマイナス表示をさせたい
-
ピボットテーブルでは時間の表...
-
エクセルで文字が白くなる
-
エクセルで文字を含む式に、カ...
-
エクセル条件付書式で指定の時...
-
excelグラフでデータテーブルを...
-
ユーザーフォームに入力したデ...
-
エクセルのマクロで条件一致の...
-
エクセルで長い行を5行ごとに1...
-
アクセスで#エラーを表示させ...
-
excelのマクロで該当処理できな...
-
エクセルで上付き,下付き文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelにて、ユーザーフォームで...
-
indirect 関数を使った複数シー...
-
Excel、複数シート同セルを別シ...
-
Excelで複数シートの特定カラム...
-
コピーペーストのマクロについ...
-
エクセルで条件に一致した別の...
-
【再質問】【マクロ】複数シー...
-
エクセル 不特定数シートのく...
-
Excelの操作方法
-
Openoffice calc で複雑な入力...
-
複数のシートや複数のブックの検索
-
別シートに毎回異なるデータを...
-
エクセル VBA ユーザフォーム ...
-
エクセルで円グラフに引き出し...
-
エクセルの主軸と第2軸の0を合...
-
エクセルで文字が白くなる
-
エクセルで文字を含む式に、カ...
-
Excelで、空白を表示したい
-
エクセルで、時間 0:00を表示...
-
エクセルで長い行を5行ごとに1...
おすすめ情報
シートと参照先を増やしてしまったことが原因でしょうか?
下記にて修正したモジュールを記載いたします。
↓
ご教授頂きましたモジュール
①shts = Array~以降
➁cellRange = Array~以降
①2018.10月~2019.9月、第一四半期、第二四半期、第三四半期、第四四半期、上四半期、下四半期、年間
➁B5:P61,O5、Q5:AE5,AD5、AF5:AU5,AT5、AV5:BJ5,BI5、BK5:BZ5,BY5、CA5:CO5,CN5
CP5:DE5,DO5、DF5:DM5,DM5、DN5:EC5,EB5、ED5:ES5,ER5、ET5:FI5,FH5
FJ5:FY5,FX5、FZ5:GO5,GN5、GP5:HD5,HC5"、HE5:HT5,HS5、AF5:AU5,AT5
知識不足で申し訳ございませんが
何卒、ご教授願います。
ご教授頂きましてありがとうございました。
ご教授頂きました内容ですが、私の解釈が間違っていたら申し訳ありません。
下記に修正という認識でしたが、修正マクロを実行したのですが
並び順がとびとびになってしまい、降順で並べ替えになりませんでした。。。
何が原因でしょうか?
★修正後マクロ
cellRange = Array("B5:P61,O61")
何度も申し訳ございませんが、何卒ご教授願います。