• 締切済み

列コピーについて

VBAを利用した複数必要列をコピーする方法を教えて下さい。 シート1に入っているデータで 1行目には、項目名が入っています。 項目数はMAX200個前後です。 毎月各担当者からデータが入ったExcelブックを受け取り 必要な列だけを残して、データをコピペして頑張っていたのですが、 毎回列並びが異なるのと、担当者によっては抽出してくる 項目が違うため担当者ごとに修正するのが手まで困っております。 作業を以下の様にしたいです。 各ブックに入っている項目数はバラバラですが、最終的に必要な項目は 各担当者で必ず残してもらえています。 但し各担当者によって列並びがバラバラで困っています。 (1)例えばシート1に以下の様にデータを入力しておく (担当者で) A B(列) (行) 1 test 2 支店 3 営業担当者 4 番号 (2)シート2は各担当者より提出されるデータをまるっと貼り付ける A B(列) (行)test 日付 支店 営業担当者 エリア 番号 住所 電話番号 1 2 2行目以降はデータだけが入っている 3 4 ★行いたいのは(2)に入っているデータより★ (1)に入力されているB列の2行目以降に入っている項目キーと一致するデータを (2)からコピーしてシート3へ必要な項目が入っているデータを列ごと貼り付けたい 最終イメージーはにシート2に入っているデータから、 シート1には入っている項目だけのデータを シート2からコピーしたデータだけがシート3に残るようにしたいです。 以下がシート3で最終的に残るデータとしたい A(列)   B(列) C(列) D(列) E(列) F(列) → 以降項目数が続く (行)test  支店   営業   担当者 番号    電話番号 1 2 2行目以降はデータだけが入っている 3 4 ↓ 以降 データが入っている 必要データ以外は削除としたのですが、 項目数が多く以下の内容ではうまくいきませんでした。 ※例として書いているのが項目名が4つとしていますが、 必要な項目数はおよそ30前後になります。下記の内容では、 文字数の関係でエラーが出た為必要な項目をコピーして別シートへ貼り付ける方が よいとアドバイスをいただいたのですがうまく書けませんでした。 Dim rng As Range Set rng = Cells.Find("test、支店、営業担当者、番号", , xlValues, xlWhole) If Not rng Is Nothing Then Range(rng.Offset.EntireColumn, rng.Address).Delete End If Set rng = Nothing どのようにすれば必要な項目を列ごとコピーして別シートへ貼り付けることができるでしょうか。 是非お力添えをお願い致します。

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.8

>仰る通り各担当者からのは添付データのようなイメージです。 ならば、 このイメージのシートが1枚目に無い といったオチはありませんか? マクロは、このイメージのシートが1枚目である必要があります。

ririmasana
質問者

補足

遅くに申し訳ございません。 イメージシートは1枚目の認識です。 念の為に手順をお伺いしてもよろしいでしょうか。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.7

当方は、 編集元のエクセルファイルが添付のようなデータとイメージしています。 編集元のエクセルファイルがどのようなデータなのか教えてください。 列名が1行目に埋まっているんですよね? 途中に列名が空欄のセルがありますか?

ririmasana
質問者

お礼

返答が遅くなり申し訳ございませんでした。

ririmasana
質問者

補足

ご連絡ありがとうございます。 残業で今帰宅し今確認しました。 仰る通り各担当者からのは添付データのようなイメージです。 新規ブックシート1のB列でもどこでもよいのですが、 縦に必要項目名を羅列します。 そしてシート2では、各担当者から受け取るデータを全部は率えます。 列の途中に空白などもありません。 最後に、シート1にある項目名だけが、シート2から列ごとコピーし シート3などに貼り付け最終的に残ったデータはシート1と 項目名が一致したデータとなります。

回答No.6

