[[20190311173809]] 『複数の列を一行にまとめるには』(みず) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数の列を一行にまとめるには』(みず)

ご教授お願い致します。

エクセルのシートに区切り位置機能でスペースごとに処理すると
J列から最大AB列まで約19列ほどでるデータを一行にまとめる必要が
あり、一列ごと切り取りして一列になるよう貼り付けしてという作業が
多くなにか良い方法はないかと思い投稿させて頂きました。

関数よりマクロの方が便利そうなのですが、複数列を一列に並べる良い方法はございませんでしょうか?

列の最終行はそのときどきで変わりますので、
そこはCells(Rows.Count, "A").End(xlUp).Row
みたいな感じでセルの最後までという命令を出せばよいと思うのですが。。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 回答では有りませんが。。。
 素朴な疑問が。。。

 >>エクセルのシートに区切り位置機能でスペースごとに処理

 処理しなければ良いのでは。 
 m(_ _)m
(隠居じーさん) 2019/03/11(月) 17:59

区切り位置機能は言うべきではございませんでした。
区切り位置をしたあとに不要な文字は置換などで削除しています。

複数列を一列にする良い方法でアドバイスなど頂ければ嬉しいです。
(みず) 2019/03/11(月) 18:30


 AC列に出す案
    Sub test()
        Dim i As Long
        For i = 1 To Cells(Rows.Count, "J").End(xlUp).Row
            Cells(i, "AC").Value = Join(Evaluate(Columns("J:AB").Rows(i).Address & "&"""""), ",")
        Next i
    End Sub
 19列を1列でいいんですよね? 行じゃないですよね?
(稲葉) 2019/03/11(月) 18:41

稲葉様

ご提案頂き誠に有難うございます。
列であっております。

マクロを実行致しましたら、セルにコンマ区切りでまとまっておりましたので
私のご説明に不備がございました。

アナログでする場合、AC列に出す場合
各列をAC列の最後尾に貼り付けていくという言い方でよろしいでしょうか。。

TEST1
TEST2
TEST3

とJ列にあるとしてK列に
TEST99
TEST88

とあるとしたら
TEST1
TEST2
TEST3
TEST99
TEST88

と一列にするという流れです。

いかがでしょうか?

(みず) 2019/03/11(月) 18:52


 2行目以降はどうなりますか?
(稲葉) 2019/03/11(月) 18:59

 あ、例が行のことですか、勘違いしました
 少々お待ちください
(稲葉) 2019/03/11(月) 19:01

 こんばんは^^ 
J1〜AB6まで何か情報が有るシート名、Sheet1がじょうけんで。
Option Explicit
Sub main()
    Dim i As Long
    Dim buf As Variant
    Dim tmp As Variant
    With Worksheets("Sheet1")
        buf = .Cells(1, 10).CurrentRegion
        For i = 2 To UBound(buf, 1)
            tmp = Join(WorksheetFunction.Index(buf, i, 0))
            MsgBox tmp
        Next
    End With
End Sub
でも ^^;
でわ
あれ!編集がかぶっていまして。これではだめなんですね。?^^;
m(_ _)m
(隠居じーさん) 2019/03/11(月) 19:10

 sub test2
     dim c as long
     for c = 10 to 28
         range(cells(1,c),cells(rows.count,c).end(xlup)).copy cells(rows.count,"ac").end(xlup).offset(1)
     next c
 end sub
 ac列の一行目が空白だと、一行空白のままですがどうでしょう?
(稲葉) 2019/03/11(月) 19:12

 (隠居じーさん) 2019/03/11(月) 19:10
は廃案で。何かの参考にでも。m(_ _)m。。。失礼致しました。
(隠居じーさん) 2019/03/11(月) 19:19

 隠居じーさんさんのINDEX案もいいですね!
 joinしないで、そのまま書き出せば変更あまりしないでいけそうじゃないですか?
(稲葉) 2019/03/11(月) 19:24

 J:AB 各列の空白を除いて ADの2行目から出力

 Sub test()
     Dim i As Long, x
     With Range("j1", Cells.SpecialCells(11)).Resize(, 19)
         For i = 1 To .Columns.Count
             x = Filter(.Worksheet.Evaluate("transpose(if(" & .Columns(i).Address & _
                "<>""""," & .Columns(i).Address & "))"), False, 0)
             If UBound(x) > 0 Then Range("ad" & Rows.Count).End(xlUp)(2).Resize(UBound(x) + 1).Value = _
                        Application.Transpose(x)
         Next
     End With
 End Sub
