エクセルのシートのコピー方法について

このQ&Aのポイント
  • エクセルのシートのコピーをVBAで行いたいがエラーが発生してしまう。どこが間違っているのか教えてください。
  • 貼り付けというブックにはマクロが組まれており、データのブックにあるシート名が貼り付けのブックのリストのシートに記載されています。リストのシートに書かれたシートを貼り付けのブックにコピーしたいです。
  • VBAのサブルーチン「シートコピー」を使って、リストに書かれたシートを貼り付けのブックにコピーすることができます。
回答を見る
  • ベストアンサー

エクセルのシートのコピーについて

シートのコピーをVBAで行いたいのですが、エラーになってしまいます。 間違っている箇所が分からないのでご教授お願いします。 貼り付けというブックにマクロが組まれています。 ”データ”のブックにあるシート名が”貼り付けのブックのリスト”のシートに記載されています。 リストのシートに記載されているシートを貼り付けのブックにコピーしたいです。 よろしくお願いします。 Sub シートコピー() 行数 = 2 Do Until IsEmpty(Cells(行数, 3).Value) コピー元 = Workbooks("貼り付け.xls").Worksheet("リスト").Cells(行数, 3) Workbooks("データ.xls").Worksheet(コピー元).Copy After:=Workbooks("貼り付け.xls").Sheets(Workbooks("貼り付け.xls").Sheets.Count) 行数 = 行数 + 1 Loop End Sub

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.1

こういうコードをあたしゃあまり書かないので。 コードは短きゃいいってもんじゃないと思ってるから・・・。 ということで、多分 Workbooks("データ.xls").Activate Sheet(コピー元).Activate Cells.Copy Workbooks("貼り付け.xls").Activate Sheets.Add After:=Sheets(Sheets.Count) Cells.Select ActiveSheet.Paste と、素直に分解すれば動くんじゃないかしら。 多分Copyコマンドでそのままブックを渡った処理が 出来ないんじゃないかと思うので。逆にこれで動かな けりゃ、ステップ実行すればどこで止まったかわかるし。

whitebunny2
質問者

お礼

回答ありがとうございます。 短ければいいというものではないのですね。 今度からは気をつけます。 コピー元 = Workbooks("貼り付け.xls").Worksheet("リスト").Cells(行数, 3) この部分で実行エラーになってしまうのですが、間違った書き方してますでしょうか? よろしくお願いします。

その他の回答 (2)

  • FEX2053
  • ベストアンサー率37% (7987/21354)
回答No.3

「実行エラー438」で検索すればこんなのが出て来ます。 http://officetanaka.net/excel/vba/error/execution_error/error_438.htm 要は、そんなコードは無いって話で、書いてあるコードの どれかが「実際には無い」ものだった・・・って話です。 私の書いたコードで、同じエラーが出れば「Do Until」が 直接原因ですが、多分原因はそっちじゃないでしょう。 もっとも「Do Until」にも問題があるのは自明ですが、 それではこのエラーは出ないと思いますので。 エラーするなら、コードは分解して、1ステップずつチェック。 これ、コーディングの原則ですよ。

whitebunny2
質問者

お礼

返事が遅くなってしまってすみません。 >エラーするなら、コードは分解して、1ステップずつチェック。 これ、コーディングの原則ですよ。 おっしゃる通りです。 問題の箇所を見直したところ、動いてくれました。 ありがとうございました。

  • x-1919
  • ベストアンサー率52% (91/173)
回答No.2

コードがものすごくわかりづらいけれど、 > Do Until IsEmpty(Cells(行数, 3).Value) たぶんこれが原因だと思う。 ここで言っている "Cells" がどのブックのどのシートの "Cells" として処理されるかご存知か? おそらくあなたがイメージしているブック & シートとは違うところにあるセルを読み込もうとしているのだと思う。 その結果、コピー対象となるシート名じゃない値が変数 "コピー元" に入ってしまい、存在しない名前のシートをコピーしようとしてエラーになる、と。

whitebunny2
質問者

お礼