>マクロでエラーが出て作業がストップ!  えっ。で、試したら、こっちもエラーが出ました。で、これは、回避不能のエラーですね。で、対策は、ただ一つです。相手を変えることは不能。だったら、こっちが変わるだけですね。 現行:SheetCopy("SELECT N番目迄 FROM XXXX", "SheetXXX") 対策:コピーの仕方にオプションを設ける。    SheetCopy("SELECT N番目迄 FROM XXXX", "SheetXXX", 0)    SheetCopy("SELECT N番目迄 FROM XXXX", "SheetXXX", 1)    SheetCopy("SELECT N番目迄 FROM XXXX", "SheetXXX", 2) 0:シートをクリアして書き込む。 1:既存シートの列の後に追加する。 2:既存シートの行の後に追加する。  まあ、列の使用MAX、行の使用MAXが判れば、こんちのもんでしょうが・・・。  まあ、VBAとしては3行ほどの追加になります。そして、書き込む位置を調節するXOffSet、YOffsetなる二つの変数をかますことになるでしょう。これしかないと思いますね。列名は、どこからどこまでは今でも指示できますので大丈夫です。 FROM [Sheet1$A1:A10] FROM [Sheet1$A11:A20] FROM [Sheet1$A21:A30] で、マクロ1、2、3を順番通りに実行する。私の解決策は、こんな感じです。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.5

マクロブックは添付画像のように 必要な列名がB列の埋まっている前提です。 これにより このマクロブックの2枚目に、 >シート2は各担当者より提出されるデータをまるっと貼り付ける が作成され、 >シート2からコピーしたデータだけがシート3に 作成される動作になるはずなんです。 どこが期待と異なりますか?

ririmasana
質問者

補足

回答ありがとうございます。 頂いた内容で行うと、列がありませんとなり、データが何も残らない状態となってしまいました。当方の力不足だと思います。

回答No.4

【補足】SheetCopy()について 【利用方法】 [イミディエイト ウインドウ] ? SheetCopy("SELECT 抜き出したい列名リスト FROM [Sheet2$A1:Z10000]", "Sheet3")  これだけです。  なお、シート1のデータを参照して抜き出したいリストを自動生成するには ? SheetCopy("SELECT " & DSelsct("SELECT 列名 FROM [Sheet1$A1:A1000]",",") & " FROM [Sheet2$A1:Z10000]", "Sheet3") と書きます。  なお、SheetCopy()で重要な働きをするのは、DSelsct()です。この手の関数の冒頭の1行を見て、どういう引数を書くのかの理解に手間取るようでしたら、同関数の利用は勧めません。 Public Function DSelect(ByVal strSQL As String, _             Optional colDelimita As String = ";", _             Optional rowDelimita As String = "|", _             Optional xlFileName As String = "", _             Optional isHeader As Boolean = True) As String  一応、質問者のやろうとしていることが1行のマクロで達成できる環境が整ったのご案内しておきます。なお、現状では、その1行をどのように書くべきかは示せません。質問に具体的な添付図が示されていない為です。 祈、成功!

ririmasana
質問者

補足

正に頂いた内容にしたいのですが、うまくいかずです。 行いたいのが、 最終イメージーはシート1には入っている項目は シート2で一致している項目のデータをだけを残し、 不要な列=シート1の項目にないデータは列ごと削除したい 項目数が約30前後のため1行マクロではどうすることもできなく、 行を「_」でと考えてもおかしな状態となるのです。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

先の質問に返信したマクロのを加工してポストします。 よかったら参考にしてみてください。 なお、 >(1)シート1のB列などにに項目名を縦にデータを入力し一覧にする。 シート1のB列1行目から縦に列名が期待の順番に並んでいる前提です. Option Explicit Sub Sample()  Dim GetFilePath As String  Dim GetBook As Workbook  Dim GetSheet As Worksheet  Dim TblSheet As Worksheet  Dim PutSheet1 As Worksheet  Dim PutSheet2 As Worksheet  Dim RowCouter As Long  Dim ColCouter As Long  Dim ColNum As Long  Dim ColName As String    '編集元ブックを選択して開く  With Application.FileDialog(msoFileDialogOpen)   .InitialFileName = ThisWorkbook.Path   .Show   If .SelectedItems.Count = 0 Then    MsgBox ("ファイルの選択がキャンセルされました。")    Exit Sub   End If   GetFilePath = .SelectedItems(1)  End With  Set GetBook = Workbooks.Open(GetFilePath)  Set GetSheet = GetBook.Sheets(1)  Set TblSheet = ThisWorkbook.Sheets(1)      '出力先シートを自ブックに追加し、編集元シートを複写  ThisWorkbook.Sheets.Add after:=ThisWorkbook.Sheets(1)  GetSheet.Copy after:=TblSheet  Set PutSheet1 = ThisWorkbook.Sheets(2)  Set PutSheet2 = ThisWorkbook.Sheets(3)    RowCouter = 1  '列並び一覧のデータ開始行    '列ごとにコピペ  Do   If TblSheet.Cells(RowCouter, 2).Value = "" Then Exit Do   ColName = TblSheet.Cells(RowCouter, 2).Value 'B列を順に取得   ColCouter = 1   ColNum = 0   Do    If PutSheet1.Cells(1, ColCouter).Value = "" Then Exit Do    If ColName = PutSheet1.Cells(1, ColCouter).Value Then     ColNum = ColCouter     Exit Do    End If    ColCouter = ColCouter + 1   Loop   If ColNum = 0 Then    MsgBox ("列がありません:" & ColName)   Else    PutSheet1.Columns(ColNum).Copy    PutSheet2.Columns(RowCouter).PasteSpecial   End If   RowCouter = RowCouter + 1  Loop    'Application.DisplayAlerts = False  GetBook.Close False '編集元ブックをクローズ  'Application.DisplayAlerts = True End Sub

