- ベストアンサー
excelのデータをコピーする
excelVBAで、他ブック(AAA)にあるシート(AA)のA列に入っているデータをBBBというブックのBBというシートのA列にそのまま移行したいのです。 そこでBBに次のように記述したのですが動作しません。 Range("[AAA]AA!A1:A700").copy Destination:=Range("A1:A700") 本当はAに入力されているものを全て、としたいのですが良く分からなかったためとりあえず700までとしてみました。 また、このモジュールが出来たら、そこから"###"という文字列だけを抜いてコピーをする、というように条件をつけたいと思っているのですが、可能でしょうか? 方法は、VBAでなくマクロでも何でも、出来れば構いません。 教えてください。よろしくお願いいたします。
- ponpon
- お礼率63% (81/128)
- オフィス系ソフト
- 回答数3
- ありがとう数2
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
マクロ記録だけでは、変動する最終行と文字列を抜くのは大変でしょう。以下に書いてみました。 ”/// 余分な『###』 を削除する ///” 以下の行を削除すると最初の質問のコピーだけ行います。 『文字列だけを抜いてコピー』の解釈に迷いましたが、 『###』はコピーしない 『###』があった行は詰める として書いています。一旦コピーして削除しています。違っていれば補足して下さい。コピーだけなら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
その他の回答 (2)
- tomo8047
- ベストアンサー率39% (21/53)
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の「空白を無視して~」は、思うような動きはしないようです。 # ごめんなさい。
お礼
どうもありがとうございます。 accessでモジュールを書くときはいつもフォームのイベントプロシージャで書いていたので、excelを見たときすごく戸惑いました。 マクロは非常に有効なツールだと感動しています。 参考になりました。どうもありがとうございました。
- tomo8047
- ベストアンサー率39% (21/53)
Excelのキー操作をして、「マクロの記録」すれば出来ると思います。 方法(1) A列全体を選択し、コピー&ペースト。 方法(2) 基点となるセル(A1)を選んでから、 Control + Shift + 矢印キー で範囲を指定して、それをコピー&ペースト。 ###を抜くのは、###置換して、形式を選択して貼り付けの「空白を無視して~」オプションを使えば良いのではないでしょうか。
補足
一度の作業ではなくて、常に連携しておきたいのです。且つ、社内で共有するものなのですが、教えていただいた通りに"マクロの記録"を使用した場合、次回からマクロを実行させれば同じ作業を行ってくれるのでしょうか? すみません、今まで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:=●●● よろしくお願いいたします。
- 締切済み
- Visual Basic
- 抽出データのコピー
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 何が原因なのでしょう? また、その解消法教えていただきたく、よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
- エクセル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のレイアウトや書式などはそのままに マクロ部分だけを取り除いてコピーするには どのような流れでプログラムすればいいでしょうか? よろしくお願いします。
- 締切済み
- Visual Basic
- エクセル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シートの方です。
- ベストアンサー
- Microsoft ASP
- 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でコピーしていますが、他ブックのデータ数でコピーしたい。 以上ですが、是非お力添えをいただければと思います。 説明等不足がありましたら、そちらも指摘ください。よろしくお願いします。
- ベストアンサー
- Visual Basic
お礼
どうもありがとうございます。 大変参考になりました。 早速挑戦してみます。