Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Excel 2021)
並べ替え
投稿日時: 25/11/15 19:45:44
投稿者: 青空ひかり

    すいません
並べ替えの数字を間違えていました
 
    
     N  O  P   Q   R  S
 
53     T    1    2    3    4    5    6
54     C    7    8    9    10    11    12
55    Be    13    14    15    16    17    18
56     G    19    20    21    22    23    24
57    S    25    26    27    28    29    30
58     D    31    32    33    34    35    36
                            
                            
        N  O  P   Q   R  S
        
63    T    2    1    4    3    5    6
64    C    14    13    10    9    11    12
65    Be    20    19    16    15    17    18
66    G    19    20    21    22    23    24
67    S    26    25    28    27    29    30
68    D    32    31    34    33    35    36
 
D4からU9の範囲に3つののセルを並べ替える
D4からF4が1番目G4からI4が2番目J4からL4が3番目
P9からR9が35番目S9からU9が36番目の順に並べ変えたいと考えてます。
1列目が1から6番目 2列目が7から12番目  6列目が31から36番目という感じで
並べ替えができますか。
 
N53からS58間に1から36の順に並んでいます。(転記元)
N63からS68間に並べ替える方法を教えてください。(転記先)
 
宜しくお願いします。
 
 

回答
投稿日時: 25/11/15 23:05:37
投稿者: simple

例えばこんな説明の仕方があるでしょう。
 
■説明例
D4:U9までのセルを、3個ずつグループ番号をつけるとします。
D4:F4 が 第1グループで、G4:I4 が第2グループです。
以下同様にして、S9:U9が第36ブループです。
 
実行したいのは、N64セル以下の情報をもとに、グループ単位で順序を入れ替えて、
D14からU19の範囲内に転記することです。
 
N64:S68までのセル範囲に、転記元のグループ番号を入れてあります。

     N   O   P   Q   R   S
63   2   1   4   3   5   6
64   8   7  10   9  11  12
65  14  13  16  15  17  18
66  19  20  21  22  23  24
67  26  25  28  27  29  30
68  32  31  34  33  35  36

例えば、N63の2というのは、第2グループの3セルを、
D14:U19の第1グループに転記してください、と言う意味です。
 
このようにして、グループ単位でシャッフルしたいと思っています。
どのようにしたらよいでしょうか。
 
想定結果は次のとおりです。
【D4:U9】(転記元データ)
1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18
19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
91  92  93  94  95  96  97  98  99  100 101 102 103 104 105 106 107 108

【D14:U19】(転記先への転記結果)
4   5   6   1   2   3   10  11  12  7   8   9   13  14  15  16  17  18
22  23  24  19  20  21  28  29  30  25  26  27  31  32  33  34  35  36
40  41  42  37  38  39  46  47  48  43  44  45  49  50  51  52  53  54
55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
76  77  78  73  74  75  82  83  84  79  80  81  85  86  87  88  89  90
94  95  96  91  92  93  100 101 102 97  98  99  103 104 105 106 107 108

■コードは以下です。
Sub test()
    Dim j&, j2&, k&, k2&, v&, r0&, c0&, r&, c&
    For j = 1 To 5
        j2 = j + 62
        For k = 1 To 6
            k2 = k + 13
            v = Cells(j2, k2)           '転記元index
            r0 = Int((v - 1) / 6) + 4   '転記元行番号
                                        '提示例では  r0 = j + 3でも可?
            c0 = ((v - 1) Mod 6) * 3 + 1'転記元列番号
            
            r = 13 + j                  '転記先行番号
            c = 3 * (k - 1) + 4         '転記先列番号
            Cells(r0, c0).Resize(1, 3).Copy Cells(r, c)
        Next
    Next
End Sub

投稿日時: 25/11/16 09:01:55
投稿者: 青空ひかり

列 D  E    F    G    H    I    J    K    L    M    N    O    P    Q    R    S    T    U
                                                                    
