• 締切済み
  • すぐに回答を!

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

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

共感・応援の気持ちを伝えよう!

みんなの回答

  • 回答No.6
  • bunjii
  • ベストアンサー率43% (3587/8244)

>・「キー項目が空欄にぶつかったら、検索を終了」という事をループに入れる(キー項目数は変動するため) 1行目を対象にA列から最終列までDo ~ Loopで1セルずつチェックする方法を提示すれば良いですか? IdCol = 0 BanCol = 0 c = 0 Do While IdClo * BanCol = 0 c = c + 1 If Cells(1, c) = "ID" Then IdCol = c If Cells(1, c) = "番号" Then BanCol = c If IdCol * BanCol > 0 Or IsEmpty(Cells(1, c)) Then Exit Do Loop >・2列目以降の全てのデータをに張り付ける」という事をコードに入れる(2列目以降のデータの列数も変動する且つ途中に空欄も含むため) これも前述と同様ループで1セルずつコピー(代入)することでしたら下記のようにされたら如何でしょう。 If IdCol * BanCol > 0 Then Cells(1, BanCol).Activate MaxRow = Cells(Rows.Count, BanCol).End(xlUp).Row For r = 2 To MaxRow Cells(r, IdCol) = Cells(r, BanCol) Next r End If 尚、MaxRow = Cells(Rows.Count, BanCol).End(xlUp).Row は「番号」の列に於ける最下行をMaxRowへ代入します。(最大行番号から上方に向けて有効な値のセル位置を検索していますので、途中にブランクのセルが有っても、その下に値が有れば最下行までの行数を検出できます)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

諸事情にて、返信が大変遅くなりまして申し訳ございません! 頂きましたコードで上手く作動するように自分でもトライしてみます、ご返信頂きましてありがとうございます!

  • 回答No.5
  • mt2015
  • ベストアンサー率49% (258/524)

慌てるとろくな事になりませんね。 再度訂正します。 Sub Sample()    nBangou = Rows(1).Find(What:="番号").Column    nID = Rows(1).Find(What:="ID").Column    nLast = Columns(nBangou).End(xlDown).Row    Range(Cells(2, nID), Cells(nLast, nID)) = Range(Cells(2, nBangou), Cells(nLast, nBangou)).Value End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

諸事情にて、返信が大変遅くなりまして申し訳ございません!頂きましたコードにて無事に出来ました、大変ありがとうございます!今後に活かせるようにしておきます_(._.)_

  • 回答No.4
  • mt2015
  • ベストアンサー率49% (258/524)

ANo.3です。 コード訂正します。失礼しました Sub Sample()    nBangou = Rows(1).Find(What:="番号").Column    nID = Rows(1).Find(What:="ID").Column    nLast = Rows(nBangou).End(xlDown).Row    Range(Cells(2, nID), Cells(nLast, nID)) = Range(Cells(2, nBangou), Cells(nLast, nBangou)).Value End Sub

共感・感謝の気持ちを伝えよう!

  • 回答No.3
  • mt2015
  • ベストアンサー率49% (258/524)

行と列を取り違えているようですね。 こういう事でしょうか? 1行目に「番号」「ID」が無い場合や複数あった場合などの処理は入れていません。 Sub Sample()    nBangou = Rows(1).Find(What:="番号").Column    nID = Rows(1).Find(What:="ID").Column    nLast = Range("B1").End(xlDown).Row    Range(Cells(2, nID), Cells(nLast, nID)) = Range(Cells(2, nBangou), Cells(nLast, nBangou)).Value End Sub

共感・感謝の気持ちを伝えよう!

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

>1列目(A1,B1,C1,D1…)にキー項目(名前、番号、地域、住所、ID…)、2列目以降にキー項目のデータが入力されています。 この表現がむちゃ。 これだけで、質問を読む気がなくなる。 ーー もう少し勉強してから、ここに質問すべきだと思う。 (1)画像のコピーを張り付けるとかして、具体的にデータがこうの場合こうしたいという風に例を挙げて質問文章を書くこと。 (2)質問の手操作をして、マクロの記録を取ってみたか。 その場合どこを相対化(変動しても良いように)したいか、考えること。 VBAをやろうというのに、エクセルのこと(手作業でやる場合はどうなるか)が判っているのかな。 VBAは、エクセルの手操作でできる機能を、プログラムコードでやるだけですよ。 余り一般的な表現をしようとしないこと。かえってわかりづらくなる。 「人間(質問者)がシートを見て、」質問のことを、手操作で!やるとしたらどうなるの? 人間の目で見たら、判断できるてできることでも、プログラムで判断するとどうするかということが、問題にはなるが。それとか多数回の繰り返しが必要な場合は、どうプログラムを組むかは課題としてある。 ーー 周りにエクセルの初歩的なことを聞ける人はいないのかな。 折角エクセルに詳しい人も見ているコーナーの特色を生かせる質問や、質問表現をすること。 >VBAに詳しい方がいらっしゃれば教えて欲しいことがあります 内容によるが、エクセルの上級の内容まで質問してよいと思うよ。 わざわざ書く必要なし。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

