人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excelのマクロについて質問です。
マクロは全くの初心者ですが、仕事で必要に迫られて、マクロを使わなくてはいけない切羽詰った状況です。
以下のような表をマクロを使って並び替えをしたいです。
A1 B1 C1・・・
A2 B2 C2
A3 B3 C3



という表を
A1
B1
C1
A2
B2
C2
A3
B3
C3



と並び替え、同様な複数のシートを1枚のシートに編集したいのですが、どのようなマクロを組んだらよいのか分かりません。
行は365行、列は24列です。
初歩的な質問で申し訳ありませんが、どなたか教えて下さい。よろしくお願い致します。

●質問者: simasan
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:24 A1 A3 b2 C3
○ 状態 :終了
└ 回答数 : 2/4件

▽最新の回答へ

1 ● kill_me
●30ポイント

Sub 並べ替え()

Dim sheet1 As Variant

Dim sheet2 As Variant

Dim x As Integer

Dim y As Integer

Dim xx As Integer

sheet1 = ActiveSheet.Name

Worksheets.Add

sheet2 = ActiveSheet.Name

Do Until y = 24

Do Until x = 365

Worksheets(sheet2).Range("a1").Offset(xx, 0).Value = Worksheets(sheet1).Range("a1").Offset(y, x).Value

x = x + 1

xx = xx + 1

Loop

x = 0

y = y + 1

Loop

End Sub

もとデータのシートがアクティブな状態で実行すれば、

これでできると思います。

ちなみに、ものすごくおせっかいだったら申し訳ないのですが、

行が365で列が24でいいんですよね??逆ではないですよね?

私のエクセルは古いため、行が256までしかないので、

心配になってしまいました…。


もし万が一逆のようでしたら、

Do Until y = 24

Do Until x = 365

Do Until y = 365

Do Until x = 24

に変更していただければ大丈夫です。

余計なお世話だったらすいません…。

お仕事が無事に終わることをお祈り申し上げます。

◎質問者からの返答

回答ありがとうございます。

参考にさせて頂きました。

ちなみに行が365で列が24ですが、細かなところまでお気遣い頂き、ありがとうございました。


2 ● Mook
●60ポイント

列が256を越えることはないですね。

列と行を入れ替えました。


多分24時間365日だと思いますので、1列目に0?23の数値をふり、

24時間ごとに線を引いてみました。


もしこちらを先に開いたら、先の回答は開封不要です。

Const numOfRow = 365 ' --- データの列数
Const numOfCol = 24 ' --- データの行数

'------------------------------------------------------
' 1枚目に新しく集計用シートを作成し、
' 2枚目以降の numOfRow(行数) × numOfCol(列数)
' のデータを先頭シートに1列にコピーします。
'------------------------------------------------------
Sub reOrder()
'------------------------------------------------------
 Dim dstWs As Worksheet
 Dim srcWs As Worksheet
'--- 先頭に集計用のシートを追加
 Set dstWs = Worksheets.Add(before:=Worksheets(1))
 
 Dim c As Long
 Dim r As Long
 dstWs.Range("A1").Resize(365 * 24, Worksheets.Count).Borders.Weight = xlHairline
 For r = 1 To 24 * 365
 Cells(r, "A").Value = (r - 1) Mod 24
 If r Mod 24 = 1 Then
 With Range("A" & r).Resize(24, Worksheets.Count)
 .Borders(xlEdgeTop).Weight = xlThin
 .Borders(xlEdgeBottom).Weight = xlThin
 End With
 End If
 Next
 
 For Each srcWs In Worksheets
 Application.ScreenUpdating = False
 If srcWs.Index >= 2 Then
 For r = 1 To numOfRow
 For c = 1 To numOfCol
 dstWs.Cells((r - 1) * numOfCol + c, srcWs.Index).Value _
 = srcWs.Cells(r, c).Value
 Next
 Next
 End If
 Application.ScreenUpdating = True
 DoEvents
 Next
End Sub
◎質問者からの返答

ありがとうございます。

ご推察のとおり、24時間365日のデータです。

おかげさまで、業務をなんとか乗り切ることが出来そうです。

今回の機会に、少しはマクロを勉強してみようと思います。

今回は、本当にありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