Excel 複数行のデータを1行にするVBA

このQ&Aのポイント
  • ExcelのSheet1に存在するA列~T列までの不規則なデータを1行にまとめる方法をVBAで試みましたが、上手くいきません。特に1行にするマクロが途中で止まります。データが多すぎるため、良い方法がないかと試行しています。プロフェッショナルな方に手助けをお願いしたいです。
  • ExcelのSheet1に存在するA列~T列までの不規則なデータを1行にまとめる方法をVBAで試みましたが、特に1行にするマクロが途中で止まります。データが多すぎるため、良い方法がないかと試行しています。プロフェッショナルな方に手助けをお願いしたいです。
  • ExcelのSheet1に存在するA列~T列までのデータを1行にまとめる方法をVBAで試みましたが、上手くいきません。特に1行にするマクロが途中で止まります。データが多すぎるため、良い方法がないかと試行しています。プロフェッショナルな方に手助けをお願いしたいです。
回答を見る
  • ベストアンサー

Excel 複数行のデータを1行にするVBA

Sheet1にA列~T列まで不規則にデータが存在する 行が500行有ります (1) これを1行にする(VBA) (Sheet2に表示) (2) 1列にして(行列入れ替え) (3) 空白以外を表示する(オートフィルタ) を試みましましたが 上手くいきません 特に(1)のマクロが途中で止まります おそらくデータが多すぎるのだと思います 何とか良い方法が無いかと色々試しますが・・・ その道のプロフェッショナルな方 手を差しのべて頂けないでしょうか? このような感じでやっています Dim ss As Worksheet Dim ds As Worksheet Dim r As Integer Set ss = Sheets("sheet1") Set ds = Sheets("sheet2") ds.Cells.Clear For r = 1 To 1000 ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 1) = ss.Cells(r, 1) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 2) = ss.Cells(r, 2) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 3) = ss.Cells(r, 3) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 4) = ss.Cells(r, 4) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 5) = ss.Cells(r, 5) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 6) = ss.Cells(r, 6) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 7) = ss.Cells(r, 7) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 8) = ss.Cells(r, 8) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 9) = ss.Cells(r, 9) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 10) = ss.Cells(r, 10) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 11) = ss.Cells(r, 11) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 12) = ss.Cells(r, 12) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 13) = ss.Cells(r, 13) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 14) = ss.Cells(r, 14) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 15) = ss.Cells(r, 15) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 16) = ss.Cells(r, 16) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 17) = ss.Cells(r, 17) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 18) = ss.Cells(r, 18) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 19) = ss.Cells(r, 19) ds.Cells(((r - 1) \ 20) + 1, ((r - 1) Mod 20) * 20 + 20) = ss.Cells(r, 20) Next

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

エラーになるのはANo.1の方も指摘されているように列の最大数に引っかかっているからでしょう。 最終的に1列にまとめたいのなら、素直にループを2つ回して処理をした方がシンプルですよ。 Sub sample()   Dim ss As Worksheet   Dim ds As Worksheet   Dim nRow, nCol, nCount   Set ss = Sheets("sheet1")   Set ds = Sheets("sheet2")   ds.Cells.Clear   For nRow = 1 To 1000     For nCol = 1 To 20       If ss.Cells(nRow, nCol).Value <> "" Then         nCount = nCount + 1         ds.Cells(nCount, 1) = ss.Cells(nRow, nCol)       End If     Next nCol   Next nRow End Sub

19630827
質問者

お礼

なるほど さすが素晴らしいです 直接 1行に 思いつきませんでした 助かりました ありがとうございます

その他の回答 (1)

  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

こういうことでしょうか? とりあえず一行に纏める所だけ作ってみました。 Public Sub cptest() Dim sht1 As Worksheet Dim sht2 As Worksheet Dim targetRng As Range Dim rng As Range Dim colcount As Long Set sht1 = ThisWorkbook.Worksheets("Sheet1") Set sht2 = ThisWorkbook.Worksheets("Sheet2") Set targetRng = sht2.Range("A1") colcount = 0 For Each rng In sht1.UsedRange targetRng.Offset(0, colcount).Value = rng.Value colcount = colcount + 1 Next End Sub ちなみにですが、Excel2003までは列が255までしか無いので500列入力することはできません。 また、Excel2007以降でも16384列が最大なので、それ以上の要素数がある場合できません。

19630827
質問者

お礼

ありがとうございます Excel 2003です 原因が分かり よかったです 助かりました