ririmasana
質問者

補足

回答がありがとうございます。 頂いた内容だと、新規ExcelブックでVBAのデータを書いて実行すると、 データの入ったExcelブックを指定して開いて、コピーとなるようです。 また、説明が下手で申し訳ないです。 行いたい最終データのイメージですが、 A(列)   B(列) C(列) D(列) E(列) F(列) → 以降項目数が続く (行)test  支店   営業   担当者 番号    電話番号 1 2   2行目以降はデータだけが入っている 3 4 ↓ 以降 データが入っている シート1にB列に縦に【残したいデータの項目が入る】 シート2が各担当者から受け取るデータが入っていて、 シート2で残るのが【シート1のB列に入っている項目名と一致したもの】ですが、 シート2の項目名は A(列)   B(列) C(列) D(列) E(列) F(列) ※各列の【1行目に横の行】に展開されており、  データは1行目以降の列に入っている 1↓ 以降 データが入っている 2↓ 以降 データが入っている 3↓ 以降 データが入っている シート1のB列に縦に入っているデータを シート2で項目が一致しているものだけを、【列ごとコピーしてシート3】に移す。 またはシート2でシート1に入っている【項目以外のデータをシート2から削除しシート1の項目と一致するものだけが残る】、というように実行したいのですがうまくいかず困っております。是非お知恵を貸して頂けると助かります。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

各担当者のシートデータをどうまとめようとしているのか伝わりにくい。 (成績的な=)量的な、集約表を作るのか。 列的に表の体裁(=列項目の出現)を統一したいのか。 データの列位置だけを内容的に全員分揃えるのか? 普通はA担当者のデータの行的最終行の次に、B担当者のデータを張り付ける、などでよい(ある商品の売上個数(や商品名)を累積していく)場合があると思うが、完成後A担当者のデータか、B担当者のデータかどうかは、残す必要があるのかな。 ーー あるならどこかの列に氏名などを残せばよい。 ーー 例えば人事表などで X氏 A,C、F項目を記入あり Y氏 A、B、F項目を記入あり で ーは空白列として X A ーC-ーF Y AB-ーEー のようなデータを作ればよいのか? == 見出しの文字列は担当者は、1字1句間違わないという前提で VBAでFindで標準の列を見つける。 累積するなら、その列について、END(xlUp)で直前までの最終行を見つけ その直下から張り付ければ仕舞い。  処理実行時間は多少かかっても、VBAのコード行数は少なくて済む簡単な問題。 質問文を読み解くのに苦労する。 3人分、3項目のシート模擬例で、シートデータの完成形を示すのが一番良いと思うよ。

回答No.1

Q、必要な項目を別シートへコピーする方法。 A、10個ぐらい新しい私の質問を参照されたし。  それは、質問者の希望を叶えるための仕上げの為の質問です。その添付図でも分かるように、項目を指定して、かつ、色んな条件を付けて別シートにコピーすることが可能です。ただ、A⇒H、B⇒Hを連続的に行うには、追加開始の行を指示できるように、また、見出し部の書き込みの要不要も指示できるように改変する必要があります。でも、そういう改変をしないで、Hは一時シートという位置付けをされた方が無難だと思います。  明日までには、《緑の三角門田》は解決すると思います。で、その時は、関数一発でコピーも可能となります。イミディエイトウインドウで関数を起動するだけです。  まあ、エクセルについては知識ゼロの私の回答。参考程度に読み流してください。

