• ベストアンサー

excelのデータをコピーする

excelVBAで、他ブック(AAA)にあるシート(AA)のA列に入っているデータをBBBというブックのBBというシートのA列にそのまま移行したいのです。 そこでBBに次のように記述したのですが動作しません。 Range("[AAA]AA!A1:A700").copy Destination:=Range("A1:A700") 本当はAに入力されているものを全て、としたいのですが良く分からなかったためとりあえず700までとしてみました。 また、このモジュールが出来たら、そこから"###"という文字列だけを抜いてコピーをする、というように条件をつけたいと思っているのですが、可能でしょうか? 方法は、VBAでなくマクロでも何でも、出来れば構いません。 教えてください。よろしくお願いいたします。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

マクロ記録だけでは、変動する最終行と文字列を抜くのは大変でしょう。以下に書いてみました。 ”/// 余分な『###』 を削除する ///” 以下の行を削除すると最初の質問のコピーだけ行います。 『文字列だけを抜いてコピー』の解釈に迷いましたが、   『###』はコピーしない   『###』があった行は詰める として書いています。一旦コピーして削除しています。違っていれば補足して下さい。コピーだけなら2、3行ですが、手順を追って書いているため長くなりました。 標準モジュールに貼り付けます。 ご参考に。 Sub CopyBookOpt()   '/// Book、Sheetを定義 ///   Dim wb_A As Workbook   'BookAAA   Dim ws_A As Worksheet   'BookAAA のシートAA     Set wb_A = Workbooks("AAA.xls")     Set ws_A = wb_A.Worksheets("AA")   Dim wb_B As Workbook   'BookBBB   Dim ws_B As Worksheet   'BookBBB のシートBB     Set wb_B = Workbooks("BBB.xls")     Set ws_B = wb_B.Worksheets("BB")   Application.ScreenUpdating = False  '画面更新を止める   '/// コピー範囲を設定 ///   Dim rg_B As Range   'コピー先セル     ws_B.Range("A:A").ClearContents  'ワークシートBBBのシートBBのA列をクリア     Set rg_B = ws_B.Range("A1")    'コピー先はワークシートBBBのシートBBのセルA1   '/// コピー元を定義する。A1から、最終行から上に行って登録されているセルまで ///   Dim rg_A As Range   'コピー元セル範囲     'A1から、最終行から上に行って登録されているセルまで     Set rg_A = ws_A.Range("A1:A" & ws_A.Range("A65536").End(xlUp).Row)   '/// コピー実行 ///   rg_A.Copy rg_B   '/// 余分な『###』を削除する ///   Const strDel = "###"  '削除する文字   Dim rw As Long     '行カウンタ   Dim rwMax As Long    '最終行   rwMax = ws_A.Range("A65536").End(xlUp).Row   For rw = rwMax To 1 Step -1     If Range("A" & rw).Text = strDel Then       Range("A" & rw).Delete Shift:=xlUp     End If   Next   Application.ScreenUpdating = False  '画面更新 End Sub

ponpon
質問者

お礼

どうもありがとうございます。 大変参考になりました。 早速挑戦してみます。

その他の回答 (2)

  • tomo8047
  • ベストアンサー率39% (21/53)
回答No.3

ANo.#1 の続きです。 私はスクリプトを書くのが苦手なので、ほとんど「マクロの記録」を小細工してます。 「マクロの記録」だと絶対座標?や名前入りで記録されるので、それを汎用的な書き方に直せばOKです。 まずは記録して、ステップインで動きを確認してみては如何でしょう? 例えば、開いているブックのSheet1に移動してA列をコピー、新しいブックに貼り付けってのはこんな感じ。 Sub Macro1() Sheets("Sheet1").Select Columns("A:A").Select Selection.Copy Workbooks.Add 'Workbooks.Open Filename:=InputBox("Filename?") ActiveSheet.Paste End Sub Sheet1ってシート名じゃなくて、2枚目のシートならSheets(2)で少し汎用的になります。 .Selectの連続を Sheets(5).Columns("A:A").Copy とかに短縮できます。 InputBoxを使えば、さらに汎用的になるのでは? インターネット上を探せば、色んな技も見つかります。 # ANo.#1の「空白を無視して~」は、思うような動きはしないようです。 # ごめんなさい。

ponpon
質問者

お礼

どうもありがとうございます。 accessでモジュールを書くときはいつもフォームのイベントプロシージャで書いていたので、excelを見たときすごく戸惑いました。 マクロは非常に有効なツールだと感動しています。 参考になりました。どうもありがとうございました。

  • tomo8047
  • ベストアンサー率39% (21/53)
