いつも大変お世話になっております。
Excel2003を使用しております。
ユーザーフォームに置いてある
コンボボックスのデータの順番が毎回変わるのですが、
指定順に並び替えたいです。
例えば、
東京
大阪
北海道
青森
沖縄
仙台
福岡
という順番でコンボボックスに入っている場合、
北海道
青森
仙台
東京
大阪
福岡
沖縄
という順番に自動で並べ替えたいのです。
項目は必ず全てあるわけではなく、
東京
北海道
だけの場合もあります。(コンボボックスの最後には必ず空白が1行あります)
Sub ComboboxNarabi()
Dim i As Long
Dim j As Long
Dim Count As Long
Dim Swap As String
Dim SortListData As Variant
SortListData = Array("北海道", "青森", "仙台", "東京", "大阪", "福岡", "沖縄", "")
Count = 0
For j = 0 To UBound(SortListData)
For i = 0 To ComboBox2.ListCount - 1
If ComboBox2.List(i) = SortListData(j) Then
Swap = ComboBox2.List(Count) '現在の位置の内容をSwapにコピー
ComboBox2.List(Count) = ComboBox2.List(i) '現在位置に、検索したワードをコピー
ComboBox2.List(i) = Swap 'もとの内容をコピー
Count = Count + 1
End If
Next
Next
End Sub
なんだか遠回りしているような気もします。
もう少し、良い方法はありますでしょうか?
以上、よろしくお願い致します!
No.1ベストアンサー
- 回答日時:
こんにちは。
十分シンプルに纏っていますし、問題なく作動しますから、
そのままでもいいようにも思いますが。
一方で、何度も何度も忙しくリストの内容を書き換えるループが気になる、
ということであれば、理解、共感できる部分ではあります。
参考として、3例挙げてみます。
ここには書きませんが私個人の実務としては
今回のような複雑なソートの場合はADODBでSQLやRecordSet.Sort等を用いることが比較的多かったり、
ソートオーダーが可変な場合などではCollectionやDictionary等のオブジェクトを
配列ソートアルゴリズム等と組み合わせたり、とかもします。
より簡単に書けるものは簡単に済ませるようにも心がけていますけれども、、、。
書換えを考える時には、書換える意図を明確にしておくようにして、
一定の方向性を常に意識しながら書く様にするといいです。
今回は、複雑な処理は避けなるべく簡素に、実行プロシージャの編集が容易なもの、
という意図で3案挙げてみました。
メンテナンスに自信が持てる書き方を選ぶ、というのも、とても大切なことですので。
#余談。蛇足。
IF Then ステートメントには色々あります。
If 条件 Then 真の処理 Else 偽の処理
のように1行で書くことだって出来るのですけれど、
これはまぁ、やり過ぎ、というか非常に読み難いので使いませんが、
If 条件 Then Exit Sub
のような排他処理の書き方は、VBAでは定番です。
If 条件 Then
1ページに収まらない程の長ったらしい処理
End If
のように書くとEnd Ifの由来を確認するのも面倒ですし、、、。
無論、サブルーチン化するなどの検討も必要ですが、
目にすることの多い例として、特にイベントプロシージャなどでは、
Exit Sub(1行で記す If ... Then ... ステートメント)の使いこなしは重要な基本です。
#余談2。
VBEコードペイン上のインデントを投稿に反映させる方法ですが、
私は投稿文をメモ帳で書いてから全文をコピペして投稿する習慣がある(自分に課している)ので、
メモ帳にて、半角スペース4つを全角スペース2つに全置換しておくことで、
インデント擬きを表示させています。
昔はコードに全角スペースなど言語道断と仰る方多かったですが、
現行のExcel環境では、全角スペース2つをVBEコードペイン上にコピペすれば、
正しくインデント(タブ、というより半角スペース4つ)に置換してくれるようにもなっています。
以下3例。
' ' 〓〓〓〓〓〓〓〓〓〓
Option Explicit
Private arrSortOrder ' ! モジュールで宣言。
' ' ↑ FnSortOrder用。頻繁に並べ替えをするならソートオーダーは固定した方が有利。
' ' ======== 1◆ベーシック版
' ' #せめて記述上だけでも。同じ事を繰り返さない(参照や取得は1回に纏める)ようにしてみる、とか。
Sub Re8668860b() ' ▼実行proc
Dim i As Long
Dim j As Long
Dim Count As Long
Dim Temp As String
Dim Swap As String
Dim SortListData As Variant
SortListData = Array("北海道", "青森", "仙台", "東京", "大阪", "福岡", "沖縄", "")
With ComboBox2
Count = 0
For j = 0 To UBound(SortListData)
For i = 0 To .ListCount - 1
Temp = .List(i)
If Temp = SortListData(j) Then
Swap = .List(Count) '現在の位置の内容をSwapにコピー
.List(Count) = Temp '現在位置に、検索したワードをコピー
.List(i) = Swap 'もとの内容をコピー
Count = Count + 1
End If
Next
Next
End With
End Sub
' ' ======== 2◆配列操作List設定版(並べ替えは関数(配列変数))で
' ' #コンボボックスのリスト書換えを1回に纏める、とか。
Sub Re8668860c() ' ▼実行proc)
With ComboBox2
.List = FnSortOrder(.List)
End With
End Sub
Function FnSortOrder(ByVal arrCurList As Variant) As Variant
Dim sBuf As String
Dim nUBO As Long
Dim nUBC As Long
Dim nRank As Long
Dim i As Long
Dim j As Long
If Not IsArray(arrSortOrder) Then
arrSortOrder = Array("北海道", "青森", "仙台", "東京", "大阪", "福岡", "沖縄", "")
End If
arrCurList = ComboBox2.List ' ! 二次元配列
For j = 0 To UBound(arrSortOrder)
For i = 0 To UBound(arrCurList)
If arrCurList(i, 0) = arrSortOrder(j) Then
sBuf = arrCurList(nRank, 0)
arrCurList(nRank, 0) = arrCurList(i, 0)
arrCurList(i, 0) = sBuf
nRank = nRank + 1
End If
Next
Next
FnSortOrder = arrCurList
End Function
' ' ======== 3◆Excelのユーザー設定と作業シート(非表示)を事前に用意しておいて
' ' #Excelの並べ替え機能を活用し、実行側では何も考えないで済むようにする、とか。
Private Sub 初期設定()
Dim shSelected As Sheets
Set shSelected = ActiveWindow.SelectedSheets
With Worksheets.Add
.Name = "Work"
.Visible = xlSheetHidden
End With
shSelected.Select
Application.AddCustomList Array("北海道", "青森", "仙台", "東京", "大阪", "福岡", "沖縄", "")
End Sub ' ↑ 実行は事前に、一度だけ。
Sub Re8668860e() ' ▼実行proc
With ComboBox2
.List = FnSortCustom(.List)
End With
End Sub
Function FnSortCustom(ByVal arrCurList As Variant) As Variant
With Sheets("work").Columns(1)
.Value = Empty ' .ClearContents
With .Resize(UBound(arrCurList) + 1)
.Value = arrCurList
.Sort Key1:=.Cells(1), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=Application.CustomListCount + 1, _
MatchCase:=True, Orientation:=xlTopToBottom, _
SortMethod:=xlStroke, DataOption1:=xlSortNormal
FnSortCustom = .Value
End With
End With
End Function
' ' ========
' ' 〓〓〓〓〓〓〓〓〓〓
回答ありがとうございます。
タブを入れたつもりが、入っていませんでした!
見づらいプログラムで申し訳ありませんでした。
おぉお、すごいです!
同じことをやるのに3パターンも考えられるなんて…
2次元配列って難しいですね!
プログラムを読むだけで精一杯です(苦笑
元々ある、Excelの並び替え機能が使えるとは思っていませんでした!
確かに、その方法なら今後も…使えそうな気がします!
If文の横にExit Sub などが基本ですか。
全然使っておりませんでしたorz
その横にEnd If をつける…のも良いのでしょうか?
中々、プログラムというのは奥が深いですね…!
ありがとうございました^^
大変参考になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- 新幹線 東北北海道新幹線の列車名を東海道山陽新幹線と同じにするとしたら皆さんはどう思いますか? 停車駅は下記 8 2022/06/11 11:40
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
このQ&Aを見た人はこんなQ&Aも見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
コンボボックスへ降順に表示するには?
Excel(エクセル)
-
コンボボックスのソートについて
Access(アクセス)
-
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
リストボックス内を昇順並べる方法
Excel(エクセル)
-
6
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
7
UserForm1.Showでエラーになります。
工学
-
8
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
9
コンボボックス内の文字サイズ変更
Excel(エクセル)
-
10
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
11
Accessでリストの並び順を変更したい
Excel(エクセル)
-
12
マクロ実行時、ユーザーフォームにラベルのテキストが表示されません。
Access(アクセス)
-
13
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
14
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
15
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
16
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
17
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
18
IF関数で空欄(")の時、Nullにしたい
その他(Microsoft Office)
-
19
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
20
VBAにてメッセージボックスを最前面に表示させる
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
くら寿司WiFiパスワード分から...
-
関西弁はなぜ人を不快にさせる...
-
日本へ架ける国際電話のcountry...
-
キャバ嬢です。 お客様が好きに...
-
大阪に合わない
-
大阪市は日本経済の中心地とし...
-
JRで神戸駅から大阪まで 快...
-
友達(東京人)が大阪が合わな...
-
大阪人ってどうして威圧的なん...
-
関西弁で言う「ええしの子」の...
-
話してる時に『〇〇〇〇じゃな...
-
風俗の大阪のアポロビルみたい...
-
関西(大阪)の人って「キッショ...
-
大阪人ですが、大阪人が嫌いで...
-
「半時間」って方言ですか?
-
関西のノリがほんとにしんどいです
-
喫煙者に仕返しをするなら…
-
「無理しないでね」って意味だ...
-
電信棒という表現は方言ですか?
-
贈呈式の司会進行の原稿につて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関西弁はなぜ人を不快にさせる...
-
くら寿司WiFiパスワード分から...
-
日本へ架ける国際電話のcountry...
-
キャバ嬢です。 お客様が好きに...
-
大阪に合わない
-
大阪人ってどうして威圧的なん...
-
「無理しないでね」って意味だ...
-
JRで神戸駅から大阪まで 快...
-
大阪人ですが、大阪人が嫌いで...
-
贈呈式の司会進行の原稿につて
-
友達(東京人)が大阪が合わな...
-
大阪が嫌いになりだした
-
「○○さんの家」という意味で「...
-
複数列の平均を出したい
-
関西のノリがほんとにしんどいです
-
電信棒という表現は方言ですか?
-
関西弁で言う「ええしの子」の...
-
電話番号の最初の3桁や4桁って...
-
呼び出しの「元」と「先」って...
-
ストーンクラブを食べられる店...
おすすめ情報