• ベストアンサー

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がさっぱり分かっていません。。。 補足をお願いいたします。