• 締切済み

マクロかVBAについて

あるExcelブックにあるデータがブックごとによってばらつきがあり困っております。 全てのブックの縦列にデータが入っていて項目名は一致しているのですが、 ブックによって並び順が異なります。 先日マクロの組み方で Dim rng As Range, xTxt For Each xTxt In Split("電話番号、住所、氏名、性別", "、") Set rng = Rows(1).Find(xTxt, , xlValues, xlWhole) If Not rng Is Nothing Then rng.EntireColumn.Delete 上記の内容で不要な列を削除する方法を教えて頂き うまくいったのですが、項目のキーが追加となり文字制限のようなもので エラーが出てしまい困っております。※残したい項目以外の項目名が多すぎたのだと思います。 各ブックに入っている項目名(検索キー)は全て一致しているのですが、並びバラバラです。 項目名の数はおよそ100~200程でブックによって入っている項目と入っていないものがあります。 但し残したい項目名の数は約30前後 ただ、毎回ブックごとに並び順が変わる為できれば例えば、 (1)シート1のB列などにに項目名を縦にデータを入力し一覧にする。 (2)シート2に各ブックに入っている元データを貼り付け、シート1に入っている項目名以外のデータは項目名の列ごと削除 (3)最終的にはシート2にはシート1に入っている項目名のデータだけがのこる そういったことが可能でしょうか。 よろしければ是非お力添えをお願い致します。

みんなの回答

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

>(1)シート1のB列などにに項目名を縦にデータを入力し一覧にする。 B列1行目から縦に列名が期待の順番に並んでいる前提 >(2)シート2に各ブックに入っている元データを貼り付け、 >シート1に入っている項目名以外のデータは項目名の列ごと削除 >(3)最終的にはシート2にはシート1に入っている項目名のデータだけがのこる 必要な列だけを期待の順番にコピペする動作。 以上の条件で作ってみました。 Option Explicit Sub Sample()  Dim GetFilePath As String  Dim GetBook As Workbook  Dim GetSheet As Worksheet  Dim TblSheet As Worksheet  Dim PutSheet 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      '出力先シートを自ブックに(2枚目として)追加  ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(1)  'ブック、シートを定義  Set GetBook = Workbooks.Open(GetFilePath)  Set GetSheet = GetBook.Sheets(1)  Set TblSheet = ThisWorkbook.Sheets(1)  Set PutSheet = ThisWorkbook.Sheets(2)    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 GetSheet.Cells(1, ColCouter).Value = "" Then Exit Do    If ColName = GetSheet.Cells(1, ColCouter).Value Then     ColNum = ColCouter     Exit Do    End If    ColCouter = ColCouter + 1   Loop   If ColNum = 0 Then    MsgBox ("列がありません:" & ColName)   Else    GetSheet.Columns(ColNum).Copy    PutSheet.Columns(RowCouter).PasteSpecial   End If   RowCouter = RowCouter + 1  Loop    'Application.DisplayAlerts = False  GetBook.Close False '編集元ブックをクローズ  'Application.DisplayAlerts = True End Sub

回答No.2

【補足】データ型に応じて列をコピーするには?  それは、質問者が知っているんじゃーないのかな。また、ここの回答者にとっては常識中の常識何では。もちろん、私は、しりません。でも、その手掛かりは提供できます。列名の次の行が、データのタイプです。これは、ADOの列タイプの番号に一致しています。回答者に、CopyDatas()を依頼される場合は、《データ型に応じて列をコピーする》も依頼されてください。

回答No.1