諸事情にて、返信が大変遅くなりまして申し訳ございません!各アドバイスありがとうございます。特に列と行におきましては、私の不注意ですので以後気をつけるようにいたします!

  • 回答No.1
  • bunjii
  • ベストアンサー率43% (3587/8244)

>下記の前提を含めた作業内容をVBAのコードとしてまとめる事は出来るのでしょうか? あなたの知識と応用力で可否が決まるでしょう。 「下記の前提」で述べている内容ではExcelシートの行と列を取り違えているようです。 >1列目(A1,B1,C1,D1…)にキー項目(名前、番号、地域、住所、ID…)、2列目以降にキー項目のデータが入力されています。 1列目はA1、A2、A3、・・・・というように縦に並んだものを言いますのでA1、B1、C1、・・・・は1行目と言います。 行と列を間違えると処理の結果が目的通りになりません。 「2列目以降にキー項目のデータ」は「2行目以下にキー項目に対するデータ」と読み替えて良いのでしょうか? >【作業内容】 > 「ID」の項目の列には、「番号」の列の文字をコピーして貼りつける(キー項目は上書きせずにIDのまま)。 難解な説明文なのでサンプルデータを提示して頂かないと的確な回答は難しいようです。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • エクセルのVBAについて

    エクセルのVBAに詳しい方がいらっしゃれば、助けて頂きたい事がございます! ・Sheet1(以下S1と記載)の、1列目に、A1セルより、項目として、「ID、地区、住所、電話番号、資産名、耐用年数、取得日」が記載(=S1は項目のみ) ・Sheet2(以下S2と記載)の、1列目に、A1セルより、項目(住所、設備、資産名、区域、備考)と2列目以降にそのデータが記載 【やりたいこと】 S1の項目と完全一致するS2の項目(上記では、住所、資産名のみ)の2列目以降のデータを、S1の2列目以降に張り付ける作業を自動化するコードを書きたいのですが、上手くいかず・・・ どなたかコードを記載して頂けないでしょうか?また下記の前提を考慮したコードであると、なお助かります! 【前提】 ・「S1の項目が空欄にぶつかったら、検索を終了」という事をループに入れる(S1の項目数は変動するため) ・「S2の2列目以降の全てのデータをS1に張り付ける」という事をコードに入れる(S2の2列目以降のデータの列数も変動する且つ途中に空欄も含むため) ・S1の「地区」に、S2の「区域」を反映できるようなコードを入れる 宜しくお願いいたします_(._.)_

  • 列コピーについて

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

  • EXCEL VBA行のコピー繰り返し

    EXCEL VBAで行の特定の列の数字を読み取りコピーしてすぐに下の行に挿入して次の行へというようなことがしたいと考えております。 例 商品ID1の数量の列の数値を読み取り4なら同じデータを3行追加する。追加後次の項目へ(商品ID2の行へ) VBAで可能でしょうか?

  • エクセルで2つの列を1つの列に

    エクセルで2つの列の電話番号データを1つの列に並べて表示する事は可能ですか? ただし1行に2つの列に電話番号が入っている場合は最初の列に入っているデータを使用したいのですが? 使用しているバージョンはoffice2010です。 例のようにデータAをデータBの様に変換したいのです。宜しくお願い致します。 【データA】 A B 090-1111-2222|空欄 03-1111-2222 |080-1111-2222 080-2222-3333|空欄 空欄|090-4444-5555 【データB】 A B C 090-1111-2222| 空欄|090-1111-2222 03-1111-2222 |080-1111-2222|03-1111-2222 080-2222-3333|空欄 |080-2222-3333 空欄|090-4444-5555 |090-4444-5555 このように変換したいので、よろしくご指導ください。

  • エクセルの置換

    m行n列の表があります。 第1行はタイトルで、 第2行の各列には (2,a)セルに関するデータが それぞれ入力されています。 第3行以降は、a列にのみコードが入力されていますが、b列以降は空欄です。 第2行のデータ中の (2,a)セルの文字を、 各行について (m,a)セルの文字に置換しながら第2行を各行にコピーして、(3,b)から(m,n)の空欄を埋めて表を完成させたいのです。 できれば、第2行の各列の書式も含めて第3行以降の各列にコピーするというVBAを教えていただきたくよろしくお願いします。

  • エクセルVBAで、指定した文字列間のデータをコピー

     似たようなものがあるのですが、うまくいかないため、 詳しい方お願いします。  指定した2種類の文字列間のデータをコピーするエクセルVBAです。 データは、A1~A50の1列に入っています。 たとえば 北海道:札幌50 函館 20 青森 青森60 弘前30 岩手 盛岡50 rt 500 30 秋田 秋田1 と続きます。 「青森という文字列以降」から「岩手という文字列の前まで」の間のデータ をコピーして、Sheet2へ貼り付けたいです。 可能であれば、青森のデータは、Sheet2のA5,A6へ 岩手のデータはSheet2のA8,A9へ貼り付けたいです。 よろしくお願いします。 エクセル2007です。

  • ID列を含むテーブルコピー、編集

    ID列を含む「テーブルA」の内容をコピー&コピーの一部項目を編集して、ID列はリセットして振り直しを行った後、「テーブルA」にINSERTするといった事をしたいのです。編集する項目、IDの項目はKEYになっている。 SQLリファレンスで調べてみましたが、SET IDENTITY_INSERT XXXX ON、DBCC CHECKIDENTなどの使い方がいまいち良くわからないのです。 1.「テーブルA」のIDENTITYをはずした形で、コピー先のテーブル「テーブルB」をCREATE。(レイアウトは全く同じ。) 2.「テーブルA」を全て、「テーブルB」(編集用)へINSERT。 3.「テーブルB」の一部項目を編集、「テーブルA」のID列に相当する項目を'1'から配番する。 4.編集後の「テーブルB」を全て、ID列を含む「テーブルA」にINSERT。 上記3、4項の方法が良くわかりません。 データテーブルは、「年度」・「履歴番号」(ID)・「その他項目多数」を持ち、編集方法は、「年度」を新年度に置換し、「履歴番号」を'1'から振り直したものを、「テーブルA」にINSERTしたいのです。 「履歴番号」(ID)の振り直しの条件はありません。レコードTOPから'1'から順に再配番されればいい。 やりたい事は単純なのですが。。。。初心者ですみません。 助言いただければと思い質問しました。

  • エクセルVBA データを別シートに書き込む

    エクセルの、あるシートのデータを、別シートの項目条件の一致するセルに 書き出す方法を教えていただけますでしょうか?  元のシートには  A列     B列    C列 ID番号 年月日番号  金額 ID番号 年月日番号  金額 ID番号 年月日番号  金額  ・      ・       ・  ・      ・       ・ という形で、データが入っています。各列でデータには重複はありますが、   A列とB列の内容が共に同じという行は、ありません。 これを列項目がID番号、行項目が年月日番号の、金額を参照する表にしたいのです。 新しいシートのA列に降順に全ID番号を、1行目に同じく全ての年月日番号をいれ、 元のシートのC列データ(金額)を新しいシートの該当セルに書き込むには どのようにすればいいでしょうか?このような感じで‥。    月日1 月日2 月日3‥‥ ID1 金額  金額  金額 ID2 金額  金額  金額 ID3 金額  金額  金額  ・  ・  ・ 実は元のシートは10枚ほどあり(期間で区切っています)、おまけに各シートには 登場しないID番号もあります。 そこで、すべてのID番号と年月日番号をまとめ、ひとつのシートにしたいと考えた次第です。 1枚のシートならばピボットテーブルで何とかなるのですが、それをまとめようとすると、 データの量が膨大で、PCがとまってしまう(のか計算が終わらない気が‥) VBAを使えば何とかなるのかもと思いまして、質問いたしました。 エクセルは2007です。 どうぞよろしくお願いいたします。

  • 文字列を検索しその列をコピーする(VBA)

    よろしくお願いします。 OS:WINDOWS 2000 PRO 環境:OFFICE 2003 エクセルのVBAについての質問です。 A列には数値コードが入っています。 そのコードは"1"と"2"に分類されてます。 マスターはSHEET1で、このマスターから コード1はSHEET2に、 コード2はSHEET3に 振り分けたいのですが、どうもうまくいきません・・・ A列にはコード"1" "2"以外に空白セルが存在します。 空白セルは無視したい。。。 それとこのデータはDBから抽出するのですが、 抽出したデータは規則性はありません。 抽出するごとに"1"と"2"と"空白"はランダムなので、 LOOP等のマクロを調べてやってみたのですが、出来なくて週末になってしまいました。 A列からコード1とコード2を検索して、 ヒットしたコードの行ごと各SHEETにコピーして、 なおかつ各シートA列の入力されていない一番下の セルにコピーしたいのですが、検索でヒットした 上から順番に。。。 これをLOOPと組合わせれば、各シートにコピーするのは 問題ないような気がします。。。 Sub AAA_BBB() .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0) End With End Sub LOOP等で上記の条件を満たせる方法はないでしょうか。 ご教示を、よろしくお願いします。

  • エクセル VBA ダブルクリックコピー

    A B C a1 a 1 b 2 c 3 B列とC列にデータが入っております。 ※行数は変動します。 ①A2にはB2&C2と数式を入力 ②A2を選択して十をダブルクリックでコピー しB列の値が入ってる最後の行までコピー。 ③ A2を選択して、ctr + shift → ↓コピー これをVBAで作成出来ますでしょうか?