EXCEL VBAで任意の列データを任意の複数列にコピーする方法

このQ&Aのポイント
  • 初心者のため、EXCEL VBAを使用して任意の列データを任意の複数列にコピーする方法を学びたい。
  • 赤枠で囲まれた表で、配列2のデータを配列3,4,5にコピーしたいが、40個の配列と20個以上のデータがあり、手作業では非効率。
  • ユーザーフォームを設定し、ドロップダウンで配列の選択とコピー先の指定ができるようにしたいが、どのようにプログラムを組めばよいか分からない。
回答を見る
  • ベストアンサー

任意の列データを任意の複数列にコピーする。

EXCEL VBAについての質問です。 初心者です。宜しくお願い致します。 使用環境はWindows 2000 service pack4 Excel 2000. =質問= 現在、添付のような表を作成しています。(例です。) 赤枠は入力規制→リスト→元の値=Indirect関数を設定し、シート名"データ"内にあるDATA1~6を参照し、選択できるようになっています。 この表において、例えば配列2のデータを配列3,4,5にコピーしたい。(コピー元に配列番号は任意、コピー先に配列も任意。 ) 例題は配列数、データ数も少ないので例えば配列2と配列4でまったく同じデータを選択した場合、列コピーをするか、それぞれ1つ1つ赤枠をクリックしてデータ1~6を選択すればいいのですが、実際の使用では配列が40個あり、データ数も20個以上あります。 また、場合によってコピー元となる配列番号やコピー先の配列番号、数も変化します。 できれば、ユーザーフォームを設定し、配列○のデータを配列△~□にコピーするというメニューを作成し、一気にコピーを行いたい。(○、△、□がドロップダウンで数値が表示させるようにしたい。) ちなみにVBAをつかって1つ隣のデータをコピーするというプログラムが作成できましたが、コマンドボタンを40個用意しなければならず、いかにも泥縄的手法になってしまいます。 Private Sub CommandButton1_Click() Range("B4").Select Selection.ClearContents Range("B6").Select Selection.ClearContents Range("B8").Select Selection.ClearContents Range("B10").Select Selection.ClearContents Range("B12").Select Selection.ClearContents Range("B14").Select End Sub 上記に示す作業を行うためのVBAプログラムの組み方についてユーザーフォームの設定も含めご教授いただくよう宜しくお願い致します。

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

  • ベストアンサー
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

今ひとつやりたいことが理解できないのですが、 書いてあるコードを簡略にするには dim i as integer For i = 2 to 14   Cells(i , 2).Clearcontents Next と書けます。 私個人の意見ですがマクロを使う場合セルの参照はrangeを使うよりcellの方が扱いやすいと重います。 range("C4")→cells(4,3) ちなみに範囲指定の場合は Range(Cells(開始行 , 開始列) , Cells(終了行 , 終了列)) と表記します。この開始行、終了行等に変数が使えるのであとは For next などのloop制御も書けます。 参考になれば幸いです。

tristan104
質問者

お礼

返信が遅くなり申し訳ありません。 アドバイスに従って、For~Next文を使ってやりたいことができるようになりました。 For ~Nextの場合はCellのほうが使いやすいですね。 的確なアドバイスありがとうございました。 以上、お礼申し上げます。

