こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excelで、リストボックスの値によってVBAの記述を変えたい

エクセルの表(データベース)を
並び替えるマクロを作っています。

コマンドボタンを押したらあらかじめ登録された
条件で並び替えされる、というところまではできました。
(ここでいう登録とは私が条件指定してVBAに記述したものです)

そこで質問なのですが、ユーザーフォームの上で
並び替えの条件(優先順位・降順、昇順)をユーザーに
指定してもらい、ボタンを押したら並び替えされる、
というものを作りたいのですが可能でしょうか。

なぜこんな面倒なことをするかというと、
複数のユーザーが扱うデータベースで、
並び替えの操作を簡略化したいのと、
間違った操作によるデータベースの破壊を
防止したいからです。

まずユーザーフォーム上のリストボックスの中に
優先順位をかける項目を入れておき、それを3つ
作りました。(並び替えの条件が3つまであるので)

次に各リストボックスの横にラジオボタンを置き、
降順、昇順を指定できるようにする。
(ここで、ラジオボタンのどちらかしか選択できないように
したいのですがその方法もわからないので教えてください)

そして、それぞれの指定された結果でVBAの記述(値)
を変えてコマンドボタンを押したら並び替えされる、
という風にしたいのです。(あくまでイメージですが)


Selection.Sort Key1:=Range("A2"), Order1:=xlDescending, ・・・とつづく記述で


上の記述のRange("A2")と、xlDescendingの値を
ユーザーフォーム上で選んだ結果によって
変更したい、ということなんですが、こんなことって
出来るものでしょうか。もしくは同じ様な事を
可能な書き方とかがあれば教えて頂きたいです。

よろしくお願いします。

投稿日時 - 2006-07-05 20:14:34

QNo.2257755

困ってます

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

OptionButton でどちらかしか選べない組み合わせを複数持ちたい場合は、それぞれの組み合わせをフレームの上に置くか、若しくはプロパティで GroupName を同じにするかで対応可能です。

昇順・降順については

 xlAscending = 1
 xlDescending = 2

ですので、

 i = 2
 Order1:= i

のように書くことが出来ます。

それよりも、、、
希望しているのはソートダイアログと寸分違わぬ物に思えます。
ソートダイアログを呼んじゃえば良いのでは?

例)UserFormにボタンを置いて

Private Sub CommandButton1_Click()
  '一番左のシートのA1からデータがあるとして
  Worksheets(1).Range("A1").CurrentRegion.Select
  Application.Dialogs(xlDialogSort).Show
End Sub

投稿日時 - 2006-07-05 21:36:46

お礼

ありがとうございます。

まったくおっしゃる通りで、
ダイアログを呼べばいいんですね。

できればもう一つ教えて頂きたいのですが、
ソートダイアログを呼ぶ方法において、

1.範囲の先頭行で、選択可能項目を
タイトル行のみとする

2.オプションを選択不可にする

この2つを実現したいのですができますか?

投稿日時 - 2006-07-06 12:20:11

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#3の補足
例データ
abde
12t23w
34r5e
22e4e
のようなデータを範囲指定して
Sub test01()
Application.Dialogs(xlDialogSort).Show 1, "b", 2, "a", 2, "d", 1, 2, 1
End Sub
Showの次からパラメーターは
1ー 列方向キー、2ー行方向
第1キーの見出し文字列、
1-昇順、2-降順
第2キーの見出し文字列
1-昇順、2-降順
第3キーの見出し文字列
1-昇順、2-降順
1-タイトル行、2-データ行

Sub test01()
Application.Dialogs(xlDialogSort).Show 1, "b", 2, "a", 2, "d", 1, 1
End Sub
のように指定できます
オプションボタン選択不可方法は、すみませんわかりません。

投稿日時 - 2006-07-06 22:44:40

お礼

早速試してみます。

数々のご返答、本当にありがとうございました。

投稿日時 - 2006-07-10 19:49:33

ANo.4

#1です。

> 1.範囲の先頭行で、選択可能項目をタイトル行のみとする

ご質問の意味が解りません良く掴めません。
headerを指定するって事?
Application.Dialogs(xlDialogSort).Show 1, , , , , , , xlYes

> 2.オプションを選択不可にする

組み込みダイアログなので難しいと思います。
APIを駆使してやれば出来るのかも知れませんが、、、

投稿日時 - 2006-07-06 20:50:19

お礼

お礼が遅くなりすいませんでした。

自分には難しすぎました。

もう少し時間のあるときに勉強してみます。

どうもありがとうございました。

投稿日時 - 2006-07-10 19:46:19

ANo.3

#2です。
#2の回答をしているとき、引数でわからないことがあったので、書かなかったが、#1のご回答にも出ているDialogs(xlDialogSort)を使うのが、簡便で安定性があると思います。
Sub test01()
Range("a2:C10").Select
Application.Dialogs(xlDialogSort).Show 1, "年齢", 2, "氏名", 1
End Sub
のように、引数の順序は
orientation、key1、order1、key2、order2、key3、order3、header、custom、caseの順ですので
http://www.geocities.jp/dgscs970/_homepage2/jiten/Jiten2.html
など参考に)
、これをプログラムで指定すると、
ダイアログ画面が出たときに、ダイアロウグ画面が既にそのように選択された状態で出すことができます。
すなわちOKだけクリックすればよい状態にできます。
これが進むと、マクロの記録のコードをそのまま書く形まえ行きます。
ご参考に。
データ例はA2:C5
住所氏名年齢
名古屋市佐々木54
千葉市近藤34
静岡市木下23
のような例で考えています。

投稿日時 - 2006-07-05 23:15:38

お礼

ありがとうございます。

試してみたところ上手くいきました。

これに加えて、

1.範囲の先頭行で、選択可能項目を
タイトル行のみとする

2.オプションを選択不可にする

この2つを実現したいのですができますか?

投稿日時 - 2006-07-06 12:24:28

ANo.2

UserForm1に
Combobox1  ソートキー選択用
OptionButton1 昇順選択用
OptionButton2 降順選択用
CommandButton1 ソート実行トリガ
のコントロールを各々1つはりつける。
UserForm1のコード部に
Dim cl
Dim asc
Private Sub ComboBox1_Click()
MsgBox UserForm1.ComboBox1.Text & "列でソート"
cl = UserForm1.ComboBox1.ListIndex + 1
End Sub

Private Sub CommandButton1_Click()
'MsgBox xlDescending 'Ascending
'MsgBox cl
Range("a3:H100").Sort key1:=Cells(1, cl), order1:=asc ',accending
End Sub

Private Sub OptionButton1_Click()
asc = 1
End Sub
Private Sub OptionButton2_Click()
asc = 2
End Sub
Private Sub UserForm_Initialize()
r = Range("iv2").End(xlToLeft).Column
'MsgBox r
For j = 1 To r
ComboBox1.AddItem Cells(2, j)
Next j
End Sub
のようなコードを作成。
これで実行して
下記例とした場合
コンボで「年齢」をクリック
オプションボタンで昇順のボタンをクリック
コマンドボタンをクリックでソートが実行され
A2:D7に
氏名郵便番号住所年齢
山田123-1111千代田区4
小島234-2222台東区21
大橋345-3333名古屋市23
野島567-3333岐阜市34
上野432-2222千葉市45
となった。
焦点がぼやけないように、体裁的なことは一切省略している。
コントロール利用の経験がなければ、難しいのではないですか。

投稿日時 - 2006-07-05 21:47:25

あなたにオススメの質問