Gizport
1 回答
0
Share (facebook)
180
view
全般

ユーザーフォームの日付リストを昇順に並び替える Caseが分かれてい...

ユーザーフォームの日付リストを昇順に並び替える
Caseが分かれていますが両方とも同じListBox1
で日付を昇順表示させたいです。 Private Sub UserForm_Initialize()

Me.StartUpPosition = 0
Me.Left = 856
Me.Top = 138

'タイトルを設定
Me.Caption = "入力フォーム"

'リストを設定
Dim ws As Worksheet, r As Range

Set ws = Worksheets("入出金帳簿")

For Each r In ws.Range("B4", ws.Range("B" & Rows.Count).End(xlUp))

With ListBox1

.ColumnWidths = .Width - 6 & ",0,0,0"

Select Case r.Value
Case "集金"
.AddItem Format(r.Offset(0, -1).Value, "m月d日")
.List(.ListCount - 1, 1) = r.Value
.List(.ListCount - 1, 2) = r.Offset(0, 1).Value
.List(.ListCount - 1, 3) = r.Offset(0, -1).Value
Case "振込"
.AddItem Format(r.Offset(0, -1).Value, "m月d日")
.List(.ListCount - 1, 1) = r.Value
.List(.ListCount - 1, 2) = r.Offset(0, 2).Value
.List(.ListCount - 1, 3) = r.Offset(0, -1).Value
End Select

End With

Next r

End Sub
Yahoo!知恵袋 4347日前
コメントする
お気に入り
1
質問者が選んだベストソリューション
補足
そこまで、できてるのでしたら、あとは、goldswallow_stageさんの示したコードを多次元配列に応用するだけでソートできるかと思います。

Variant型の変数(今回は「範囲」という名前にしました)に対して、セル範囲をセットすると、(↓この行です)
範囲 = ws.Range("A4:D" & ws.Range("B" & Rows.Count).End(xlUp).Row)

範囲=セルA4:Dα範囲(αは入力済みのセル数)となるわけですが、

この配列は2次元配列となり、範囲(1,1)=A4の値、範囲(1,2)=B4の値、範囲(1,3)=C4の値、範囲(1,4)=D4の値、範囲(2,1)=A5の値・・・・と一度にセットされます。
つまり、範囲(1~α,1)に日付けがセットされているのでそれをgoldswallow_stageさんの示したコードで並べ替え同時に、(1~α,2~4)にも同じようにgoldswallow_stageさんの示したコードで並べ替えた値をセットし直せばいいわけですね^^

goldswallow_stageさんの示したコードのアゴリズムは、私は思いつきませんでしたwww
(VBA内でソートを完結するための私の考え付いたコードは、2つ多次元配列を用意して、Rank関数とCountIf関数を併用する方法です。勉強になりました。)

多次元配列の要素数は、
UBound(範囲, 1)で、1次元目の要素の上限αの数が求まります。
今回は使ってませんが、
UBound(範囲,2)を使いますと2次元目の要素の数「4」が帰ってくるはずです。

今回の「範囲」配列変数は先にも述べたように2次元配列ですので、3次元目の配列の上限数
UBound(範囲,3)とやるとエラーとなる具合です。


**********************************************

Private Sub UserForm_Initialize()

Me.StartUpPosition = 0
Me.Left = 856
Me.Top = 138

'タイトルを設定
Me.Caption = "入力フォーム"

'リストを設定
Dim ws As Worksheet, r As Range

Set ws = Worksheets("入出金帳簿")

Dim 範囲 As Variant
範囲 = ws.Range("A4:D" & ws.Range("B" & Rows.Count).End(xlUp).Row) '並べ替える範囲を変数に格納

Dim i As Long, j As Long, c As Long, tmp As Variant

i = LBound(範囲, 1)
Do While i < UBound(範囲, 1)
j = UBound(範囲, 1)
Do While j > i
If 範囲(j, 1) < 範囲(i, 1) Then
tmp = Array(範囲(j, 1), 範囲(j, 2), 範囲(j, 3), 範囲(j, 4))

For c = 1 To 4: 範囲(j, c) = 範囲(i, c): Next
For c = 0 To 3: 範囲(i, c + 1) = tmp(c): Next

End If
j = j - 1
Loop
i = i + 1
Loop


For c = 1 To UBound(範囲, 1)

With ListBox1

.ColumnWidths = .Width - 6 & ",0,0,0"

Select Case 範囲(c, 2)
Case "集金"
.AddItem Format(範囲(c, 1), "m月d日")
.List(.ListCount - 1, 1) = 範囲(c, 2)
.List(.ListCount - 1, 2) = 範囲(c, 3)
.List(.ListCount - 1, 3) = 範囲(c, 1)
Case "振込"
.AddItem Format(範囲(c, 1), "m月d日")
.List(.ListCount - 1, 1) = 範囲(c, 2)
.List(.ListCount - 1, 2) = 範囲(c, 4)
.List(.ListCount - 1, 3) = 範囲(c, 1)
End Select

End With

Next c

End Sub



*******************************