Q、上記の内容で不要な列を削除する方法を教えて。 A、全く、逆の発想をしたら。 【不要な列を削除する】   ↓ 【必要な列をコピーする】  これは、超簡単なVBAコードを書くだけで実現します。それだけではなくて、全体の列の並びも統一することが可能。必要であれば、年月日で昇順に並べてコピーすることもOK。たった、10分から20分で書けるであろうVBAを書くだけ。質問者が掛けなきゃー、幾らでも、そのコードを提供する回答者はわんさかいると思いますよ。 《果たしてそんなことが可能か?》  添付図を一瞥して下さい。これは、[Sheet9$A1:Z1000]のデータを検索して、指定された列の列名とデータとを取得するテストです。各列データは";"で区切られています。仮に、";"を含むデータがあれば、"|"を指定します。この取得したデータを、行単位で配列に取り込んで、その後に各行を順次に取り出し、各列毎に取り出してシートに書き出す。これで、【必要な列をコピーする】は達成出来ます・  で、仮に CopyDatas()という関数を作ったとして、変えるのは DSelect("SELECT 列1,列2,列5,列6 FROM [Sheet9$A1:Z1000]",,chr(13)) の”Sheet9”だけ。もちろん、自分以外の外部のブックも指定できるように作成していますが、未テストです。  ということで、「全く、逆の発想をしたら。!」ってのが私の回答です。