関連するQ&A

  • Excelのシート間のコピー&貼付け

    皆様にお聞きしたいのですが。。m(_ _)m あるシートで作成したデータ(罫線等は入れてません。セルに入力したデータのみです)を、一番上の項目名のみまず最初に別シートにコピーしました。 そして元データでフィルタで抽出した間違いがあったデータのみ、複数の行番号をドラッグで選択して別シートにコピー&貼付けをしていたら、なぜか元のシートと列の数が合わなくなりました; 列の数は40前後と多いのですが・・・ 一番上の項目名と途中か合わなくなっていました(T-T) 普通に行を選択してコピー、そして別シートへ貼付けしていただけなのですが。。 こうゆうことってあるのでしょうか??? どなたか、どうかご教授ください。宜しくお願い致します。。 補足 ちなみに、ちゃんとコピー先のシートのA2(項目行の先頭の下の行)にコピーしたのですが・・。

  • エクセルVBA、列のコピーについて

    VBAについて助けてほしいことがございます! VBA初心者なので、ひょっとしたらレベルの低い質問かもしれず申し訳ないのですが、VBAに詳しい方がいらっしゃれば教えて欲しいことがあります。 下記の前提を含めた作業内容をVBAのコードとしてまとめる事は出来るのでしょうか? 1列目(A1,B1,C1,D1…)にキー項目(名前、番号、地域、住所、ID…)、2列目以降にキー項目のデータが入力されています。 【作業内容】 「ID」の項目の列には、「番号」の列の文字をコピーして貼りつける(キー項目は上書きせずにIDのまま)。 【前提】 ・キー項目の列は固定されていない(B列が番号の時もあれば、住所の時もある)ので、文字を基準にコピー作業をする ・「キー項目が空欄にぶつかったら、検索を終了」という事をループに入れる(キー項目数は変動するため) ・2列目以降の全てのデータをに張り付ける」という事をコードに入れる(2列目以降のデータの列数も変動する且つ途中に空欄も含むため)

  • EXCEL2000でデータ行コピーしてコピーした列のセルを置換する作業をカンタンにする方法をご教授ください

    EXCEL2000を使っています。 データとしては、A~BC列(シートによって列数は違います)くらいまでのシートが複数あります。 これらのシートのA列には必ず西暦4桁が入力されています。 Sheet1シートのA列に2007と入力されている複数行をコピーして、最終行に貼り付けて、貼り付けた行のA列を2004から2008までのデータに置き換えていく作業を行ってます。 今はコピーして貼り付けて、貼り付けた範囲指定で2007から2004へ置換の作業を繰り返しておりますが作業しなければいけないシート数が沢山あって苦慮しております。 シート毎でもブック毎でも構いません。 VBA等の解決策や方法等を何卒ご教授願います。

  • データ抽出のコピーの仕方を教えてください。

    エクセル2007で表を作っています。 シートAに、1行目が項目で2行目以降データです。350行ほどあります。 シートAのそのデータにフィルタを使って、3件ほど、抽出しました。 シートBに抽出したデータと1行目の項目を列幅やセルの色などそのままコピーしたいのですが、 コピー→貼り付けだと、書式がコピーできません。 項目と抽出したデータをそのまま、まるっとコピーできないでしょうか?

  • 行の高さ、列の幅同時にコピー

    行番号をコピーして新しいシートに貼り付けると、列の幅が変わりません。同時に変えることってできますか?

  • マクロを利用して各シートのデータを一枚のシートへコピーペーストする方法

    エクセルのマクロを利用して各シートのデータを一枚にまとめたいと考えています。 方法がわかる方いらっしゃいましたら教えてください。 1.【Sheet1からSheet19】のデータをシート【Sheet0】にコピーし一枚にしたい。  Sheet20以降はコピーしない。 2.【Sheet1からSheet19】の行【12】と【Sheet0】の行【14】には同じタイトルが入っています。  【Sheet1からSheet19】のタイトル列を参照して【Sheet0】の同じタイトル列にコピーしたい。 3.コピーしたい行は【Sheet1からSheet19の15】行目から以下になります。  【Sheet0の17】行目以降にコピーするようにしたい。 4.【Sheet1】のコピーが終わったら【Sheet1】の最後の行に  【Sheet2】からコピーを開始するような形にしたい。以下【Sheet19】まで繰り返す。 以上よろしくお願いします。

  • I列でHITさせたデータのみ、別のシートにコピーしたい。(マクロ)

    エクセルでのご教授をお願いします。 シート名「データ」のA3からM159までに、データが入力済みです。 ただし、今後、列方向・行方向ともにデータが増える可能性があります。 I列の入力値は、現在、「1・2・3・4」のどれかです。 今後、「5・6」と増えてゆく可能性もありますが、とりあえずそれは後ほど考えます。 やりたいことですが、 I列のデータが「1」だけのものをまず抽出し、 抽出されたデータの、A列・B列・C列・H列・J列・K列・L列のみを、シート名「1」の3行目以降にコピーしたいのです。 同じくI列のデータが「2」だけのものを抽出し、 抽出されたデータの、A列・B列・C列・H列・J列・K列・L列のみを、シート名「2」の3行目以降にコピーしたいのです。 これをI列に入力されるデータそれぞれに(現在は4まで)をマクロで作成したいのです。 そして、私ではどうしても解決できなかったことなのですが、 例えば「1」シートの最終データの次の行に、集計欄として、データが何件あるかを数えたいのです。 その場合、I列のデータがそれぞれのデータごとに何件あるかが分からないために、どの行に集計欄を作成しておけば良いのか、どうやって判断させたら良いのでしょうか。 申し上げていることを理解していただけておりますでしょうか。 もし意味不明な箇所がございましたら、補足で尋ねていただけると助かります。 よろしくお願いいたします。

  • 必要項目(列)データに絞った抽出貼付で。。

    別ブック・シート (一覧) 日付 - 項目1 - 項目2 - 項目3 - 項目4 - 項目5 - 項目6 ↓ 上記のフォーマットで日付データ(連続)で並んでいます これを読み込み、一致する日付データ行でフィルタを掛け、 日付と必要項目(列)データに絞った印刷用シートとして 今開いているブックに作成したいのですが、 当該ブック・シート (印刷用) 日付 - 項目2 - 項目5 - 項目6 ↓ -  項目2合計 - 項目5合計 - 項目6合計 その際、抽出データ項目の各合計も行末尾に追加したい --------------------------- インプットボックス入力日付でフィルタを掛けコピーされたデータ Worksheets("一覧").AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy この場合、そのまま貼付は PasteSpecial xlPasteAll ですが、 必要項目(列)だけ貼付はどのようにすればいいのでしょうか また、平均30行ほど抽出になるので印刷シートの抽出項目合計セルは、 30行以降にSUM関数を埋め込んでおけば問題はありませんか? (毎日印刷するので上書きが心配です) 最近、行単位での抽出貼付、シート保存を覚えたばかりで、 なんとかそれまでできますが、個別列の抽出貼付で困っています。 SpecialCellsの他に方法はありますか? ご教示願います。

  • データベースの並び替えキーと列の指定方法

    シートに売上データ表があります。A列~AG列2行目に列項目、3行目以降にデータが入っています。これを基に並び変えや、データ抽出をしたいのですが、使用目的によって、並び替えキー項目や削除したい列項目が変わってきます。その為、マクロを組んでも、毎回指定した列を変更しなければならず、困っています。例えばA列1行目~C列1行目に列番号(A,D,F)や、列項目名を入力したら、その列を削除したり、その項目名順に並び替えをする様な事は出来ないのでしょか? 検索・抽出では、同じ列項目名+空白1行の表に検索したい条件を入れれば、その都度抽出出来るのですが。

  • EXCEL VBA:文字列のコピー

    1. intputbox で入力したパスにある全ての txtファイル名を sheet1 C列に表示。 (現在 6ファイルでテスト。予定作業で100ファイル程度) 2. 配列を使って C列のファイル名のファイルを順番に読み込み sheet2 A列に行単位で読み込み。 →今ココ 3. sheet2 A列に表示されたファイルに hostname_abcde という行があり、abcde 部分だけを sheet1 A列にコピー。 ( _ は半角スペースに読み替えてください。hostname_を検索すればいいのですが、その後に 続く abcde がファイルによって文字数が異なりコピーする方法が分かりません) 4. 「3.」のコピー後に sheet2全セルをクリアして 動的配列の next文へ進み、要素2 のテキスト ファイルを sheet2 A列に読み込みまた、 hostname_abcde の abcde を sheet1 A列の次のセルに コピー。要素数分繰り返します。 実際に記述した内容は職場のPCでないと分からないので詳しく書けませんが、上記 3. と 4. の 方法をご教示頂きたくお願い致します。

専門家に質問してみよう