(seiya) 2019/03/11(月) 19:25

稲葉さん、隠居じーさんさん、seiyaさん

ご提案有難うございます!
明日以降試してみてまたご連絡致します(^^)

このようなお時間にご対応感謝致します!!
(みず) 2019/03/11(月) 19:33


おはようございます。

稲葉さん
無事一列にまとまりお伝えしたかった処理ができました!
短めのコードで分かりやすく編集もできそうなので助かりました。

seiyaさん
同じく一列にまとまりました!有難うございます!
当方では初めてみるコード名が多数ありなんとなく中級者向け?と思っており、
よろしければどういう処理をしていっているかアドバイス頂けないでしょうか?

隠居じーさんさん
sheet4でリストがございましたので、sheet1を4に変更しました!
msgboxでリスト内の文言がでてac列などにまとまっている様子がなく当方では
分かりませんでした。申し訳ございません。

(みず) 2019/03/12(火) 09:36


 いえ、お役に立てず。済みませんでした。
楽しく勉強させて頂きました。
みずさん
稲葉さん
Seiyaさん
有難うございました。
m(_ _)m
(隠居じーさん) 2019/03/12(火) 10:31

 仕組み的にはseiyaさんのコードのほうが良いと思いますよ。
 私の場合は、途中に空白セルがあっても、そのまま最終行分までコピーしてしまうので
 seiyaさんの場合は、途中に空白セルがあった場合、行間を詰めて表示してくれるはずです。

 J列  K列
 TEST1 TEST2
    TEST2
 TEST1 TEST2

 稲葉結果 seiyaさん結果
 TEST1    TEST1
          TEST1
 TEST1    TEST2
 TEST2    TEST2
 TEST2    TEST2
 TEST2

(稲葉) 2019/03/12(火) 10:38


 初級、中級、上級が何を意味するのか分かりませんが、過去には上級者と思われる人の中には邪道という人もいました。

 やっていることは大したことではありません。

 >TEST1 
 >TEST2 
 >TEST3 
 >TEST99 
 >TEST88 

 このようにしたい、ということは各列の空白を詰めて一列に纏めたいと理解したので、

              x = Filter(.Worksheet.Evaluate("transpose(if(" & .Columns(i).Address & _
                "<>""""," & .Columns(i).Address & "))"), False, 0)

 で一列の空白を除いた値のみを x という配列に格納しAD列の最終行に出力しています。

 私の結果でよければ

 Sub test()
     Dim a, b, e, n As Long
     a = Range("j1", Cells.SpecialCells(11)).Resize(, 19)
     ReDim b(1 To UBound(a, 1) * UBound(a, 2), 1 To 1)
     For Each e In a
         If e <> "" Then
             n = n + 1
             b(n, 1) = e
         End If
     Next
     [ad1].Resize(n).Value = b
 End Sub

 で済むでしょうし、此方の方が配列を理解していれば簡単な書き方です。
(seiya) 2019/03/12(火) 11:15

 私のほうも手直し・・・
    Sub test2()
        Dim c As Long
        Range("AC:AC").ClearContents
        For c = 10 To 28
            Range(Cells(1, c), Cells(Rows.Count, c).End(xlUp)).Copy Cells(Rows.Count, "ac").End(xlUp).Offset(1)
        Next c
        Range("AC:AC").SpecialCells(xlCellTypeBlanks).Delete
    End Sub
 最後に空白セル削除で!
(稲葉) 2019/03/12(火) 12:02

seiyaさん 稲葉さん

ご回答誠に有難うございます!
大変勉強になりました。

作業が格段に速くなりました!
(みず) 2019/03/13(水) 14:10


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.