関連するQ&A

  • 列コピーについて

    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 どのようにすれば必要な項目を列ごとコピーして別シートへ貼り付けることができるでしょうか。 是非お力添えをお願い致します。

  • 下記の内容のように列の並び替えを行っておりますが、重複した項目名が存在

    下記の内容のように列の並び替えを行っておりますが、重複した項目名が存在すると一番最後に存在する項目名("データ")を引っ張ってきてしまいます。作業としては、 1つ目の"データ"内容 ⇒ 3桁の文字列 2つ目の"データ"内容 ⇒ 2桁の文字列 をマクロの初めに"データ(3桁)"、"データ(2桁)"と項目名を変更してから並び替えをしたいと思っています。重複行や重複列の削除は検索でヒットするのですが、上記作業工程が書けません。どなたか教えてください。 Sub sample() Dim fld As Variant Dim rng As Range Dim c As Integer Sheets("Sheet2").Cells.Clear c = 1 For Each fld In Array("データ", "電話", "学校名", "住所", "データ") Set rng = Rows(1).Find(fld, LookAt:=xlWhole) If rng Is Nothing Then MsgBox fld & " なし" Exit Sub Else rng.EntireColumn.Copy Sheets("Sheet2").Cells(1, c) c = c + 1 End If Next End Sub

  • エクセルVBAで困ってます。

    エクセルVBAで困っています。 データ入力済みのシートが2つあります。 シート名を「Sheet1」「Sheet2」とします。 「Sheet1」のA列のデータが「Sheet2」のA列のデータと一致した時に それぞれのシートのセル番地を取得したいのですが出来ません。 教えて下さい。 データの並び順は「Sheet1」と「Sheet2」で異なります。

  • エクセルデータにて、列順変更のマクロを作成中です。

    エクセルデータにて、列順変更のマクロを作成中です。 項目名を検索しならびを変えていますが、項目名が突然「郵便番号」⇒「〒」、「〒番号」など に変更されてしまいます。その場合に、MsgBoxをInputBoxにし今回は「郵便番号」がないので 代わりに「〒」を代入する方法をとりたいのですが、どのようにマクロを書いたらよいですか。 よろしくお願いいたします。 【処理内容】 A列、B列、C列、D列 電話番号、名前、住所、郵便番号    ↓へ列のならびを変更 A列、B列、C列、D列 名前、郵便番号、住所、電話番号 【マクロ】 Sub 列順変更() Dim fld As Variant Dim rng As Range Dim c As Integer Sheets("Sheet2").Cells.Clear c = 1 For Each fld In Array("名前", "郵便番号", "住所", "電話番号") Set rng = Rows(1).Find(fld, LookAt:=xlWhole) If rng Is Nothing Then MsgBox fld & " がありません" Exit Sub Else rng.EntireColumn.Cut Sheets("Sheet2").Cells(1, c) c = c + 1 End If Next MsgBox "処理が完了しました。" & vbCrLf & "Sheet1に残ったデータを再確認してください。" End Sub

  • エクセルでのマクロを教えて

    下記のようなものをみたすマクロは組めますか? ファイルにシートが何種類かあります。 sheet1には各店の集計データーがあります。 その中にA列には集計の項目名がAZ列まであり 1行目には店舗名が10種類あります。 sheet2からはsheet名をsheet1に記入されている1行目にしている店舗名にしてあります。 またA列には集計の項目名がありますが sheet1にある項目と全く同じではなく 項目は少なくなっています。 また、sheet2からの店舗名にはsheet1の集計表にはない 店舗名もあります。 このsheet1のデーターをもとに sheet2の1行目の項目と一致する項目の値や数字を sheet1からコピーするというものです。 よろしくお願いします。

  • 関数 or マクロ(エクセル)

    行の項目と列の項目を検索して重なる部分のデータを拾いたいのですがどうもうまくいきません。初歩的なことかもしれませんが、VLOOKUPとHLOOKUP関数をあわせたようなもの。LOOKUPウィザードでもやってみるのですがうまくいかないのでよろしくお願いします。(最終的にVBAでやりたいです) 元のデータは、(Sheet3)にあって(Sheet2)で項目を並べ縦と横の項目に一致するデータを持ってきたいです。 Sheet3にあるデータは、別のブックよりVBAで検索したデータを持ってきています。 また、Sheet1、2ともその都度行数(検索項目数)が変わるので、できればデータシートの行数にあわせて行きたいのですが・・・こうなるとVBAになると思い挑戦しているのですがこれがまたうまくいきません。 で、データの行数にあわせて拾い出し、A列で最終行を検索して、L列~W列の各列の3行目に、5行目~最終行までの合計を取ろうと思っています。 説明が下手ですみませんが、よろしくお願いします。 環境:Win2000、98 Office2000です。

  • エクセルで別ブックを検索するマクロ、VBA

    エクセルで以下の処理を行えるマクロを作成したいです。 当方、マクロについてほとんど知識がありません。 恐縮ですが、教えていただけると嬉しいです。 ・主にしたいこと  [検索]ブックで一致するコードを探して、  [結果]ブックの対応するコードの行にそれぞれの項目を返したい。 ●ブック1 [検索]  シートが12個あります(それぞれ、1、2、3…12というシート名=1~12月分)  ↓各シートの内容    A    B    C    D 1  氏名  数値  コード  内容 2  abc   111  SS1234 あいうえお 3  bcd   123  SS3456 かきくけこ ・ ・ ・ といった感じです。 12個のシートの中身はそれぞれ似たようなものですが、 「コード」や「内容」などは少しずつ違います。 ●ブック2 [結果]  ↓シートの内容    A    B    C    D 1  氏名  コード  内容  数値 2      SS3456 3      SS1234 ・ ・ ・ といった感じです。 (注)検索用ブックとは列の並びが異なっています。 ここでやりたいことの詳細ですが、 ・[結果]ブックの「コード」(B列)にコードを入力すると、  [検索]ブックで一致するコードを検索し、  A列「氏名」、C列「内容」、D列「数値」に、[検索]シートの内容を  自動的に表示させたい。  (ただし[結果]ブックに入力した「コード」は、[検索]ブックの1~12のうち、   どのシートにあるかわからない) ・入力したコードが見つからない場合は何も表示しない。 ということです。 最初VLOOKUP、MATCH等の関数で表示することを考えましたが、 シートが複数にまたがっているのと、 列の並び方が[検索][結果]ブックで違うのでわかりませんでした。 長くなってしまい申し訳ありませんが、どうかおしえてください。 よろしくお願いします。

  • エクセルでのVBA(マクロ)

    以前Wendy02さまに 以下のようなデータがシート1に入力されているもので   A  B   C    D   E    F  1名前 住所 請求書 納品書 領収書 到着確認書 2山田 東京  ○       ○ 3井上 千葉      ○   ○    ○ 4植田 大阪      ○   ○ 5境  秋田  ○   ○ 6大田 沖縄  ○   ○   ○    ○ 7野原 埼玉          ○ データの”○”は書類が確認済で、空白は未確認あるいは未到着です。 "C"列から"F"列の中で1つ以上空白のあるデータを検索して別シート2へそのままコピー出来るマクロを教えていただいたのですが、 A列に受付番号(500件)を先に入力しておいて(一応自分でマクロを組んで)同じ処理をするとデータ(B列:名前)が入力されていないものまで検索結果としてカウントされます。 Sub FindBlank1() Dim Rng As Range Dim i As Long 'Sheet2のフィールド行(名前,住所..)は、1行目にあるとします。 With Sheet1 .Activate i = 2 '2行目から Set Rng = .Range("A1", .Range("A65536").End(xlUp)) For Each c In Rng  If Application.CountA(c.Offset(, 2).Resize(, 4)) <> 4 Then    'A列から、A列を含めて6列取得し、Sheet2にコピー    c.Resize(, 6).Copy Sheet2.Cells(i, 1).Resize(, 6)    i = i + 1  End If Next End With End Sub >i = 2 '2行目から の前に組めば出来る筈だと思うのですが? お助けください。

  • エクセルVBA、マクロについて教えてください。

    https://box.yahoo.co.jp/guest/viewer?sid=box-l-62itttdrrgzrvsaxkvu53tmg3a-1001&uniqid=d4c90186-7ae6-4c7a-8f04-a499509147fc&viewtype=detail サンプルブックを見て頂きたいのですが、シートに分けておりますが、それぞれ別ブックとなります。 エクセルブックAにはシート1-シート10まであります。 ブックAのデータをVBAを使って、ブックBに転記したいのですが、 今はVBAがわからないため、作業列、関数を使って読み取っているのですが、検索をかけると、とても遅いため、関数を消すと早く検索が出来たため、VBAでデータを転記出来たらいいなと思っております。 いくつか条件があるのですが、 ブックAのAQ-ATが作業列としており、 ブックBのG-Uまで関数を入れております。 G4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,G$2) H4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A5,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,H$2) I4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,I$2) 同じような関数をG-Uまで入れております。 このような関数を入れております。 E4==VLOOKUP(A4,'[ブックA.xlsx]シート1'!$B:$AC,28,FALSE) この関数をなくすとAdvancedFilterが早くなるので、ここの部分を転記出来たらと考えております。 ブックAとブックBはブックAのB列のコードとブックBのA列のコードが一致すれば、転記すると言った感じです。 決まっている部分は、商品コードは重複しないのと、ブックAのB列は結合されております。 結合セルのため、作業列を使用しておりました。 ブックAの基準をかえずに転記できる方法があればおしえてください。

  • マクロについて教えてください

    エクセルで作った表のマクロを作りたいと思っています。 抽出した新規のデータと更新データを比較して、 重複することのないデータを作りたいのです。 抽出したデータのファイル名は、どちらも「EXCELデータ」となっています。 シート名はどちらも「データ」です。 表はどちらのシートとも、A列からJ列まであります。 (データの並び順は同じです。) 両方のシートから、下記1~3の条件のデータを取り出して、 新しいシートに書き出したいと思っています。 A     B   C     D      E    F    G     H   I    J 番号 名前 区分 ジャンル 決定日 締切日 コード 社名 価格 区分 1 C列とG列を削除する 2 J列に「1」が記入してあるものを抽出する 3 B列に「初回」と言う文字が含まれているものを、抽出する。 新規分と更新分のデータをA列で比較し、 重複しているものについては色をつける。 というようなものを作りたいのです。 出来れば、ファイルやシートの名前を変えないで作りたいのですが、 変更をすることも可能です。 どなたか教えてください。宜しくお願いします。

専門家に質問してみよう