VB6 ソートのやり方は知っていますが、構造体の定義が変わると対応できません。
ソート処理部分だけを共通関数にできますでしょうか?
Private Type Sort
strCol1 As String
intCol2 As Integer
sttCol3 As String
End Type
Private Sub A()
Dim typSort(3) As Sort
'ここに、構造体データ設定処理を記述
Call subSort(typSort(), typSortCopy)
End Sub
Private Sub subSort(typTaget() As Sort)
Dim lngOutLoop As Long
Dim lngCurent As Long
Dim lngInLoop As Long
Dim Min As Variant
Dim typSortCopy As Sort
For lngOutLoop = LBound(typTaget) To UBound(typTaget) - 1
Min = typTaget(lngOutLoop).strCol1
lngCurent = lngOutLoop
For lngInLoop = lngOutLoop + LBound(typTaget) + 1 To UBound(typTaget)
If typTaget(lngInLoop).strCol1 < Min Then
Min = typTaget(lngInLoop).strCol1
lngCurent = lngInLoop
End If
Next lngInLoop
typTagetCopy = typTaget(lngOutLoop)
typTaget(lngOutLoop) = typTaget(lngCurent)
typTaget(lngCurent) = typTagetCopy
Next lngOutLoop
End Sub
No.1ベストアンサー
- 回答日時:
[マルチなソート関数]
は、VBだけの標準機能だけでは無理だと思います。
ましてや、構造体となると、もっと厳しいと思います。
どうしてもVBで「構造体+配列のソート」を可能にしたいというのであれば、
「構造体のサイズを固定で定める」という方法があります(処理はCと一緒)
Private Type Sort
strCol1 As String
intCol2 As Integer
sttCol3 As String
End Type
を
Private Type Sort
strCol1 As String * 10
intCol2 As Integer
sttCol3 As String * 12
End Type
などにする必要があります。こうすることにより、構造体のサイズが定まります。
(strCol1(20byte) + intCol2(2byte) + sttCol3(24byte) = Sort構造体は「計46byte」)
それをmemorycopyというAPI関数で、開始バイトから必要バイト数長を指定し、値を取得する必要があります。
しかし、、、そこまでして標準化する必要があるのか疑問を感じます。
んで、代替案ですが
構造体→クラス化
配列→Collection化
とする方法もあります。
これなら、ソートの標準関数も作りやすいかと思います。
以下に作ってみたものをそのまま載せます。
構成は
・Class1
・Class2
・Module1
です。
ソートロジックは、全てなめて見る方法を利用していますので、もっと効率よい方法をご存知であれば、それに置き換えてください。
---------------------------------
※1 Class1
Option Explicit
'他のクラスとの共通部
Public strCol1 As String
Public intCol2 As Integer
Public sttCol3 As String
'クラス1独自の変数
Public intHOGE1 As Integer
Private Sub Class_Initialize()
'sttCol3の規定値を設定
sttCol3 = "クラス1"
End Sub
---------------------------------
---------------------------------
※1 Class2
Option Explicit
'他のクラスとの共通部
Public strCol1 As String
Public intCol2 As Integer
Public sttCol3 As String
'クラス2独自の変数
Public strHOGE2 As String
Private Sub Class_Initialize()
'sttCol3の規定値を設定
sttCol3 = "クラス2"
End Sub
---------------------------------
---------------------------------
※1 Module1
Option Explicit
Sub Test()
Dim colClass1 As Collection
Dim colClass2 As Collection
Call クラス1のダミーデータ(colClass1)
Call クラス2のダミーデータ(colClass2)
Call クラスの内容デバッグ("ソート前", colClass1)
Call クラスの内容デバッグ("ソート前", colClass2)
Call subSort(colClass1)
Call subSort(colClass2)
Call クラスの内容デバッグ("ソート後", colClass1)
Call クラスの内容デバッグ("ソート後", colClass2)
End Sub
Sub subSort(ByRef p_col As Collection)
Dim l_colRet As Collection
Dim l_cls As Object
Dim l_clsMin As Object
Dim l_intMinID As Integer
Dim i As Integer
Set l_colRet = New Collection
Do Until (p_col.Count = 0)
'まずは先頭を基準
l_intMinID = 1
'先頭ははずしてループ
For i = 2 To p_col.Count
'基準のstrCol1と、ループのi番目のstrCol1との大小比較
If p_col(l_intMinID).strCol1 > p_col(i).strCol1 Then
'i番目の方が小さければ、それが基準
l_intMinID = i
End If
Next i
'一番小さい基準値のデータを登録
l_colRet.Add p_col(l_intMinID)
'引数のデータから削除
p_col.Remove l_intMinID
Loop
'結果の返却
Set p_col = l_colRet
End Sub
Public Sub クラスの内容デバッグ(ByVal p_strTytle As String, ByVal p_col As Collection)
Dim l_cls As Object
Dim i As Integer
For i = 1 To p_col.Count
Set l_cls = p_col(i)
Debug.Print p_strTytle & ":" & l_cls.sttCol3 & "の" & i & "番目: strCol1=" & l_cls.strCol1
Next i
End Sub
Private Sub クラス1のダミーデータ(ByRef p_col As Collection)
Dim l_cls As Class1
Set p_col = New Collection
Set l_cls = New Class1
l_cls.strCol1 = "3"
l_cls.intCol2 = 1
p_col.Add l_cls
Set l_cls = New Class1
l_cls.strCol1 = "2"
l_cls.intCol2 = 2
p_col.Add l_cls
Set l_cls = New Class1
l_cls.strCol1 = "1"
l_cls.intCol2 = 3
p_col.Add l_cls
Set l_cls = New Class1
l_cls.strCol1 = "0"
l_cls.intCol2 = 4
p_col.Add l_cls
End Sub
Private Sub クラス2のダミーデータ(ByRef p_col As Collection)
Dim l_cls As Class2
Set p_col = New Collection
Set l_cls = New Class2
l_cls.strCol1 = "2"
l_cls.intCol2 = 1
p_col.Add l_cls
Set l_cls = New Class2
l_cls.strCol1 = "1"
l_cls.intCol2 = 2
p_col.Add l_cls
Set l_cls = New Class2
l_cls.strCol1 = "3"
l_cls.intCol2 = 3
p_col.Add l_cls
End Sub
---------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) Sub 分けてソートして貼り付ける() Dim srcSheet As Worksheet Dim 6 2023/08/04 19:57
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
VB6でデータを昇順に並べ替える
Visual Basic(VBA)
-
VB6.0での小数点の扱いについて
Visual Basic(VBA)
-
構造体配列の並べ替え
Visual Basic(VBA)
-
-
4
VB6で、長い時間かかる処理実行中の表示の工夫について
Visual Basic(VBA)
-
5
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
6
VB6でForm_Load中にイベントを発生させない方法
Visual Basic(VBA)
-
7
文字列をソートする方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
GridViewで列のソートを無効に...
-
小さい順
-
ソート機能付きの成績表プログラム
-
DataGridViewの昇順降順。
-
構造体配列のソート
-
n番目に大きい数を求めるアル...
-
Excelですべての組合せ(重複組...
-
Excel VBAで並べ替えをしたい
-
Fortran77で多次元配列を並び替...
-
C言語・要素除去
-
部分和問題がわかりません。
-
VB.NETでファイル名順にファイ...
-
ListViewについて
-
リスト構造のソートで悩んでま...
-
配列の中身を入れ替える方法を...
-
2次元配列を複数項目でソートし...
-
10個の整数を入力して小さい順...
-
C言語でアナグラムを求めるプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
C言語・要素除去
-
C# DataGridView のヘッダーセ...
-
Excelですべての組合せ(重複組...
-
VBA基本構文の作り方 2列の...
-
なぜ?counterintuitive
-
ファイル名「1.jpg ~10.jpg~...
-
リスト構造のソートで悩んでま...
-
配列の問題
-
C# DataTableの行をソートしてD...
-
あるディレクトリ内のファイル...
-
excel VBA の条件をつけての列...
-
10個の整数を入力して小さい順...
-
文字列をソートする方法
-
excel VBA リストビューの行...
-
DataGridViewの複数列を連動し...
-
2次元配列を複数項目でソートし...
-
csvファイル内にてソートす...
-
n番目に大きい数を求めるアル...
おすすめ情報