質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

11374閲覧

VBAでのデータのソート(最終行の取得なども含めて)

Z-TALBO

総合スコア525

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/04/28 06:04

編集2016/04/28 08:34

###やりたいこと
並び替えボタンを設置して、データを入力後ボタンを押すと並び替えをしてくれるようにする。
データに関しては、H列~R列までが一行のデータになってます。
一番最初にデータが入るのはH11からです。
H列には名前が入る予定ですので、その名前でソートがかけれればOKです。

###一応試してみたこと

VBA

1Range("H10").Select // H10は見出しです 2ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear 3ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ 4 ("H10:H16"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal // とりあえずデータをH11~H16までテストで入れているとしています 5With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort 6 .Header = xlYes 7 .MatchCase = False 8 .Orientation = xlTopToBottom 9 .SortMethod = xlPinYin 10 .Apply 11End With

なんかこんな感じで、できたのはできました。

###質問
現在のコードだと、sheet1しか適用されてないと思うので、
「現在、アクティブになっているシート」として適用したい。

現在のコードではデータが入っている部分だけになっていますが、
「データの最終行(間に空白無し)までを範囲としてソート」として適用したいと思います。

上記コードでたぶんここを替えるんだろうとは思ったのですが、その辺りが少し理解していないので、よろしくお願いできますか?


【追記】
一応動作しました。どこかがおかしくなっているのかもしれませんが、とりあえずやりたい動きをしています。

VBA

1// ActiveSheetに関して 2// 回答の前にとりあえず、、、 3Activeworkbook.Activesheet.AutoFilter.Sort.SortFields.Clear 4// 書いてる間に回答があったので、、、 5Const topleft = "H11" 6With Activesheet 7 .Range(topleft & ":R" & .Range(topleft).End(xlDown).Row).Sort key1:=Range(topleft) 8End With

で、とりあえず動作しましたが、なんかちょっとしたエラー?で
.Orientation = xlTopToBottom
が、なんかありません?みたいのが出てて消したら特に問題もなかったです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問文にあるソースを見て思ったのが、開始ボタンがあるファイルとデータが同じはないでしょうか?
違ったら回答がまるで意味をなさないので申し訳ないのですが、開始ボタンとデータが同じファイル内だとしたらボタンを押した時点でアクティブシートは開始ボタンがあるシートになってしまうのではないかと思ったのでちょっと気になった次第です。ふざけた質問だと思ったらすみません。

万が一開始ボタンとデータが同じファイルの場合は、例えばどこかのセルにシート名を入力するのでもよいし、アクティブにしたいシート名を書かせるダイアログを表示してもいいと思います。いずれにしても
①シート名を変数に格納
②シートが存在するか確認 のあとに、

ActiveWorkbook.Worksheets(シート名が格納された変数).AutoFilter.Sort.SortFields.Clear

とかで、質問文にありましたコードの"Sheet1"のところを変数に変えるだけでいけるのかなと思いました。
(すみません、動作確認はしてないです)

杞憂でしたらすみません。
開始ボタンとデータが格納されているファイルが別であるならば、ttyp03さんのご回答でできるのではないかと思います。

投稿2016/04/28 07:31

SASAHARA

総合スコア247

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/04/28 08:04

回答ありがとうございます! ふざけた質問だなんてとんでもないです!こちらこそ、質問が猥雑で申し訳ありませんでした! ご指摘の通り、例えばSheet1の上の方にボタンがあり、その下に表があるという感じです。 とりあえず下記のttpy03様のコードを書いてみたら、動作いたしました。 activesheetの部分ですが、もしかして、ただ単にActivesheetにすればよかったりしてますかね?
SASAHARA

2016/04/28 08:45

すみません、てっきり「今回は同ファイル内に開始ボタンもデータで作成したけど、今度は別シート(いずれ別ファイル)にしたい」と思っての質問だと思って回答しておりました・・・なのでActiveSheetにこだわらなくてもよいのでは?というとんちんかんな回答になっております。私の方がActiveSheetにこだわりすぎでした。  今後も今と変わらずSheet1にボタンもデータもおいて、並び替えたいデータは毎回書き換えるというのでしたらttyp03さんのご回答で全く問題ないかと思います。短くスマートにまとめられていてとても参考になるコードです(それでいてスピーディーな回答!)  というか、むしろActivesheet云々ではなく、 >「データの最終行(間に空白無し)までを範囲としてソート」 こちらが本題だった感じでしたかね!すみません、読み取れなくて・・・変な回答をしてしまい申し訳ないです。 頂きましたご質問の >activesheetの部分ですが、もしかして、ただ単にActivesheetにすればよかったりしてますかね? こちらにつきましては、開始ボタンがある箇所をactivesheet前提ならば、ActivesheetもしくはMeでもいけたかと思います。 ただしMeは標準モジュールでは使えませんのでちょっとだけ注意が必要ですね。
Z-TALBO

2016/04/28 09:19

いえいえ、こちらこそ複雑に考えすぎていたのかもしれません! まだVBAでの質問をしたいと思いますので、機会があればお知恵を拝借させてください。
guest

0

ベストアンサー

こんな感じでしょうか?

VB

1Const TOPLEFT = "H11" 2With ActiveSheet 3 .Range(TOPLEFT & ":R" & .Range(TOPLEFT).End(xlDown).Row).Sort key1:=Range(TOPLEFT) 4End With 5

投稿2016/04/28 06:51

編集2016/04/28 07:10
ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/04/28 08:01

回答ありがとうございます! 行が増減しても大丈夫になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問