質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2524閲覧

エクセルで横に格納されたデータを縦に変換

tokumeikibou162

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/06 08:02

編集2020/08/06 08:35

現在エクセルで横に格納したデータを縦に変換する処理を行っています。
ネット上で自分なりに検索して処理を作っているのですが、うまくいかず原因を探ろうにも知識不足過ぎるので、なにかしらアドバイス等をもらえればありがたいです。
データ(今後増える予定あり)
イメージ説明

作った処理

Sub

1Set st1 = Sheets("TRAN_QUALIFICATION_HIST") 2Set st2 = Sheets("TRAN_QUALIFICATION_HIST") 3For i = 1 To st1.Cells(Rows.Count, 1).End(xlUp).Row 4For j = 2 To st1.Cells(i, Columns.Count).End(xlToLeft).Column 5For k = 3 To st1.Cells(i, Columns.Count).End(xlToLeft).Column 6n = n + 1 7st2.Cells(n, 1) = st1.Cells(i, 1) 8st2.Cells(n, 2) = st1.Cells(i, j) 9st2.Cells(n, 3) = st1.Cells(i, k) 10Next 11Next 12Next 13End Sub 14コード

結果
イメージ説明

理想イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mdj

2020/08/06 08:20

別のシートにコピーする方法が良いんじゃないかなと思います。 A1→A1 B1→A2 C1→A3 A2→B1 B2→B2 C2→B3 イメージはこういう風にすることを指します。
tokumeikibou162

2020/08/06 08:41

そうですね別のシートにコピーしたほうがよさそうですね ちょっと調べてみます。
guest

回答1

0

ベストアンサー

ExcelVBA

1Sub test2() 2 Dim wsFrom As Worksheet 3 Dim wsTo As Worksheet 4 Dim ixRow As Long 5 Dim ixCol As Long 6 Dim ixRow2 As Long 7 Dim ixCol2 As Long 8 Dim n As Long 9 10 Set wsFrom = Sheets(1) 11 Set wsTo = Sheets(2) 12 13 ixRow2 = 1 14 For ixRow = 1 To wsFrom.Cells(wsFrom.Rows.Count, "A").End(xlUp).Row 15 For ixCol = 1 To wsFrom.Cells(ixRow, wsFrom.Columns.Count).End(xlToLeft).Column 16 ixCol2 = ixCol2 + 1 17 If ixCol2 > 3 Then 18 ixCol2 = 1 19 ixRow2 = ixRow2 + 1 20 End If 21 wsTo.Cells(ixRow2, ixCol2).Value = wsFrom.Cells(ixRow, ixCol).Value 22 Next 23 Next 24End Sub

こんな感じでしょうか?
変数名を意味が分かるように命名すると、
混乱が少ないかもです。
あとは、ステップインで1行ずつ実行しながら、
ローカルウィンドウで変数の中身が意図したように変化確認するとともに、
画面上の変化も確認するとよいかと思います。

考え方としては、
元の列番号が変化するごとに、
書き込みセルの行番号や列番号が変化するときは、
ixCol2 = ixCol2 + 1
のようにカウントアップしてやります。
また3列ひと塊なら、
1からカウントアップして3を超えたときに、
行番号を増やし、列番号は初期値1に戻るので、
「3を超えたとき」を、条件に特別な計算をしてやるといいかと思います。

投稿2020/08/06 09:48

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokumeikibou162

2020/08/06 10:07

わかりやすい解説まで、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問