VB6での2つのListBoxソート方法について

このQ&Aのポイント
  • VB6で約3000のデータを2つのListBoxに収納していますが、双方のインデックス値を一致させる必要があります。ソートする際に、一方だけをソートしてもインデックス値がばらばらになってしまいます。そのため、3つのListBoxを追加し、1つをソートしてから順番に並び替えましたが、時間がかかります。他に効果的な方法はないでしょうか?
  • VB6での2つのListBoxのソートについて質問です。約3000のデータをListBox1とListBox2に分けて収納しているのですが、インデックス値を常に一致させる必要があります。現在、片方のListBoxをソートする方法や両方のListBoxをソートする方法を試していますが、どちらの方法でもインデックス値がばらばらになってしまいます。他に有効なソート方法はありませんか?
  • VB6で約3000のデータを2つのListBoxに収納していますが、ListBoxのソート方法について困っています。片方のListBoxだけをソートすると順番がばらばらになってしまい、両方のListBoxをソートすると時間がかかります。どのような方法でソートすれば効率的にインデックス値を一致させることができるでしょうか?
回答を見る
  • ベストアンサー

VB6 2つのListBoxをソート

VB6で約3000のデータをListBoxに入れて有ります。 ListBox1=ファイル名 ListBox2=ファイルアドレス と2つに分けてListBoxに入れて有り、このインデックス値は双方常に一緒でなければなりません。 ここで困ってしまったのが、Sortedはどうすれば良いのか?です。 片方ソートでも両方ソートでも順番(インデックス値)がばらばらになってしまいます。 そこで下記方法でListBoxを更に3つ追加して(1つをSorted)1つ1つソートしたインデックス順に並び替えたらソートに時間がかかってしまいました。 何か良い方法は無いでしょうか? (ListViewは経験が無いためこの方法の場合はやり方又は参考サイトを入れて頂けると助かります) Dim i As Integer Dim j As Integer Dim k As Integer k = LI1.ListCount - 1 For i = 0 To k LI3.AddItem LI1.List(i) LI4.AddItem LI2.List(i) LI5.AddItem LI1.List(i) 'SortedのListBox Next i LI1.Clear LI2.Clear For i = 0 To k For j = 0 To k If LI3.List(j) = LI5.List(i) Then LI1.AddItem LI3.List(j) LI2.AddItem LI4.List(j) Exit For End If Next j Next i LI3.Clear LI4.Clear LI5.Clear '(LI = ListBox)

  • mmac
  • お礼率94% (64/68)

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

  • ベストアンサー
回答No.1

MSFlexGridを非表示で持たせ、 そこで列ソートをかけてはどうですか?

mmac
質問者

お礼

回答有難う御座いました。 >MSFlexGrid これも未経験でしたがなんとか下記の様に出来ました。 ソートが前回より遥かに早い・・・ 今後はこれを利用していきたいと思います。 Dim i As Integer With MFG1 .Rows = LI1.ListCount .Cols = 2 .FixedRows = 0 .FixedCols = 0 For i = 0 To LI1.ListCount - 1 .Col = 0 .Row = i .Text = LI1.List(i) .Col = 1 .Row = i .Text = LI2.List(i) Next i .Col = 0 .Sort = 1 LI1.Clear LI2.Clear For i = 0 To .Rows - 1 .Col = 0 .Row = i LI1.AddItem .Text .Col = 1 .Row = i LI2.AddItem .Text Next i End With