回答ありがとうございます。 分からないことが多々あるので、もう一度基礎から勉強しないといけないと改めて思いました。 Do Until IsEmpty(Cells(行数, 3).Value) 指摘をうけたこの部分ですが、一度消して繰り返しなしで、cells(2,3)のシート名がコピー出来るかテストしたところ、別の箇所でとまりました。 コピー元 = Workbooks("貼り付け.xls").Worksheet("リスト").Cells(行数, 3) ここで実行エラー438と出ました。 変数に出来ないのでしょうか?ちなみにエクセル2000です。 よろしくお願いします。

関連するQ&A

  • EXCEL 別シートのコピー(3)

    こんにちは。 こちらで以前こちらで質問をさせていただき、EXCELの別ブックのシートからコピーをしています。 元のブックのコピーを作り、そこに入力してもらい、元のブックにコピーをしています。(同じフォルダに入れて) Private Sub CommandButton1_Click() Dim myBook As Workbook Set myBook = Workbooks.Open(ThisWorkbook.Path & "\コピー元ブック.xls")  with workbooks("コピー元ブック.xls").worksheets("シート名").usedrange workbooks("貼り付け先ブック.xls").worksheets("シート名").range(.address).value = .value end with end sub ここでブックがない場合、そのブックを飛ばしてあるブックだけコピーしたい場合は、どうしたらいいでしょうか。いろいろやってみましたが、コピーできませんでした。 教えてください。

  • シートを別のブックに複数自動コピー

    初質問です。よろしくお願いします。 マクロを使って、あるブックのシート(20から50枚程度)を、別の貼り付け先のブックに自動的にコピーしようとすると、10回をすぎたあたり(必ずしも一定せず)で 「実行時エラー'1004': WorksheetクラスのCopyメソッドが失敗しました。」 というエラーと共にマクロが止まり、デバッグしようとすると 「ActiveSheet.Copy After:=Workbooks("貼り付け先ブック.xls").Sheets("○○シート")」 のところで止まっています。 マクロの記述内容は以下の通りです。 Sheets("貼り付け元シート").Activate ActiveSheet.Copy After:=Workbooks("貼り付け先ブック.xls").Sheets("○○シート") Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("A1").Select Windows("貼り付け元ブック.xls").Activate ・・・以下貼り付け元シートを変えつつ複数回繰り返し これができる様になれば非常にラクになるので、ぜひご教授願います。

  • エクセル 特定のシートを異なるブックの指定したシートにコピーするマクロ

    エクセルの"貼り付け先.xls"の(シート名="集計")を開いている状態で、 別の異なるブックの"貼り付け元.xls"の(シート名="sheet1")の内容を全部コピーして "貼り付け先.xls"の(シート名="集計元データ")へ貼り付けるマクロは どのようになりますでしょうか? いろいろ調べて下記のように書きましたが、 インデックスが有効範囲にありませんというメッセージが出て、 デバッグを確認すると Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_の部分が黄色く表示されてきます。 (1) "貼り付け先.xls"と"貼り付け元.xls"は同じパソコンのマイドキュメントに保存されています。 (2)"貼り付け元.xls"の"Sheet1"はセルA1から入力されていて、 内容は毎日変わります。 (3)Range("A1")や("A1:IV65536")のセル番地をいろいろ変えたりしても同じでした。 Sub クリップボードを経由せずにコピー貼り付けする_異なるブック() Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_ Workbooks("貼り付け先.xls").Worksheets("集計元データ.xls").Range ("A1:IV65536") End Sub

  • 2つのブックに各々複数のシートがあります。これをユーザーフォームのリストで選択したシート間のコピーをしたい

    ------------------------------------------------------------ Private Sub UserForm_Initialize() Dim lstFsheet As Worksheet 'コピー元シート名格納リスト Dim lstTsheet As Worksheet 'コピー先シート名格納リスト Dim txtFline As Integer 'コピー元行数格納項目 Dim txtTline As Integer 'コピー先行数格納項目 'コピー元シート名リスト 設定 frmCopyNaka.lstFsheet.AddItem "販売台帳11月" frmCopyNaka.lstFsheet.AddItem "販売台帳12月" 'コピー先シート名リスト 設定 frmCopyNaka.lstTsheet.AddItem "2009.11.9" frmCopyNaka.lstTsheet.AddItem "2009.11.13" frmCopyNaka.lstTsheet.AddItem "2009.12.3" End Sub ---------------------------------------------------------- Private Sub cmdCopy_Click() Dim Fsheet As Worksheet Dim Tsheet As Worksheet ' Set Fsheet = Workbooks("販売台帳.xls").Worksheet(lstFsheet) Set Tsheet = Workbooks("申込書.xls").Worksheet(lstTsheet) Tsheet.Cells(txtTline, 2) = Fsheet.Cells(txtFline, 3) ------------------------------------------------------------ という感じでうまくいくと思ったのですが、 Set Fsheet = Workbooks("販売台帳.xls").Worksheet(lstFsheet) の[worksheet(lstFsheet)]で[型が一致しない]のエラーになります。 シート名を変数として扱う事は出来ないのでしょうか? 基礎の勉強が不足しているのに、見よう見まねでやっているから こんな事になるんでしょうね… わかりやすい説明をお願いします。

  • ブックの保護(シート構成) でシートのコピー

    エクセルで外部データを参照させるために, 別のブックを開きシートをコピーし元のブックに貼り付け別のブックは閉じるというマクロを作成しました。 Workbooks.Open Filename:=a Sheets("データ").Select Sheets("データ").Copy After:=Workbooks("ファイル.xls").Sheets("メニュー") Workbooks(a).Close SaveChanges:=False a(変数)というファイルを開く シートのデータを選択 データをコピーし ファイル.xls のメニューシートの後に貼り付け a(変数)のエクセルファイルを保存せずに閉じる 動作としては正常に動きました。 しかし、この ファイル.xls には ID とパスワードで管理しています。 その管理したシートがあるんですが、それを表示させないために シートを非表示→ブックの保護→シート構成 を行いました。 マクロを動かすと、シート構成をしているので Sheets("データ").Copy After:=Workbooks("ファイル.xls").Sheets("メニュー")  が動かないことに気が付きました。 何かいい方法があればご教授お願いします。

  • 「 このコード 」 のチェック を お願い致します。

    下記コードは何とか動作しますが、チェックお願い致します。 1、 MsgBox "「 空白シート 」 は ありません。"    の    追加編集が、よくわかりません。 2、 1以外に、おかしな箇所をご教示お願い致します。 --------------------------- '「 ブック1 」 に空白シートがあったら、そこへ貼り付ける Sub 空白シートへコピー() Dim ws As Worksheet For Each ws In Workbooks("ブック1.xls").Sheets If IsEmpty(ws.UsedRange) = True Then Workbooks("ブック2.xls").Activate Cells.Select Selection.Copy Workbooks("ブック1.xls").Activate ws.Select Range("A1").Select ActiveSheet.Paste Else MsgBox "「 空白シート 」 は ありません。" End If Next End Sub

  • エクセル 何故かシート間の値のコピーが出来ない

    いつもお世話になります。 開いているブックのシート「リスト1~3」に、Book1.xlsの「リスト1~3」の値をコピーする為に、下記のマクロを作成しました。 Dim SH1, SH2, SH3, SH4, SH5, SH6 As Worksheet Set SH1 = ThisWorkbook.Worksheets("リスト1") Set SH2 = ThisWorkbook.Worksheets("リスト2") Set SH3 = ThisWorkbook.Worksheets("リスト3") Set SH4 = Workbooks("Book1.xls").Worksheets("リスト1") Set SH5 = Workbooks("Book1.xls").Worksheets("リスト2") Set SH6 = Workbooks("Book1.xls").Worksheets("リスト3") 'リスト1をコピーする D = SH4.Range("A1").CurrentRegion.Rows.Count E = SH4.Range("A1").CurrentRegion.Columns.Count SH1.Range(Cells(1, 1), Cells(D, E)).Value = SH4.Range("A1").CurrentRegion.Value 'リスト2をコピーする F = SH5.Range("A1").CurrentRegion.Rows.Count G = SH5.Range("A1").CurrentRegion.Columns.Count SH2.Range(Cells(1, 1), Cells(F, G)).Value = SH5.Range("A1").CurrentRegion.Value 'リスト3をコピーする H = SH6.Range("A1").CurrentRegion.Rows.Count I = SH6.Range("A1").CurrentRegion.Columns.Count SH3.Range(Cells(1, 1), Cells(H, I)).Value = SH6.Range("A1").CurrentRegion.Value 以上を実行すると、「アプリケーション定義またはオブジェクト定義のエラーです」とエラーメッセージが出てしまいます。 それぞれのシートの処理の時に、 SH1.Select SH2.Select SH3.Select を入れて、シートを選択してから実行すると問題なく動くのですが、何故このようなことが起こるのでしょう?

  • VBで既存エクセルシートを新規ブックにコピー

    VB6,Excel2003です。 既存のエクセルシートを新規ブックにコピーする プログラムを作成してみましたが タスクバーに新規ブックのタスクバーボタンが2つできてしまいます。 どこが原因か教えてください。よろしくお願いします。 Private Sub Command1_Click() Dim xlsApp As Excel.Application Dim xlsBookTemp As Excel.Workbook 'コピー元ブック Dim xlsBookCopy As Excel.Workbook 'コピー先ブック Dim xlsSheetTemp As Excel.Worksheet 'コピー元シート Dim xlsSheetCopy As Excel.Worksheet 'コピー先シート Set xlsApp = CreateObject("Excel.Application") Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls") Set xlsSheetTemp = xlsBookTemp.Sheets(1) Set xlsBookCopy = xlsApp.Workbooks.Add Set xlsSheetCopy = xlsBookCopy.Sheets(1) xlsApp.Visible = True 'コピー元のSheet1を新規ブックにコピーする xlsSheetTemp.Copy Before:=xlsSheetCopy 'コピー元のブックは閉じる xlsBookTemp.Close '///新規ブックの編集処理/// Set xlsSheetTemp = Nothing Set xlsBookTemp = Nothing Set xlsSheetCopy = Nothing Set xlsBookCopy = Nothing Set xlsApp = Nothing End Sub

  • ワークシートをコピーしたい

    下記載のサンプルマクロは「ワークシートをコピーして、追加したワークブックにコピペする」マクロなんですが、これを「ワークシートをコピーして、追加したワークシートにコピペする」にできないでしょうか? 出来るのであれば、値と書式の他に関数もそのまま貼り付けたいので御教授お願いします。 ただマクロは削除してマクロ抜きのコピペが理想です。 宜しくお願い致します。 Sub サンプル() Dim sc As Integer sc = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = 1 ThisWorkbook.Sheets("オリジナル").Cells.Copy 'コピー Workbooks.Add 'ブック追加 Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlValues '値貼り付け Sheets("Sheet1").Range("A1").PasteSpecial Paste:=xlFormats '書式貼り付け Sheets("Sheet1").Name = "コピー" Application.CutCopyMode = False Application.SheetsInNewWorkbook = sc ActiveWorkbook.Close ThisWorkbook.Activate End Sub

  • エクセルVBAで書式と値の貼付けにつて

    エクセル2007VBAで新規ファイルを作る場合のコピー、貼り付けで質問しましたが 式も全て貼り付けになるとUSBメモリーで持ち出した場合、エラーとなります。 それで値と書式のみ貼り付けする様下記の様に書き直しましたが、.PasteSpecialでメソッドまたはデータメンバーが見つかりませんとなります。 ぐぐっててヘルプを見ますが解決出来ません。どなたがご教授お願いします。 元の式 Sub DGCopy() Workbooks.Add With ThisWorkbook .Sheets(5).Cells.Copy Sheets(1).Cells Sheets(1).Select Sheets("Sheet1").Name = "電気代" .Sheets(6).Cells.Copy Sheets(2).Cells Sheets(2).Select Sheets("Sheet2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ' ダイアログでCancelをクリックした場合 ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub 書き直した式 Sub DGCopy() Workbooks.Add With ThisWorkbook Sheets(5).Select Cells.Selection.Copy Sheets(1).Selection .PasteSpecial Paste:=xlPasteFormats ←エラー部分 .PasteSpecial Paste:=xlPasteValues Sheets("sheets1").Name = "電気代" Sheets(6).Select Cells.Selection.Copy Sheets(2).Selection .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues Sheets("sheets2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub

専門家に質問してみよう