回答No.1

Excelのキー操作をして、「マクロの記録」すれば出来ると思います。 方法(1) A列全体を選択し、コピー&ペースト。 方法(2) 基点となるセル(A1)を選んでから、 Control + Shift + 矢印キー で範囲を指定して、それをコピー&ペースト。 ###を抜くのは、###置換して、形式を選択して貼り付けの「空白を無視して~」オプションを使えば良いのではないでしょうか。

ponpon
質問者

補足

一度の作業ではなくて、常に連携しておきたいのです。且つ、社内で共有するものなのですが、教えていただいた通りに"マクロの記録"を使用した場合、次回からマクロを実行させれば同じ作業を行ってくれるのでしょうか? すみません、今までaccessプログラミングしかしてなかったのでexcelがさっぱり分かっていません。。。 補足をお願いいたします。

関連するQ&A

  • Sheet2にある情報をSheet1のA1に1列で

    マクロを作りたいのですが、以下のようなものをどうすればできるかで詰まっています。 Sheet2にある情報をSheet1のA1に1列(A列B列C列の順)で並ぶようにしたいです。 Sheet2の内容は変わることがあるので、データがどの行まで入っているかはマクロを走らせるときにチェックしないとわからないかと思います。 [Sheet1] 111 222 333 aa bb aaa bbb ccc ddd eee -------------------------- [Sheet2] A B C 1 111 aa aaa 2 222 bb bbb 3 333 ccc 4 ddd 5 eee 素人な質問かもしれないですが、調べてもわからなかったので、教えていただけると幸いです。

  • A列にあったものには1、C列にあったものには2

    シート1の内容をVBAをつかってシート2のようにしたいです。 つまり、シート1の2行目以降のデータをシート2のB列につなげて、 A列には シート1の1行目に記載している番号をふっていきます。 もともとA列にあったものには1、C列にあったものには2、E列にあったものには3と振りたいのですが、どのようにマクロを書けばいいでしょうか? [Sheet1]   A  B  C  D  E 1 1  2  3 2 aa aaa aaaa 3 bb bbb bbbb 4 cc cccc 5  dddd ----------------------------- [Sheet2] A B 1 1 aa 2 1 bb 3 1 cc 4 2 aaa 5 2 bbb 6 3 aaaa 7 3 bbbb 8 3 cccc 9 3 dddd

  • 【少し急いでます】エクセルについて教えてください!

    Excel2000を使っています。 A列に重複するデータがあり、B列に別データがあります(20000行強) 例)     A  B 1  001 aaa 2   001 bbb 3   001 ccc 4   002 aa 5  002 bb 6  003 aaa 7  003 bbb 8  004 ddd 9   004 eee 10  005 aa 11  006 bbb A列で重複する001は3行あり、重複しているデータは1行にまとめてB列のaaa、bbb、cccをつなげたいです。(わかりづらくてすみません) 例)     A      B 1  001  aaa・bbb・ccc 2  002   aa・bb 3  003  aaa・bbb というようにまとめたいです。 どのような方法がありますでしょうか? よろしくお願い致します。

  • エクセルのVBAで、異なるブック間でのコピー&ペースト

    こんばんは。 エクセルのVBAで、異なるブック間でのコピー&ペーストに関しての質問です。 現在アクティブになっているシートのB4セルをコピーして、 現在開いているシートのブックとは異なる特定の ブック(”Book1")の特定のシート(”Sheet1”)のC5セルに貼り付けたい場合、 ●●●の部分に何と表現すればよいか教えてください。 Range("B4").Copy Destination:=●●● よろしくお願いいたします。

  • 抽出データのコピー

    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 何が原因なのでしょう? また、その解消法教えていただきたく、よろしくお願いします。

  • エクセルVBAでエラー、Changeの使い方が×?

    エクセルVBAでBOOK1のsheet1とsheet2とsheet3があり、 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめるようにしました。 マクロを実行するには、Visual Basicを開いてF5を押しています。 それをsheet1かsheet2の中身の一部分でも変更すると そのときに自動的にマクロが実行されるようにしたいです。 sheet1とsheet2とsheet3に Private Sub Worksheet_Change(ByVal Target As Range) Call マクロ() End Sub を入れ、 標準モジュールに Sub マクロ() Workbooks("BOOK.xlsm").Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") Workbooks("BOOK.xlsm").Worksheets("sheet2").Range("C1:BE100").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C51:BE150") Dim UsedCell As Range Dim Max_Row, RowCount As Integer Set UsedCell = ActiveSheet.UsedRange Max_Row = UsedCell.Cells(UsedCell.Count).Row Application.ScreenUpdating = False For RowCount = Max_Row To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(RowCount)) = 0 Then Rows(RowCount).Delete End If Next Application.ScreenUpdating = True End Sub をやって、sheet1かsheet2のセルを変更すると エクセルが固まってしまいます。 デバックでは最初の Workbooks("BOOK.xlsm").Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") がよくないようです。 書き方が間違っているのでしょうか?

  • エクセルVBAでコピー

    エクセルVBAでのコピーについての質問です。 ブック1 とブック2があります。 ブック1 のSheet1 内にマクロ含むワークシートを 新規ブックにファイル名を指定して 下記のようなプログラムでコピーしようとすると (標準モジュール1の内容) Sub newfilesave() MsgBox "デスクトップの「○○」フォルダに控え○○_日付時間.xlsxファイルを生成します。" Sheets("受付仕分リスト").Copy ActiveSheet.Cells.Copy ActiveSheet.Cells.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False ActiveSheet.Range("A1").Select 'マクロなしのエクセルデータとして名前を付け、ファイル形式も決めてデスクトップに日付を付けて保存する。。 ActiveWorkbook.SaveAs _ Filename:="C:\Users\user\Desktop\○○\○○_" & Format(Now(), "yyyymmdd_hhmm"), _ FileFormat:=xlOpenXMLWorkbook End Sub Sheet1 内にマクロの内容までコピーされてしまいます。 ブック1のレイアウトや書式などはそのままに マクロ部分だけを取り除いてコピーするには どのような流れでプログラムすればいいでしょうか? よろしくお願いします。

  • エクセルVBA、他のファイルからのコピー

    BBA初心者です aaa.xlsのマクロで aaa.xls にbbb.csvのデータを貼り付けたいのですが Sub () Windows("bbb.csv").Activate…ここのbbbってところをセル参照にしたいのです ActiveCell.Range("A1:A10").Select Selection.Copy Windows("aaa.xls").Activate ActiveSheet.Paste End Sub 1つ上のセルにbbbと入力されていればbbb.csvのデータを 1つ上のセルにcccと入力されていればccc.csvのデータを 貼り付けれるようなマクロはどう書けばいいのでしょうか よろしくお願いします

  • エクセルVBA

    例えば、 Range("A1").Formula = "=$B$1+$C$1" は可能なのですが、 シートが違う場合の書き方を教えてください。 A1は(AAAシート) B1とC1は(BBBシート) マクロを登録するシートはAAAシートの方です。

  • Excel VBAを使って他ブックのデータ抽出とコピー

    VBA初心者です、よろしくお願い致します。 現在、Excel97を使用して、実績をまとめるファイルを作成しています。 このファイルのシートに、他ブック(ネットワーク上固定フォルダ固定ファイル名)のデータを抽出コピーを行いたいと思っています。 他ブックは、品名(A3)、日付(C3~AG3)(1日~31日)という列からなり、品名数の増減があります。 様々な情報を参照させていただき下記のようなコードを作成しました。 Set wb1 = Application.ActiveWorkbook 'ブックを開く Application.ScreenUpdating = False Set wb2 = Application.Workbooks.Open(dataDirJisseki & dataNameJisseki, ReadOnly:=True) 'コピーする With wb2 .Worksheets("SMT生産実績").Range("A3:A65536").Copy _ Destination:=wb1.Worksheets("work_jisseki").Range("A1") .Worksheets("SMT生産実績").Range(colTmp & "3:" & colTmp & "65535").Copy _ Destination:=wb1.Worksheets("work_jisseki").Range("B1") End With 'ブックを閉じる Set wb1 = Nothing wb2.Close Savechanges:=False Set wb2 = Nothing Application.ScreenUpdating = True 上記プログラムでも希望した動作にはなるのですが、下記について改善したくご相談させていただきました。 (1)抽出する列を他ブックから検索したい  現状では、抽出する列を自ブックのシートの"日付"セルに入力させ、その値に該当する他ブックの列名をSelect Caseを使って判断しています。 Select Case Day(Range("日付")) Case "1" colTmp = "C"     : Case "31" colTmp = "AG" End Select  これでは他ブックの列構成が変わってしまうと異なるデータ列を取ることになるため、日付を使って他ブックから該当列を検索するようにしたいです。 (2)他ブックのデータ数(行列数)を使ってコピーをしたい  現状では行数最大値の65536でコピーしていますが、他ブックのデータ数でコピーしたい。 以上ですが、是非お力添えをいただければと思います。 説明等不足がありましたら、そちらも指摘ください。よろしくお願いします。

専門家に質問してみよう