関連するQ&A

  • ListBox内の並び替えで実行エラー

    OSはXP、 Excelは2003を使用しています。 ユーザーフォーム内のListBox内で、コマンドボタンをクリックして行を上や下に並び替えたく、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1041407835 を参考にして、下記の通りに組んだのですが、 下に並び替えるCommandButton2を実行時や、 上に並び替えるCommandButton1を「2回目」に実行時に 「実行時エラー -2147417848(80010108)  オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。」 となってしまいます。 Private Sub CommandButton1_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ上げる。 i = Me.ListBox1.ListIndex If i > 0 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i - 1, j) Me.ListBox1.List(i - 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i - 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i - 1, k) Me.ListBox2.List(i - 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i - 1) = True Next k Next j End If End Sub Private Sub CommandButton2_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ下げる。 i = Me.ListBox1.ListIndex If i < Me.ListBox1.ListCount - 1 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i + 1, j) Me.ListBox1.List(i + 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i + 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i + 1, k) Me.ListBox2.List(i + 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i + 1) = True Next k Next j End If End Sub 説明不足や上記の記述にとんちんかんな間違いがありましたら、ごめんなさい。 どなたか解決方法を教えて頂けますようお願い致します。

  • VB Shell sort

    初心者です。 シェルソート後の数字がうまく表示できません。 見よう見まねでしているので、どこがどうおかしいのかわかりません。 大変、恐縮ですが宜しくお願いいたします。 ----------------------------------------- Public Class Form1 Dim intNumber() As Integer = {2, 6, 4, 8, 10, 12, 89, 45, 37} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Display unsorted numbers to lists For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub Sub btnSort2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort2.Click Dim i As Integer, j As Integer, k As Integer Dim temp As Integer Dim gap As Integer Dim count As Integer gap = count / 2 Do While gap > 0 k = 0 Do While k < gap j = k + gap Do While j < count i = j - gap Do While i >= k If intNumber(i + gap) > intNumber(i) Then temp = intNumber(i + gap) intNumber(i + gap) = intNumber(i) intNumber(i) = temp Else Exit Do End If i = i - gap Loop j = j + gap Loop k = k + 1 Loop gap = gap / 2 Loop 'Display numbers to list lstShell.Items.Clear() For i As Integer = 0 To 8 lstShell.Items.Add(intNumber(i)) Next End Sub End Class

  • VB6での配列の SORT の使い方 

     お世話になります。   下記のように、配列にランダムな数値を入れて、それを昇順、降順にしたいのですが、この場合の SORT の使い方を教えて欲しいです。  Dim YUI(100) As Integer   YUI(1) =88:YUI(2) =53:YUI(3) =7 ~ YUI(98) =13:YUI(99) =2:YUI(100) =94 下記のような並べ替えをしていますが、SORT を使った場合の書き方を教えて下さい。 Dim I1,I4,D7 As Integer For I1 = 1 To 100 - 1 For I4 = I1 + 1 To 100 If YUI(I1) < YUI(I4) Then D7 = YUI(I4) YUI(I4) = YUI(I1) YUI(I1) = D7 End If Next I4 Next I1

  • コレクションの数値をSortで並び替える

    ご多忙中申し訳ありません。 Dim data As New List(Of Integer)で型指定した、dataの数値を単純に、下記のコードのようにdata.Sort() で並べ替えをしても綺麗に並べ替えが出来ますが、殆どのサイトでは、このような使い方をせず、IComparerインターフェイスを実装したクラスを使ったり、又はバブルソートなどを使って並べ替えをしていますが。 単純にdata.Sort() のような、並べ替えは問題があるのでしょうか、大変恐縮ですがご教示ください。 FormにButtonとListBoxを貼り付けました。 Dim data As New List(Of Integer) 'Integer型にする。 Private Sub f() Handles MyBase.Load 'データをaddする。 data.Add(235) data.Add(4) data.Add(567) data.Add(53) data.Add(56) data.Add(87943) data.Add(43) data.Add(890) data.Add(342) data.Add(56) data.Add(64) data.Add(5) data.Add(0) ListBox1.Items.Clear() End Sub Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim dtcnt As Integer 'リストの数の変数。 dtcnt = data.Count 'リストの数を取得してループの回数に使う。 data.Sort() '並べ替え For i = 0 To dtcnt - 1 ListBox1.Items.Add(data(i)) 'テストの結果をリストボックスに表示。 Next 'ListBox1には綺麗に並べ替えが完了して表示されています。 End Sub 何卒宜しくお願いします。

  • Excel UserForm ListBox

    Excel UserForm ListBoxの表示についての質問です Sheets("加工").Range("A44")からRange("G" & LastRow)のセルの値を Form_receipt.ListBox1に表示させたいのですが C~E列は数値なので桁数区切りで表示したくてマクロを作ったのですが A列1列しか表示されないマクロになってしまいました。 どこが悪いのかご教示願えませんか? あわせてC~E列を右揃えでリスト表示する方法も教えてください 失敗作のマクロは以下です Sub Macro48() Form_receipt.ListBox1.Clear Sheets("加工").Select '配列の定義 Dim myRng As Range Dim myList As Variant Dim c As Variant Dim i As Integer Dim j As Integer Dim LastRow As Integer For j = 45 To 94 If Sheets("加工").Range("A" & j).Value = "" Then Exit For End If Next j If Sheets("加工").Range("A47").Value = "" Then LastRow = j - 1 Else LastRow = 46 End If Set myRng = Range("A44", Range("A" & LastRow)) ReDim myList(myRng.Rows.Count - 1, 7) For Each c In myRng myList(i, 0) = c.Offset(, 0).Value myList(i, 1) = c.Offset(, 1).Value myList(i, 2) = Format$(c.Offset(, 2).Value, "@@@,@@@,@@@") myList(i, 3) = Format$(c.Offset(, 3).Value, "@@@,@@@,@@@") myList(i, 4) = Format$(c.Offset(, 4).Value, "@@@,@@@,@@@") myList(i, 5) = c.Offset(, 5).Value myList(i, 6) = c.Offset(, 6).Value myList(i, 7) = c.Offset(, 7).Value i = i + 1 Next c Form_receipt.ListBox1.List() = myList Set myRng = Nothing 'リスト表示幅設定 With Form_receipt.ListBox1 .ColumnWidths = "30,0,60,60,60,150,50" End With Form_receipt.Show End sub

  • VB2008: リストメンバーの列数の求め方?

    Sub Main()   Dim I As Integer   Dim J As Integer   Dim K As Integer   Dim aDatas As New List(Of String())()   Dim N = CSVReadToArray("D:\Temp\付属一覧.csv", aDatas) - 1   K = aDatas(0).Count - 1   For I = 0 To N     For J = 0 To K       Debug.Print(aDatas(I)(J))     Next J   Next I End Sub 質問1、K = aDatas(0).Count - 1 の本当のやり方? 質問2、K の処理のされ方。 K が変数としてメモリに配置されることはないと推察しています。 多分、何がしかのスタック領域に一時的に置かれると・・・。 この辺りに関しても教えてもらえれば幸いです。

  • エクセルファイルの有効期限の設定について

    エクセルのファイルに有期限を設定し、期日が来たら特定の "Seet"を削除してしまい、利用に値しない物にする。 このようなプログラムを作りたいのですが、他の方の質問を 参考に、流用して、いろいろやってみたのですが、どうもうまく行きません。 どなたかお知恵をお貸しください。 よろしくお願いたします。 This Workseet Openのプログラム中には、次の構文が入っています。 メッセージBOXを表示するまではうまく行きましたが、それ以降で 行き詰まっております。 ----------------- Private Sub Workbook_Open() Dim i As Integer, j As Integer, k As Integer Dim Start As Integer, Finish As Integer Dim Lbl As Variant Dim Cmb(4) As ComboBox Lbl = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉") With Sheet1 .ListBox1.Clear .ListBox1.Font.Size = 10 For i = 0 To 9 .ListBox1.AddItem Lbl(i) Next .ListBox1.ListIndex = 4 Set Cmb(1) = .ComboBox1: Set Cmb(2) = .ComboBox2 Set Cmb(3) = .ComboBox3: Set Cmb(4) = .ComboBox4 Lbl = Array("", "開催年", "開催月", "開催日", "発走") For i = 1 To 4 Cmb(i).Clear Cmb(i).Font.Size = 10 Cmb(i).AddItem Lbl(i) Next Select Case Sheet1.Range("E4") Case 2003 To 2999: Start = Sheet1.Range("E4") Case Else: Start = 2003 End Select Select Case Sheet1.Range("F4") Case 2003 To 2999: Finish = Sheet1.Range("F4") Case Else: Finish = 2003 End Select k = 0 For i = Start To Finish k = k + 1 .ComboBox1.AddItem i If .ComboBox1.List(k) = Format(Date, "yyyy") Then .ComboBox1.ListIndex = k End If Next For i = 1 To 12 .ComboBox2.AddItem Format(i, "00") Next For i = 1 To 31 .ComboBox3.AddItem Format(i, "00") Next For i = 1 To 12 .ComboBox4.AddItem Format(i, "00") Next .ComboBox2.ListIndex = Month(Date) .ComboBox3.ListIndex = Day(Date) .ComboBox4.ListIndex = 1 End With MsgBox ("使用期限は 2009/9/18です")

  • ListBoxのデータを高速でファイルに書き込む方法 VB.NET

    ListBoxに大量のデータを登録してありそれをファイルに保存する場合 Dim data As String For i As Integer = 0 To ListBox1.Items.Count - 1 data = data & ListBox1.Items(i) & VbCrLf Next という方法で変数に読み込むとデータが大量にある場合 非常に遅く、OutOfMemoryのエラーが出てしまったりするのですが、 このような場合により適切な方法がありましたらご教授頂けないでしょうか。 宜しくお願いいたします。

  • VB6→VS2005アップグレード後

    いつもお世話になっております。 VBを勉強中です。 VB6→2005にアップグレード後、下記のエラーが発生しました。 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" 以前もこちらでアドバイスをいただき、 デザインの中でADDされているかどうかを確認し、解決に結びついたので 今回も同様かと思い、色々と行ったのですが解決しません。 frmapli_S3のデザイナ内に下記が存在しましたが 原因はここでしょうか? CType(Me.Frame1, System.ComponentModel.ISupportInitialize).EndInit() 以下はVB6での正常稼動時のソースです。 Public Sub ShowPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) Textbox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) PermValue(k) = Textbox.Text Next Next 下記はVB2005アップグレード時のソースです。 Public Sub ShowPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) TextBox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) PermValue(k) = Textbox.Text   ←ここでエラー Next Next End Sub

  • VB6→VB2005アップグレードの際のエラー

    VBを勉強中です。段階としては書籍やサイトの見本プログラムを いくつか真似て作っているところです。 質問ですがVB6で作られたプログラムのバージョンアップを 行っています。VS2005を使いアップグレードを行った際 UPGRADE_WARNINGが発生し、デバッグできない状態です。 エラーを潰してデバッグしたいのですが、どう直して良いのか 教えて下さい。 "配列型の次元数が異なるため、型 'Object の 2 次元配列' の値を 'Object の 1 次元配列' に変換できません。" 構文は以下の通りです。 Public Sub Sort(ByRef Ar() As Object, ByRef rs As Integer, ByRef cs As Integer, ByRef Re As Integer, ByRef ce As Integer, ByRef keyc As Integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim aa As Object For i = rs To Re - 1 For j = i + 1 To Re 'UPGRADE_WARNING: オブジェクト Ar(j, keyc) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(i, keyc) の既定プロパティを解決できませんでした。 If Ar(i, keyc) > Ar(j, keyc) Then For k = cs To ce 'UPGRADE_WARNING: オブジェクト Ar(i, k) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト aa の既定プロパティを解決できませんでした。 aa = Ar(i, k) 'UPGRADE_WARNING: オブジェクト Ar(j, k) の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(i, k) の既定プロパティを解決できませんでした。 Ar(i, k) = Ar(j, k) 'UPGRADE_WARNING: オブジェクト aa の既定プロパティを解決できませんでした。 'UPGRADE_WARNING: オブジェクト Ar(j, k) の既定プロパティを解決できませんでした。 Ar(j, k) = aa Next End If Next Next End Sub

専門家に質問してみよう