Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1710 / 13645 ツリー ←次へ | 前へ→

【72444】並べ替えについて2 マリモ 12/8/10(金) 10:58 質問[未読]
【72445】Re:並べ替えについて2 UO3 12/8/10(金) 11:55 発言[未読]
【72446】Re:並べ替えについて2 UO3 12/8/10(金) 12:12 発言[未読]
【72447】Re:並べ替えについて2 マリモ 12/8/10(金) 13:34 お礼[未読]

【72444】並べ替えについて2
質問  マリモ  - 12/8/10(金) 10:58 -

引用なし
パスワード
   おはようございます。
何度もすみませんが教えていただけるとありがたいです。

セルの分け目が表現しにくいので、
,で次のセルを表します。

町名,A,A,B,B,C,C
西町,3,5,2,3,5,6
東町,2,4,1,3,3,5

上記のを下記のように

町名,産業,事業所,従業員数
西町,A,3,5
西町,B,2,3
西町,C,5,6
東町,A,2,4
東町,B,1,3
東町,C,3,5

という感じに並べ替えをしたいです。
A,A,B,B,C,C・・・・
最初に列の最終のペアまで終わったら、
次の行のペアをまた列の最後まで
という繰り返しで読み込むようにしたいです。

宜しくお願いします。

【72445】Re:並べ替えについて2
発言  UO3  - 12/8/10(金) 11:55 -

引用なし
パスワード
   ▼マリモ さん:

こんにちは

配列へのセットの部分は、ループさせてコードをコンパクトにすることもできますが
これぐらいなら、むしろ、ベタな記述のほうがわかりやすいとおもうので以下。

Sub Sample()
  Dim v() As Variant
  Dim k As Long
  Dim c As Range
  
  With Sheets("Sheet1")
    ReDim v(1 To .Rows.Count, 1 To 4)  '転記用配列
    'A2からA列のセルを1つずつ抽出
    For Each c In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
      k = k + 1
      v(k, 1) = c.Value
      v(k, 2) = .Range("B1").Value
      v(k, 3) = c.Offset(, 1).Value
      v(k, 4) = c.Offset(, 2).Value
      k = k + 1
      v(k, 1) = c.Value
      v(k, 2) = .Range("D1").Value
      v(k, 3) = c.Offset(, 3).Value
      v(k, 4) = c.Offset(, 4).Value
      k = k + 1
      v(k, 1) = c.Value
      v(k, 2) = .Range("F1").Value
      v(k, 3) = c.Offset(, 5).Value
      v(k, 4) = c.Offset(, 6).Value
    Next
    
    .Cells.ClearContents
    .Range("A1:D1").Value = Array("町名", "産業", "事業所", "従業員") '新しいタイトル行
    .Range("A2").Resize(k, UBound(v, 2)).Value = v
  End With
  
  MsgBox "作成完了"
        
End Sub

【72446】Re:並べ替えについて2
発言  UO3  - 12/8/10(金) 12:12 -

引用なし
パスワード
   ▼マリモ さん:

一応、ループをコンパクトにしたコードもアップしておきます。
(それと、このケースなら、関数の達人さんは、きっと関数でえいやっとやると思います)

Sub Sample2()
  Dim v() As Variant
  Dim k As Long
  Dim c As Range
  Dim x As Long
  Dim z As Long
  
  With Sheets("Sheet1")
    ReDim v(1 To .Rows.Count, 1 To 4)  '転記用配列
    'A2からA列のセルを1つずつ抽出
    For Each c In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
      For x = 1 To 3
        k = k + 1
        v(k, 1) = c.Value
        v(k, 2) = .Range("B1").Offset(, (x - 1) * 2).Value
        v(k, 3) = c.Offset(, (x - 1) * 2 + 1).Value
        v(k, 4) = c.Offset(, (x - 1) * 2 + 2).Value
      Next
    Next
    
    .Cells.ClearContents
    .Range("A1:D1").Value = Array("町名", "産業", "事業所", "従業員") '新しいタイトル行
    .Range("A2").Resize(k, UBound(v, 2)).Value = v
  End With
  
  MsgBox "作成完了"
        
End Sub

【72447】Re:並べ替えについて2
お礼  マリモ  - 12/8/10(金) 13:34 -

引用なし
パスワード
   ▼UO3 さん:

何度もありがとうございます。
2通りのやり方を教えてくださり、ありがとうございます。
両方とも、欲しい動作結果になりました。
確かに関数やアクセスでも出来る内容だと思いますが
私は関数もアクセスも使いこなせるようなレベルではありません。

分からない壁にぶつかってはこの質問箱を
利用させていただいていますので大変、助かっております。
ありがとうございました。

1710 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free