(VBA) 横並びを縦並びに
kkkkkmさん、毎回アドバイスいただき感謝します。
以下のスレッドが元になります。
https://okwave.jp/qa/q10027270.html
なぜだか?私の質問スレッドが消えてしまいました。
途中で投げ出したような感じで気持ちが悪いので続けます。
以下は、最後のkkkkkmさんの回答への追加質問になります。
>LastRowNum2 = sh2.Cells(Rows.Count, 1).End(xlUp).Row
>の位置がソートの前のあたりに無いと1回目(実行前のsh2にデータが無い時LastRowNum2が1のままなので)ソートしてくれませんでした。
LastRowNum2は、ソートの時のソート範囲にしか利用しないので
おっしゃるようにソートの前で問題ないのですが
sh2にDATAが無い状態とは
マクロが実行されていない最初の状態又は
SH1にDATAが無い状態でマクロを実行した時だけだと思うのですが ?
一応、次回に備えてsh2のシート全体を初期化のため
sh2.Cells.ClearContents
を最初に追加しました。
>D列のソートでいいかどうか、利用者で変更してくれるといいですね。
今回はD列(項目)でソートしていますが
ソートのキーとしてA,B,C,Dの4つが考えられます。
それぞれ優先順位でD-A-B-C や A-B-C-D など色々組み合わせが考えられますが
これの組み合わせを網羅して利用者が選択できるようにするには
簡単では無いような気がします。
勉強のため少し考えてみますが、
考え方(ロジック)や使用すべき関数などを紹介下さい。
>Resize
確かにresizeを使用したほうが分かりやすいですね。
'-------------------------------------
と「ここまで」記載した時点でスレッドが消滅してしまいました。
以下が現在のコード
Option Explicit
Sub Macro1()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim LastRowNum As Long, LastRowNum2 As Long
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
LastRowNum = sh1.Cells(Rows.Count, 1).End(xlUp).Row
'書き出しシート(sh2)の初期化
sh2.Cells.ClearContents
'見出し行
sh2.Range(sh2.Cells(1, "A"), sh2.Cells(1, "D")).Value = sh1.Range(sh1.Cells(1, "A"), sh1.Cells(1, "D")).Value
'同一(ID,名前)
sh2.Range(sh2.Cells(2, "A"), sh2.Cells(LastRowNum, "B")).Value = sh1.Range(sh1.Cells(2, "A"), sh1.Cells(LastRowNum, "B")).Value
sh2.Range(sh2.Cells(LastRowNum + 1, "A"), sh2.Cells(2 * LastRowNum - 1, "B")).Value = sh1.Range(sh1.Cells(2, "A"), sh1.Cells(LastRowNum, "B")).Value
'手術日,項目
sh2.Range(sh2.Cells(2, "C"), sh2.Cells(LastRowNum, "D")).Value = sh1.Range(sh1.Cells(2, "C"), sh1.Cells(LastRowNum, "D")).Value
'手術日,項目(配置換え)
sh2.Range(sh2.Cells(LastRowNum + 1, "C"), sh2.Cells(2 * LastRowNum - 1, "D")).Value = sh1.Range(sh1.Cells(2, "E"), sh1.Cells(LastRowNum, "F")).Value
LastRowNum2 = sh2.Cells(Rows.Count, 1).End(xlUp).Row
'ソート
sh2.Range(sh2.Cells(2, "A"), sh2.Cells(LastRowNum2, "D")).Sort key1:=sh2.Range("D1"), order1:=xlAscending, Header:=xlYes
Set sh1 = Nothing
Set sh2 = Nothing
End Sub