Excel VBAでfunctionを勉強しています。
やりたいことは、二次元配列の並べ替えです。
ID順に(昇順)に並べ替えです
ちなみに、一次元配列の並べ替えは、下記のようにしました。
戻り値を受け取る方法です。
Sub aaa()
Dim z As Variant
Dim a() As Variant
Dim j As Long, i As Long
maxrow = Cells(Rows.Count, "A").End(xlUp).Row
a = Application.Transpose(Range("A1:A22").Value)
z = SortArray(a(), 0)
For i = 1 To maxrow
For j = 0 To UBound(z)
Cells(i, 2) = z(i)
Next j
Next i
End Sub
Function SortArray(X() As Variant, Optional s As Long = 0) As Variant
Dim k As Long
Dim ub As Long
Dim y() As Variant
ub = UBound(X)
ReDim y(ub)
For k = 1 To ub
If s = 0 Then
y(k) = WorksheetFunction.Small(X(), k)
Else
y(k) = WorksheetFunction.Large(X(), k)
End If
Next k
SortArray = y()
End Function
このコードを参考に、二次元配列の並べ替えを考えました。
トンチンカンな質問かもしれませんが
考えたことは、
1.Functionに範囲を渡して並べ替えをして、結果をSubに返す
2.配列の戻り値をSubに返す。
それで、下記のコードを考えましたが、途中で分からなくなりました。
Sub 並べ替え()
Dim myarr() As Variant
myarr = Range("A1:B22")
ここのコードがわからないです。
End Sub
Function myArray(myRange As Range) As Variant
Dim i As Long, j As Long
For i = LBound(myarr, 1) To UBound(myarr, 1)
For j = LBound(myarr, 2) To UBound(myarr, 2)
ここのコードがわからないです。
Next j
Next i
End Function
配列の戻り値でできなくて、範囲を渡すほうでも考えましたができまでんでした。
お手数ですが、ご教示をお願いします。
No.3ベストアンサー
- 回答日時:
初級レベルなジジィなので小難しい事に脳が追いつきませんので、結果が出たコードを提示するのみにします。
Sub megu()
Range("D1").Resize(13, 2).Value = Sorted(Range("A1:B13"))
End Sub
Function Sorted(a As Range) As Variant
Dim i As Integer
Dim n As Integer
Dim b As Variant, c As Variant
b = a.Value
c = b
For i = 2 To UBound(b, 1)
n = WorksheetFunction.Rank(b(i, 1), a, 1)
c(n + 1, 1) = n
c(n + 1, 2) = b(i, 2)
Next
Sorted = c
End Function
No.2
- 回答日時:
Sub・・・End Sub
Function・・・End Function
のような操作の流れをプロシージャーと呼びます。
どちらも引数(=()内の変数)を渡すことができるのですが、大きな違いはFunctionプロシージャーが戻り値を返すことができることです。
ですから、
>1.Functionに範囲を渡して並べ替えをして、結果をSubに返す
>2.配列の戻り値をSubに返す。
おそらく2は「並べ替えるべき配列をFunctionへ渡し」が省略されているものと思いますが、この2つでは大きな差が生じます。
1の場合(範囲を渡す)
myarr = Range("A1:B22")
z = myArray(myarr, 0)
のようにして
Function myArray(myRange As Range) As Variant
を作るような構文になりますが、
2の場合(配列を渡す)
a = Application.Transpose(Range("A1:B22").Value)’ここで渡すべき配列を準備
z = myArray(a())
のようにして
Function myArray(X() As Variant, Optional s As Long = 0) As Variant
を作ることになります。
お気づきになりました?
質問の構文はどっち付かずなのです。
また、残念なお知らせがあります。
参考にした
WorksheetFunction.Small(X(), k)
WorksheetFunction.Large(X(), k)
は小さい方から(または大きい方から)何番目の値を返す関数ですので利用できません。
小さい方から(または大きい方から)何番目のID値(=ソートキー)を持つ値(ここでは名前)を得なければいけないのです。
Functionの勉強中ということですので、とりあえずこの程度にしておきますが、「Subプロシージャに引数として範囲を渡し、その範囲をID順に並べ替える」というSubプロシージャも作ることができるのです。
以下、老婆心
maxrow = Cells(Rows.Count, "A").End(xlUp).Row ’A列の最終行を検出
a = Application.Transpose(Range("A1:A22").Value)’A1:A22を配列に収納
z = SortArray(a(), 0)’関数SortArrayに引数として渡し、ソートされた結果を配列zに収納
For i = 1 To maxrow’なぜ最終表まで?
For j = 0 To UBound(z)’なぜ配列Zの因子の数?
Cells(i, 2) = z(i)’ i、jのどちらか一方で十分では?
Next j
Next i
No.1
- 回答日時:
こんにちは
「二次元配列の並び替え」って、どのような内容を考えているのでしょうか?
添付の画像を見ると、なんとなく、キー(列または行)を指定して、それに従って並べ変えることのように思われますけれど・・・
もしも、添付画像のようなデータを「ID順に並べ替えたい」とか、「氏名順に並べ替えたい」といったことを意味しているのなら、そのままシート上で並べ替えを行ってしまった方が簡単です。
(Sortメソッドが用意されていますので・・・)
※ 意味が違っていたなら、スルーしてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
VBA 1次元配列を2次元に追加する
-
subの配列引数をoptionalで使う...
-
2つ以上の変数を比較して最大数...
-
《エクセル2000》A列・B列の商...
-
配列変数の添字が範囲外ですと...
-
配列を任意の数値で埋める方法
-
ArrayListの初期値に二次元配列...
-
[Excel2000_VBA] 型が一致しま...
-
Excel-VBAの配列「Public Const...
-
linest関数に配列を渡す
-
for each の現在の配列ポインタ...
-
2次元動的配列の第一引数のみを...
-
VB6 配列を初期化したい
-
ビンゴ
-
VBのFunctionで、配列を引数...
-
配列内の内容を全て表示する方法
-
VLOOKUP関数で、一番下...
-
50音
-
delphiで配列を、コピーするには。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
for each の現在の配列ポインタ...
-
VBのFunctionで、配列を引数...
-
subの配列引数をoptionalで使う...
-
VB6 配列を初期化したい
-
ListViewで、非表示列って作れ...
-
配列変数の添字が範囲外ですと...
-
Excel-VBAの配列「Public Const...
-
2次元動的配列の第一引数のみを...
-
VBAで近似曲線の係数取得
-
VLOOKUP関数で、一番下...
-
配列に同じ値を入れる方法
-
エクセルで最小値から0を除く方法
-
linest関数に配列を渡す
-
配列を任意の数値で埋める方法
-
Dim は何の略ですか?
-
配列内の内容を全て表示する方法
おすすめ情報