Excel (VBA)

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

 
(Windows 10 Pro : Microsoft 365)
30列x n行を 50行単位にまとめたい
投稿日時: 22/11/07 14:00:39
投稿者: えっくん

お世話になります。
以下のような数字(下記は連番ですが実際は違います)が1行ごとに30個、1000行以上あります。
1234,,,30
31,32,33,,,60
60,61,,,,,,90
 
これを以下の様に並び替えたいのです。(別シートに並び替え後ができても構いません。
1,2,3,,,,,50
51,51,53,,,60
61,62,63,,,90
 
最初はマクロの記録でやろうとしたいのですが、挫折してしまいました。
お知恵を拝借したく、よろしくお願いいたします。
 
 

回答
投稿日時: 22/11/07 16:18:45
投稿者: んなっと

A1から並んでいるとして
 
   A  B  C  D  E  F  G  H  I
1 101 102 103 104 105 106 107 108 109
2 201 202 203 204 205 206 207 208 209
3 301 302 303 304 305 306 307 308 309
4 401 402 403 404 405 406 407 408 409
5 501 502 503 504 505 506 507 508 509
 
 
同じシートのずっと右の方
AG1
=MAKEARRAY(70,50,LAMBDA(r,c,INDIRECT(TEXT(LET(x,(r-1)*50+MOD(c-1,50)+1,100*INT((x+29)/30)+MOD(x-1,30)+1),"!R0C00"),)))
 
  AG  AH  AI  AI  AK  AL  AM  AN  AO
1 101 102 103 104 105 106 107 108 109
2 221 222 223 224 225 226 227 228 229
3 411 412 413 414 415 416 417 418 419
 

回答
投稿日時: 22/11/07 16:35:40
投稿者: 半平太

 1.ちょっと仕様が分かりにくいのですが。
  
 >30列x n行を 50行単位にまとめたい
 ですよね?
 
 >1,2,3,,,,,50
 >51,51,53,,,60
 >61,62,63,,,90
 この希望図って、上のタイトルと整合性が取れているんですか?
  
 結果図の個数は、50個,10個,30個ですよね?
 普通は、50個、50個、50個、50個、・・・か
     50個、10個、50個、10個 ・・・かを推測するんですが。。
  
 2.バージョンは、Microsoft 365とのことですが、
   TOCOL() と WRAPROWS()は使えないのでしょうか?
  
 

回答
投稿日時: 22/11/07 16:39:21
投稿者: simple

引用:
これを以下の様に並び替えたいのです。(別シートに並び替え後ができても構いません。
1,2,3,,,,,50
51,51,53,,,60
61,62,63,,,90
ルールが読み取れないので、日本語で説明してもらえないですか?

回答
投稿日時: 22/11/07 16:56:08
投稿者: んなっと

やっていることはこれと同じです。
 
  Dim r As Long
  Dim c As Long
  Dim x As Long
  Dim v(1 To 70, 1 To 50)
  For r = 1 To 70
    For c = 1 To 50
      x = (r - 1) * 50 + (c - 1) Mod 50 + 1
      v(r, c) = Cells(Int((x + 29) / 30), (x - 1) Mod 30 + 1).Value
    Next c
  Next r
  Range("AG1").Resize(70, 50).Value = v

回答
投稿日時: 22/11/07 17:01:07
投稿者: んなっと

なるほど、半平太さんの方法でできますね。
 
AG1
=WRAPROWS(TOCOL(A1:AD1000),50)
 
はるかに簡単です。わたしのはなしで。
知らなかったので、勉強になりました。

投稿日時: 22/11/07 19:22:18
投稿者: えっくん

皆さん、すみません。
 
30列x n行を 50列単位にまとめたい
 
以下のような数字(下記は連番ですが実際は違います)が1行ごとに30個、1000行以上あります。
1,2,3,4,,,30
31,32,33,,,60
60,61,62,,,90
  
これを以下の様に並び替えたいのです。(別シートに並び替え後ができても構いません。
1,2,3,,,50
51,51,53,,,100
101,102,103,,,150
 
でした。混乱させてすみませんでした。

投稿日時: 22/11/07 20:03:46
投稿者: えっくん

AG1=WRAPROWS(TOCOL(A1:AD1000),50)とすることで実現できました。
今までの苦労がこういうことでできるなんて感激です。
本当にありがとうございました。
 
もう少しお願いします。
300行とかで終わっているときに並び替えのない領域が0になります。
AG1=WRAPROWS(TOCOL(A1:AD1000),50,"")としたのですが、0が見えています。
 
他のセルで以下のような計算させるとD33が200では空白に見えます。
=IF(D33>1000,"〇","")
WRAPROWSでの【""】の使い方が違うのでしょうか。

回答
投稿日時: 22/11/07 23:17:18
投稿者: 半平太

1000行以上もあったり、300行程度しかなかったりするんですか?
 
出来ればですが、無駄に広い範囲を指定したくないのでお尋ねします。
 
1.A列のデータは途中で空白ってあるんでしょうか?
2.実際のデータは、数値ですか、文字列ですか、混在ですか?
 
>WRAPROWSでの【""】の使い方が違うのでしょうか。
データ数が中途半端で、「想定した列数」を満たさない場合に埋めるデータです。

回答
投稿日時: 22/11/07 23:56:20
投稿者: 半平太

考えたら、VBA板ですね。
こんなのでAG1セルに数式を埋めればいいんじゃないですか?

Sub Sample()
    Const fml As String = "=WRAPROWS(TOCOL(IF(Range="""","""",Range)),50,"""")"
    Dim r As Range
    
    Set r = Range("A1").End(xlToRight).CurrentRegion.Resize(, 30)
    Range("AG1").Formula2Local = Replace(fml, "Range", r.Address(0, 0))
End Sub Sub

回答
投稿日時: 22/11/08 07:30:25
投稿者: んなっと

こんなのも。
 
AG1
=LET(x,TOCOL(A1:AD1000),y,TAKE(x,CEILING(MATCH(10^9,x),50)),w,IF(y="","",y),WRAPROWS(w,50))

投稿日時: 22/11/08 09:01:08
投稿者: えっくん

半平太 さんの引用:
1000行以上もあったり、300行程度しかなかったりするんですか?
 
出来ればですが、無駄に広い範囲を指定したくないのでお尋ねします。
>今回の確認作業で行を減らして作業したところ、0が見えていたので消せないかな
>と思った次第です。
 
1.A列のデータは途中で空白ってあるんでしょうか?
>途中に空白はありません。
2.実際のデータは、数値ですか、文字列ですか、混在ですか?
>数値です。
 
>WRAPROWSでの【""】の使い方が違うのでしょうか。
データ数が中途半端で、「想定した列数」を満たさない場合に埋めるデータです。
>そのために""で空白表示にさせたかったのですが、、なぜか0のままです。
"×"としても0表示のままなんです。
 

 

回答
投稿日時: 22/11/08 12:17:34
投稿者: 半平太

>>そのために""で空白表示にさせたかったのですが、、なぜか0のままです。
>"×"としても0表示のままなんです。
 
そちらの例はデータが多過ぎの話です。(空白データも含めれば、ですが)
まぁ、それでも予定列数に合致しなければ"*"が出るハズです。
 
以下のサンプル(A1:C3)でテストしてみてください。
※9個に対し、10個出力が必要な場合です。

(1) E1セル =WRAPROWS(TOCOL(A1:C3),2)
(2) H1セル =WRAPROWS(TOCOL(A1:C3),2,"*")
(3) K1セル =WRAPROWS(TOCOL(IF(A1:C3="","",A1:C3)),2,"*")

行 _A_ _B_ _C_ _D_ _E_ __F__ _G_ _H_ _I_ _J_ _K_ _L_
 1  1       3       1     0       1   0       1    
 2  4   5           3     4       3   4       3   4
 3                  5     0       5   0       5    
 4                  0     0       0   0            
 5                  0  #N/A      0   *           *  

回答
投稿日時: 22/11/08 12:32:42
投稿者: hatena
投稿者のウェブサイトに移動

FILTERで空白行を取り除いてからTOCOLするとか
 

=WRAPROWS(TOCOL(FILTER(A1:AD1000,A1:A1000<>"")),50,"")

TOCOLの第2引数で 1-空白を無視する を設定するとか
 
=WRAPROWS(TOCOL(A1:AD1000,1),50,"")

ではどうですか。

投稿日時: 22/11/10 13:02:54
投稿者: えっくん

皆さんへ
色々とアドバイスいただき誠にありがとうございました。
目的のことができた上に、新たな情報も頂き今後に活用させていただきます。
 
これでクローズとさせていただきます。 Surprised