行勝     分    負    勝    分    負    勝    分    負    勝    分    負    勝    分    負    勝    分    負
4 --    --    --    13    1    7    13    0    9    15    1    5    15    1    6    15    0    7
5 7    1    13    --    --    --    14    1    9    16    0    8    12    1    9    10    1    10
6 9    0    13     9    1    14    --    --    --    9    0    12    12    1    8    14    1    6
7 5    1    15    8    0    16     12    0    9    --    --    --    14    0    8    13    1    7
8 6    1    15    9    1    12    8    1    12    8    0    14    --    --    --    13    0    10
9 7    0    15    10    1    10    6    1    14    7    1    13    10    0    13    --    --    --
  
D     E    F    G    H    I    J    K    L    M    N    O    P    Q    R    S    T    U
                                                                    
  勝     分    負    勝    分    負    勝    分    負    勝    分    負    勝    分    負    勝    分    負
14 -- --    --    13    1    7    13    0    9    15    1    5    15    1    6    15    0    7
15 7 1    13    --    --    --    14    1    9    16    0    8    12    1    9    10    1    10
16 9 0    13     9    1    14    --    --    --    9    0    12    12    1    8    14    1    16
17 5 1    15    8    0    16     12    0    9    --    --    --    14    0    8    13    1    7
18 6 1    15    9    1    12    8    1    12    8    0    14    --    --    --    13    0    10
19 7 0    15    10    1    10    6    1    14    7    1    13    10    0    13    --    --    --
                                                                    
 
    
 
 
 
        N  O  P  Q  R  S
53         1    2    3    4    5    6
54         7    8    9    10    11    12
55      13    14    15    16    17    18
56         19    20    21    22    23    24
57         25    26    27    28    29    30
58         31    32    33    34    35    36
                            
        N  O  P  Q  R  S                    
63        2    1    4    3    5    6
64        8    7    10    9    11    12
65        14    13    16    15    17    18
66        20    19    22    21    23    24
67        26    25    28    27    29    30
68        32    31    34 33    35    36
 
並べ替えのイメージとしてはこんな感じで並べ替えたいと思ってます。
D4からU9の範囲に3つののセルを並べ替える
D4からF4が1番目G4からI4が2番目J4からL4が3番目
P9からR9が35番目S9からU9が36番目の順に並べ変えたいと考えてます。
1列目が1から6番目 2列目が7から12番目  6列目が31から36番目という感じで
並べ替えができますか。
  
N53からS58間に1から36の順に並んでいます。(転記元)
N63からS68間に並べ替える方法を教えてください。(転記先)
宜しくお願いします。

回答
投稿日時: 25/11/17 06:09:33
投稿者: simple

間違って別のコードを示してしまったようで、閲覧者さん失礼しました。
( D14:U19の結果例は手で作る訳はなく、コードの実行結果なのですが、
  作成途上のコードが残っていて間違ってコピペして投稿してしまったようです。理由は今もって謎です)
 
コードは以下です。

Sub test()
    Dim j&, j2&, k&, k2&, v&, r0&, c0&, r&, c&
    For j = 1 To 6
        j2 = j + 62
        For k = 1 To 6
            k2 = k + 13
            v = Cells(j2, k2)            '転記元group番号
            
            r0 = Int((v - 1) / 6) + 4    '転記元行番号
            c0 = ((v - 1) Mod 6) * 3 + 4 '転記元列番号
            
            r = 13 + j                   '転記先行番号
            c = 3 * (k - 1) + 4          '転記先列番号
            Cells(r0, c0).Resize(1, 3).Copy Cells(r, c)
        Next
    Next
End Sub

私はこれまでとします。
 
# なお、質問者さんのサンプルはD4:U9とD14:U19が全く同じだったり、理解に苦しみます。
# 今後は丁寧な説明をお願いします。

投稿日時: 25/11/17 08:57:33
投稿者: 青空ひかり

simpleさん
ご指導ありがとうございました。