Private Sub UserForm_Initialize()
Dim Sh As Worksheet
Dim Se As Range
Dim Ac As Range
Set Sh = ActiveSheet '現在選択されているシートを保存
Set Se = Selection '現在選択されているセルを保存
Set Ac = ActiveCell '現在アクティブなセルを保存


Me.StartUpPosition = 0
Me.Left = 856
Me.Top = 138

'タイトルを設定
Me.Caption = "入力フォーム"

'リストを設定
Dim ws As Worksheet, r As Range

Set ws = Worksheets("入出金帳簿")

Dim 範囲 As Variant

範囲 = ws.Range("A4:D" & ws.Range("B" & Rows.Count).End(xlUp).Row) '並べ替える範囲を変数に格納
Sheets.Add After:=Sheets(Sheets.Count) '新しいシートを追加
Range("A4:D" & UBound(範囲, 1)) = 範囲 '新しいシートに並べ替え範囲を貼り付け
Range("A4:D" & UBound(範囲, 1)).Sort Key1:=Range("A4"), Order1:=xlAscending, Key2:=Range("B4"), Order2:=xlDescending '並べ替えの実行

For Each r In Range("B4", Range("B" & Rows.Count).End(xlUp))

With ListBox1

.ColumnWidths = .Width - 6 & ",0,0,0"

Select Case r.Value
Case "集金"
.AddItem Format(r.Offset(0, -1).Value, "m月d日")
.List(.ListCount - 1, 1) = r.Value
.List(.ListCount - 1, 2) = r.Offset(0, 1).Value
.List(.ListCount - 1, 3) = r.Offset(0, -1).Value
Case "振込"
.AddItem Format(r.Offset(0, -1).Value, "m月d日")
.List(.ListCount - 1, 1) = r.Value
.List(.ListCount - 1, 2) = r.Offset(0, 2).Value
.List(.ListCount - 1, 3) = r.Offset(0, -1).Value
End Select

End With

Next r

Application.DisplayAlerts = False
ActiveSheet.Delete '新しく作ったワークシートを削除する
Application.DisplayAlerts = True

Sh.Select: Se.Select: Ac.Activate '前の状態に復帰

End Sub
Yahoo!知恵袋 4346日前
シェア
 
コメントする
 

参考になったと評価
  このQ&Aは参考になりましたか?

Share (facebook)
その他の解決方法を知っていますか?
回答する
全般
70
Views
質問者が納得■補足への回答 その箇所に問題があろうことは、分かっています。 ですが、他のListBoxのコードと同じように記述していて、一部のListBoxだけ機能しないということは、コードの記述に問題があるわけではありません。 機能していない箇所はそこであっても、その要因は別の部分にあるのです。 他のコードが干渉しているのか、そもそもイベント発生の信号を受取れていないかだと思います。 ただ、先にも申し上げた通り、せめてブレークポイントを設定して、イベントが発生しているのかを確認する必要があります。 例えば、お腹が...
4299日前view70
全般
61
Views
質問者が納得状況説明も殆ど無くコードをドンと載せるのは、コードを解析してやりたい事を推測して答えろという意味ですか? 画像も的を得ていない部分を載せていたり、小さすぎて見えなかったりであまり意味が無い場合が多いし、コードだって一部だけ載せても、他のイベントコードがどうなっているかわからないため、他のコードと干渉し合う事も考えられます。 私は専属の下請けじゃありません。 業務ソフトを構築したいなら、それなりのところに頼んでください。 既に掲示板でのやりとりで解決出来る範囲では無いと思います。 --- 今後、リクエ...
4312日前view61
全般
72
Views
質問者が納得90人以上が見ても回答が無いのは、回答者に答えるスキルが不足しているのでは無く、ご質問の文章や表現などに問題があると考えた事はありませんか? 「まったく状況や内容を知らない人が読む」という観点で質問を読み返してみて下さい。果たして何人の人が望んでいる事を理解出来るでしょうか? 見ていない人に文章で伝えるのはかなり大変なことですし、特に文字数制限がある掲示板では尚更です。込み入った内容の質問であればあるほど伝えるのは容易ではありません。書いてもらったコードをコピペで載せるのではなく、読む人の環境で再現させ...
4346日前view72
全般
71
Views
質問者が納得何度かご質問にお答えした記憶はありますが、内容はまったく覚えてません。 質問歴を拝見すると同じようなソートの質問を何度かされているよう見受けられますが、コピペで動かないとまったく応用できないという事でしょうか? ロジック的にどうかなという気持ちもありますが、サンプルコードを UserForm_Initialize の End Select と End With の間に追加したら、とりあえず画像のようになりました。 '---省略--- End Select '----サンプル ここから--- i = 0...
4346日前view71
全般
71
Views
質問者が納得補足 そこまで、できてるのでしたら、あとは、goldswallow_stageさんの示したコードを多次元配列に応用するだけでソートできるかと思います。 Variant型の変数(今回は「範囲」という名前にしました)に対して、セル範囲をセットすると、(↓この行です) 範囲 = ws.Range("A4:D" & ws.Range("B" & Rows.Count).End(xlUp).Row) 範囲=セルA4:Dα範囲(αは入力済みのセル数)となるわけ...
4347日前view71

関連製品のQ&A