関連するQ&A

  • エクセルVBA(LOOKUP関数)Win2000、Office2000

    いつも関数(LOOKUP)を使って集計をしているのですが、これがVBAで一発処理できれば効率がよくなると思い、頑張ってコードを書き書きしてます。 が、どうもうまくいかきません。下に今書いているコードを書きます。やりたい内容がおわかりいただければいいのですが・・・よろしくお願いします。 Subtest() Dim ds,ss As Worksheet'(シート名) Dim Dlrow As Long'(DataSheetの最終行) Dim Slrow As Long'(DataSheetの最終行) Dim i,r,dAs Long’(行、列カウンタ) Set ds=Worksheets("DataSheet") Set ss=Worksheets("syukei") For DL row =1 To ds.Range("B65536").End(xlUp).Row 'DataSheetの行数判定 Next ForSLrow=1 To ss.Range("B65536").End(xlUp).Row '集計シートの行数判定 Next '現在セルにある関数→集計シートA3=LOOKUP(B3,DataSheet!3:H6308,DataSheet!C3:C6308) '対応する列 '検索値は全て、集計シートのB列 '検査範囲は全て、データシートのH列 ↓////※ここらへんから苦戦してます//// '集計シートのA列=データシートのC列 WithWorksheets("syukei") Fori=3ToSLrow '.Cells(i,1)="=Lookup(Cells(i,2),Worksheets(DS).cells3,8):cells(DLrow,8),worksheets(DS).cells(3.3):cells(DLrow:3)" Nexti EndWith '以降, 集計C列=データのI列のように対応する列毎に、上のコードで処理していこうと思っています。(もしかしてダサイやり方ですか?) 'J列以降は、以降集計J~AS列とデータR~BA列の+1列 'Forr=10to45→r=J~AS(10to45) 'Ford=18to53→d=R~BA(18to53) 'Fori=3toSLrow 'Cell(r,i)=Lookup・・・・・ 'nextr 'nextd 'nexti EndSub と、こんな感じで、頑張ってます。よろしくお願いいたします。

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • VBAで検索してコピー

    エクセル2003を使っています。 下記のような構文で、あるデータを検索しています。 検索まではできましたが、その検索したデータが入力されている行を選択して別のシートにコピーしたいです。 Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet Dim rng As Range Set ws1 = Sheets("CSV") '検索先のシート Set ws2 = Sheets("0群加工") '検索データのシート Set ws3 = Sheets("完了") '貼付先シート Set ws4 = Sheets("過程") With ws1.Columns("A") '完全一致でシートの頭から検索(A列) i = 2 Do Until ws2.Cells(i, "E").Value = "" 'ws2のデータがなくなるまで Set rng = .Find(What:=ws2.Cells(i, "E").Value, LookAt:=xlPart, After:=.Cells(.Cells.Count)) '検索 上記は0群加工シートに入力されているデータを、CSVシートに入力されているデータを検索しています。 (ここのデータというのは時間が入力されています。つまり、0群シートに入力されている時間と同じ時間を、CSVシートで検索しています) CSVシートに同じデータがあれば、そのデータがあるセルが属する行をコピーして、違うシートに貼り付けたいです。 よろしくお願いします。

  • VBA 新データ行のみ元のデータシートにコピーする

    OSは、XP Excelは、2003 を使用しています。 シート1には元のデータ、シート2には追加データと元データが混じってあります。 元データシートに、追加データシートから追加データ行のみをコピペしたく、 マクロを組んでいます。 下記、 C列の売上番号を見比べて、C列のみ追記するまでは出来たのですが、 1行にデータはA列~X列まであるので、そのデータも一緒にコピペするには どの様にすれば良いのか教えて下さい。 よろしくお願いします。 ****************** Sub 追加データ追記マクロ() Dim motows As Worksheet '元データシート名を格納 Dim tsuikaws As Worksheet '追加データシート名を格納 Dim tsuikamax As Long '追加データの最終行 Dim motomax As Long '元データの最終行 Dim tsuikaNum As Range '追加売上番号 Dim motoNum As Variant '元売上番号 Dim i As Long     '書き込み行 Set motows = Worksheets(1).Name '元シート名を格納 Set tsuikaws = Worksheets(2).Name    '追加シート名を格納 tsuikamax = tsuikaws.Cells(Rows.Count, 1).End(xlUp).Row  '追加データの最終行を格納 motomax = motows.Cells(Rows.Count, 1).End(xlUp).Row '元データの最終行を格納 i = motomax + 1       '書き込み行は元データ最終行+1 For Each tsuikaNum In tsuikaws.Range("C1:C" & tsuikamax)        '追加データ売上番号格納 Set motoNum = motows.Range("C:C").Find(tsuikaNum, lookat:=xlWhole) '元データ売上番号格納 If motoNum Is Nothing Then '元データになかったら With motows .Cells(i, 3) = tsuikaNum i = i + 1 End With End If Next tsuikaNum End Sub

  • Excel VBAを使った重複行の抜き出しについて教えてください

    以下のような2シートから、重複する「商品番号」のあるsheet1の行を抜き出して、別シートに書き出したいと思っております。 sheet1  |  A   |  B   | C -+--------+-------+----- 1|      |      | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3|  123456|  ガム|山田太郎 -+--------+------+-------- 4| 2345678| チョコ|田中花子 ・・・ sheet2  |  A   |  B   | C -+--------+-------+----- 1|      |     | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3| 3987624|     | -+--------+------+-------- 4| 193678|      | ・・・ そこでVBAを作成したのですが、例えば商品番号「222011001」の行を抜き出したいのに、「22011001」の行も一緒に抜き出してしまいます。 どこがいけないのか、教えて頂けないでしょうか。 作成したVBAは以下の通りです。 VBA初心者で本を見ながら作ったため、大変見にくくなっているかと思います。申し訳ありませんが、どなたかおわかりになる方がいらっしゃいましたら、どうぞ宜しくお願い致します。 Option Base 1 Option Explicit Sub 重複データ抽出書き直し() Dim シート(2) As Worksheet Dim 比較列(2) As Integer Dim 一致セル As Range Dim 検索範囲 As Range Dim i As Integer Set シート(1) = Sheets("sheet1") Set シート(2) = Sheets("sheet2") 比較列(1) = 1: 比較列(2) = 1 シート(2).Activate ActiveCell.CurrentRegion.Select Selection.Offset(1, 比較列(2) - 1) _ .Resize(Selection.Rows.Count - 1, 1) _ .Select Set 検索範囲 = Selection Sheets.Add After:=Sheets(Sheets.Count) シート(1).Activate ActiveCell.CurrentRegion.Select Selection.Resize(1).Copy With Sheets(Sheets.Count).Range("A1") If Application.Version >= 9 Then .PasteSpecial 8 End If .PasteSpecial End With For i = 2 To Selection.Rows.Count Set 一致セル = 検索範囲.Find(Selection.Cells(i, 比較列(1)).Value) If Not 一致セル Is Nothing Then Selection.Offset(i - 1).Resize(1) _ .Copy Sheets(Sheets.Count) _ .Range("A65536").End(xlUp) _ .Offset(1) End If Next i Sheets(Sheets.Count).Activate End Sub

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

  • 【Excel VBA】データの最終行について

    Excel2003を使用しています。 ある一覧表形式のデータSheet1をSheet2に値のみコピーして、このSheet2を“印刷用”として、ページ設定等をして、印刷のみに使用しようと思っています。 Sheet2のI列、J列、K列には数値が入力されていて、I列、J列、K列のデータの最終行の1行下に、それぞれ6行目からデータ最終行までの合計の数式が入力されるよう、コードを追加したのですが、数式は入力されるものの、入力したい行に数式が入力されません。 マクロを実行して、数式が入力された行を見てみると、301行目に入力されていました。 Sheet1は別のシートのデータを数式により表示していて、数式が300行まで入力されているので、Sheet2の元になっているSheet1の影響(?)なのかな~?と…。こういう場合、どうすればいいでしょうか? コードは下記のようになっています。 よろしくお願いします。 ---------------------------------------- Sub 印刷用作成() Dim i As Integer Dim j As Long Sheets("Sheet1").Activate Range("B6:L6", Range("L6").End(xlDown)).Select Selection.Copy Sheets("Sheet2").Select Range("B6").PasteSpecial xlPasteValues Application.CutCopyMode = False For i = 9 To 11 j = Application.Max(j, Cells(65536, i).End(xlUp).Row + 1) Next For i = 9 To 11 Cells(j, i).FormulaR1C1 = "=SUM(R2C[0]:R[-1]C[0])" Next i End Sub

  • VBA 100行ごとに列を変更してコピーする。

    Winは7、Excelは2013を使用しています。 A列とB列のデータを100行毎に列を変えてコピーしたいと思っています。 (画像参照願います。) それで、別シートにコピペするサンプルコードを見つけたのですが、 同シート内でする様に変更する知識がなく、苦戦しています。 申し訳ありませんが、ご教示願います。 別シートにコピペするサンプルコード Sub データを100行ごとに分割する() Dim シート As Worksheet, 元 As Worksheet '元は元データのあるシート Dim 総行数 As Long, 回数 As Long, i As Long, 開始行 As Long Const コピー行 = 100 Set 元 = ActiveSheet '変数の元をActiveSheetにセットする 総行数 = 元.UsedRange.Rows.Count 回数 = Int(総行数 / コピー行) + IIf(総行数 Mod コピー行 > 0, 1, 0) 開始行 = 1 For i = 1 To 回数 Set シート = Sheets.Add シート.Name = 開始行 & "~" & 開始行 + コピー行 - 1 元.Rows(開始行 & ":" & 開始行 + コピー行 - 1).Copy シート.Range("A1") Columns("A:F").AutoFit 開始行 = 開始行 + コピー行 Next i End Sub

  • Excel VBAデータ登録のスピードアップしたい

    下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

専門家に質問してみよう