関連するQ&A

  • 【VBA】コピー&複数個所のペースト繰り返し

    下記のように、1つの値をコピーし、別シートの複数個所(同じ列の違う行)へ順次ペーストしたいのですが、貼付けデータやペースト箇所が増えた場合でも対応できるようなVBAを教えてください。 よろしくおねがいいたします。 ========================================================= Sub コピペ() '←1人目をコピー Worksheets("“コピー元シート”").Range("B7").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B9", "B37", "B65", "B93", "B121", "B149", "B177").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←2人目をコピー Worksheets("“コピー元シート”").Range("B8").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B11", "B39", "B67", "B95", "B123", "B151", "B179").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←3個の値をコピー Worksheets("“コピー元シート”").Range("B9").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B13", "B41", "B69", "B97", "B125", "B153", "B181").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←4個の値をコピー Worksheets("“コピー元シート”").Range("B10").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B15", "B43", "B71", "B99", "B127", "B155", "B183").Select Selection.PasteSpecial Paste:=xlPasteFormulas '←5個の値をコピー Worksheets("“コピー元シート”").Range("B11").Select Selection.Copy '←貼付け Worksheets(“貼付シート”).Range("B17", "B45", "B73", "B101", "B129", "B157", "B185").Select Selection.PasteSpecial Paste:=xlPasteFormulas End Sub

  • エクセルVBAで、シートをコピーした際、コピーされた新しいシートのほう

    エクセルVBAで、シートをコピーした際、コピーされた新しいシートのほうを指定する言葉を知りたい。 コマンドボタンにて、(1)内訳用シートをコピーで増やす。(2)新しいシートの番号を連番になるよう1増やす。(3)新しいシートのほうは入力しやすいよう、入力欄を消去する。シート名も1.2.3...とふえていくようにしたい。 新しくコピーされたほうのシートを指定したい場合はどのようなVBA用語になりますか? いまは、元のシート指定方法しかわからないため、元シートの前にコピー作成し、元シートのNoを1増やし、データ消去で対応していますが、これだと、シート名に表示される内訳(1)(2)・・という番号になるので、できれば、コピーしたほうのシートを指定して、Noを1増やし、データ消去できれば解決するとおもうので。。いま、使ってるVBAはこんな式です。 ちなみにK6はシートNo、("B10:H30")("J10:K30")は入力欄です。 Private Sub CommandButton1_Click() ActiveSheet.Copy Before:=ActiveSheet Range("K6").Value = Range("K6").Value + 1 Range("B10:H30").ClearContents Range("J10:K30").ClearContents ActiveSheet.Select ActiveSheet.Name = Range("K6").Value End Sub

  • エクセルマクロ 抽出したデータを別のシートへコピーしたい

    マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 【1】シート名「データ」をA列でオートフィルタ抽出して、別シートにコピーする。 【2】別シートにコピーしたデータに外枠罫線をつける。 【3】シート名「データ」には塗りつぶしがあるので、別シートにコピーされた塗りつぶしは「なし」する。 【4】シート名「Sheet1」の1~2行目をコピーし、別シートの1~2行目に挿入し、シート名「データ」に戻る。 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、今はコピーして「あ行」の部分を書き換えています。(かなり面倒です) 最終的には、抽出されたそれぞれのシートを別々のブックにしたいとも思っています。 長々とすみませんが、どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 Sheets("データ").Select Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ行", Operator:=xlAnd Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy Sheets("あ行").Select Range("A1").Select ActiveSheet.Paste Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells.Select Selection.Interior.ColorIndex = xlNone Sheets("Sheet1").Select Rows("1:2").Select Selection.Copy Sheets("あ行").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown Range("A1").Select Sheets("データ").Select Range("A1").Select

  • エクセル(VBA)で複数セルのコピーができません

    お世話になっております。 マクロを使って複数のセルを選択してコピーし、別のブックにあるシートへ 貼り付けたいのですが上手くいきません。  Range(Selection, Selection.End(xlToRight)).Select   Selection.Copy 上記のようにコピーしたいセルの入っている行全体の貼り付けは出来たのですが、必要なデータのセルのみ(隣り合っていない)を選択して 貼り付けようとすると何もコピーされていない状態で終了してしまいます。 (変数に代入してコピー等・・・) どなたか教えて下さい。

  • 複数シートをループさせてマクロを簡素化したい

    win7 Excel2007 でマクロ作成中の初心者です。 シート数の変動する複数シートの特定範囲を一枚のシートに右列方向に、値を貼り付けたいです。 自動記録でコード作成しましたが、もっと簡素化して軽くしたいです。 シートに対するループ等の作成ができません。どうかご指導お願いします。 Sub 勤怠最終データ作成() Worksheets(1).Select '1番左のシートを選択 ActiveSheet.Unprotect Range("B29:BM60").Select '複写範囲はすべて同じ Selection.Copy Sheets("総括").Select '値の貼り付けシートはすべて同じ Range("A2").Select '値の貼り付け先 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(2).Select '2枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 '値の貼り付け先 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(3).Select '3枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 Selection.PasteSpecial Paste:=xlPasteValues ’-------------------------------------- Worksheets(4).Select '4枚目のシートを複写 ActiveSheet.Unprotect Range("B29:BM60").Select Selection.Copy Sheets("総括").Select 最終セルの選択 Selection.PasteSpecial Paste:=xlPasteValues 以下省略 End Sub

  • 列を2度コピーするマクロ

    B列をC列にコピーした後、A列をB列にコピーするという2段階コピーの下記マクロを、「新しいマクロの記録」を使って作りました。 しかし下記マクロは 列選択時の青反転が実行時に残って、使用感がいまひとつです。 「新しいマクロの記録」ではなく、もっとスマートなマクロはできないでしょうか? なお、列選択ではなく必要なセル数だけ選択すれば青反転はなくなると思いますが、行数が確定していないので列選択にしたいと思っています。 ついでに下記マクロについて質問です。 11行目はなぜ5行目とは違うのでしょうか?.PasteとPasteSpecial Pasteとの違いを教えていただければ幸いです。 Sub Macro1() Columns("B:B").Select Selection.Copy Columns("C:C").Select ActiveSheet.Paste Columns("A:A").Select Application.CutCopyMode = False Selection.Copy Columns("B:B").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A2").Select Application.CutCopyMode = False ActiveWorkbook.Save End Sub

  • ユーザーフォームを設定して任意列のデータを他の列(複数)にコピーしたい。

    EXCEL VBAについての質問です。 初心者です。宜しくお願い致します。 使用環境はWindows 2000 service pack4 Excel 2000. =質問= VBAのユーザーフォームで任意列のデータを他の列(複数)に コピーしたい。 あるシートにIndirectによる選択肢を沢山設けた表を作成して います。 例えば1つ目のデータは、 A1,A3,A5,A7,A9・・・A21にindirect関数が設定されそれぞれ 選択できるようになっている。(偶数行は見栄えのためのスペ ース。A1,A3,A5,A7,A9・・・A21は全て異なる選択肢。) 2つ目のデータ列は都合上C1,C3,C5,C7,C9・・・C21となって いる。 このデータがA、C、E、G、I、J、K列と約40列並んでいる。 A列で選択したデータを任意の列(例えばE、G、I)に一括でコ ピーしたい。 もちろんコピー元となるA列はCやE列になったりすることもあ ります。 VBAを使って一つ隣の列をコピーするボタンを作ることはでき ましたが、ボタンが約40個もあること、作業性が良くないこ とからユーザーフォームを使って任意の列(列全体ではなくA1,A3,A5,A7,A9 ・・・といった飛び飛びのデータ)を任意の複数の列にコピー させたい。 各列の飛び飛びのデータを変数で返してあげて、指定した列( 表示的には配列番号2~5といった表現)にコピーするにはど のようにVBAを組めばよいでしょうか? 以上、お手数をお掛けしますがご教授の程宜しくお願い致しま す。 p.s 本来ならサンプルをつくって質問すべきですが私用PCにはExcel が入っておらず、会社からは外部へアクセスできない環境なの で言葉のみで説明させていただきました。 理解しにくい部分があれば追記しますので何卒宜しくお願い致 します。

  • 抽出データのコピー

    OFFICE2016 AAのシートのA列を1件ずつ参照し、BBのシートでそれぞれに対応するデータを抽出し、CCのシートへコピーするマクロを作成していますが、 抽出したデータをコピーした後に保存すると、容量がものすごく大きくなっています。 原因は、コピー後にCCのシートが最終行まで使用されている状態になっているから。 下記は作成途中のマクロです Sub TEST() ' Sheets("CC").Select Cells.Select Selection.ClearContents Dim i As Long i = 1 Dim M As String M = Worksheets("AA").Cells(i, 1).Value Sheets("BB").Select Worksheets("BB").Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:=M Columns("A:C").SpecialCells(xlCellTypeVisible).copy Worksheets("CC").Range("B1").PasteSpecial Paste:=xlPasteAll Application.CutCopyMode = False ' Worksheets("BB").Range("A1").CurrentRegion.AutoFilter End Sub 何が原因なのでしょう? また、その解消法教えていただきたく、よろしくお願いします。

  • worksheetクラスのcopyメソッドが失敗しました。

    VBA初心者です。 「worksheetクラスのcopyメソッドが失敗しました。」 エラー回避方法を教えてください。 やりたいことは、データ入力シートから雛形シートにデータを参照して、データ入力シートの1行ずつを新しいシートにしたいです。35シートぐらいをコピーしたら上記のエラーがでました。メモリ不足でエラーになるんだろうなぁということは予測つくのですが、なにか回避方法はありますか? 別のブックを使う方法でもよいです。ご教示ください。 コードはこんな感じです。 Sub シート作成1() 'データ行選択 Range("B9").Select Range(Selection, Selection.End(xlDown)).Select ActiveSheet.Unprotect Rows("8:8").Select Selection.AutoFilter Selection.AutoFilter Field:=12, Criteria1:="<>" Range("B9").Select Range(Selection, Selection.End(xlDown)).Select '選択したデータ行のシート作成 For Each 選択セル In Selection Worksheets("ひな形").Copy after:=ActiveSheet DoEvents 'シート名の変更 ActiveSheet.Name = 選択セル.Value ActiveSheet.Tab.ColorIndex = 38 Next 選択セル DoEvents 'オートフィルタを元にもどす Sheets("データ入力シート").Select Rows("8:8").Select Selection.AutoFilter Range("B1").Select Columns("L:O").Select Selection.EntireColumn.Hidden = True Range("B1").Select ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _ False, AllowSorting:=True, AllowFiltering:=True End Sub よろしくおねがいします。

  • 途中に空白行や列があるデータ範囲

    エクセル2003です。 セルA1からセルC50までデータがあり 10行目と20行目は全て空白、 セルC39が空白で セルE55、F57、G55にはデータがある の状態で以下の構文ですと Sub 範囲コピー1() Range("B3").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy End Sub 途中に空白行や列、空白セルがあり さらに離れた所E55、F57、G55に データが有るのにもかかわらず セルB3からセルG57までを選択してクリップボードにコピー してくれます。 ですが問題がありまして 上記のシートにて A45~F50を選択してDeleteをし、 さらにセルのF55、G55もDeleteして データ範囲を セルA1~E44とセルE55のみにしてからから 上記構文を実行すると セルB3からセルE55を選択してクリップボードにコピー してほしいのに、 データ削除前と同様の セルB3からセルG57を選択してクリップボードにコピー されてしまいます。 これはエクセルの手操作 Ctrl+Shift+End でも同じようになりますので当然の結果(※1)と思っています。 (※1→なにか別な方法はありますか?) 上記の使用方法はあまりないのですが 構文を使う時点での最大行数や最大列数は常に不明で 途中空白が有る場合無い場合、 上記のようにシート上でデータ操作をした直後であっても データ削除部分は加味しデータのある範囲だけの取得の対応 が可能な構文を1種類で作成したいのですが どういう方法があるでしょうか? ちなみに Sub 範囲コピー2() Range("B3").Select Range(Cells(Rows.Count, 1).End(xlUp).Row).Select Range(Cells(1, Columns.Count).End(xlToLeft).Column).Select Selection.Copy End Sub これですと 実行時エラー1004 Rangeメソッドは失敗しましたGlobalオブジェクト となります。 ヘルプをクリックしても何も表示されません。 WEB検索するとこのエラーの質問は結構多いのですが 事例が相違する為よく理解できません。 もしかしてRangeなのに 取得できる値が一つの番号でセルを指定できないからでしょうか? エラーになる構文だと最初のRangeは行番号、次のRangeは列番号、 ですので。 で、 Sub 範囲コピー3() Dim 最終行 Dim 最終列 Range("B3").Select 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 最終列 = Cells(1, Columns.Count).End(xlToLeft).Column Cells(最終行, 最終列).Select Selection.Copy End Sub これならエラーにはなりませんが 事例だとセルC50だけが単独選択されて範囲として 取得をしてくれません。 また 1, Columns.Count ですので最終列の列番号の取得が1行目の最終列から左に検索し データのある所の列番号を返すので 3→C列 となってしまい D,E,F列を見つけてくれません。 かといって 55, Columns.Count では データが55行まで無い場合には対応が出来ませんのでこれも駄目です。 途中に空白が無い場合や離れたセルが無い場合でも使いたいので UsedRangeは使用したくない(よくわかってない事もあって)です。 よろしくお願いします。