VBAでシートをコピーする方法

このQ&Aのポイント
  • VBAでシートをコピーする方法について質問します。Bファイルには指定のシートが挿入されているのですが、Aファイルのシート1がコピーされない問題が発生しています。どこに問題があるのかわかりません。解決策を教えてください。
  • VBAを使用してAファイルのシート1をBファイルにコピーしようとしていますが、うまくいきません。Bファイルには他のシートは挿入されていますが、シート1だけがコピーされません。どのようにすれば解決できるでしょうか?
  • VBAのコードでAファイルのシート1をBファイルにコピーしようとしていますが、うまくいきません。シートが挿入されるのはBファイルですが、シート1がコピーされません。どの部分が間違っているのか教えてください。
回答を見る
  • ベストアンサー

vbaについて勉強中です

以下の構文を実行しました。 結果、Bファイルにはsheet(仮)が挿入されましたがAファイルのsheet1がコピーされません。 どこがどのように間違っているのかわかりません。 どなたかご教授ください。 Sub コピー() Dim sc '貼り付け先ファイルのシート数 Dim scn '貼り付け先ファイルのシート名 Dim F_T '貼り付け先ファイル名 Dim F_0 'コヒー元ファイル名 Dim cc 'コピー元のシート数 Dim ccn 'コピー元のシート名 On Error GoTo ed 'エラーの場合の処理 F_T = Application _ .GetOpenFilename("エクセルファイル(C:\Users\***\Desktop\B\B.xlsx),C:\Users\***\Desktop\B\B.xlsx", _ , "貼り付け先ファイルを開く") If F_T = False Then GoTo ed Workbooks.Open F_T F_T = ActiveWorkbook.Name sc = Workbooks(F_T).Sheets.Count '作業用の仮シートの追加 ActiveWorkbook.Sheets.Add After:=Worksheets(sc) ActiveSheet.Name = "仮" F_0 = Application _ .GetOpenFilename("エクセルファイル(C:\Users\***\Desktop\A\A.xlsm),C:\Users\***\Desktop\A\A.xlsm", _ , "コピー元ファイルを開く") If F_0 = False Then GoTo ed Workbooks.Open F_0 F_0 = ActiveWorkbook.Name cc = Workbooks(F_0).Sheets.Count 'このブックのシート名のすべてを繰り返し For f = sc To 1 Step -1 scn = Workbooks(F_T).Sheets(f).Name 'コピー元のブックのシート名を繰り返し For T = 1 To cc ccn = Workbooks(F_0).Sheets(T).Name 'もし、シート名が同じなら If scn = ccn And Workbooks(F_T).Sheets.Count > 1 Then 'シートの削除 Application.DisplayAlerts = False Workbooks(F_T).Worksheets(ccn).Delete Application.DisplayAlerts = True Else End If Next T Next f 'コピー元のブックのシート名を繰り返し For T = cc To 1 Step -1 ccn = Workbooks(F_0).Sheets(T).Name 'シートのコピー Workbooks(F_0).Worksheets(ccn).Copy _ Before:=Workbooks(F_T).Worksheets(1) Next T '作業用の仮シートの削除 Application.DisplayAlerts = False Workbooks(F_T).Worksheets("仮").Delete Application.DisplayAlerts = True Workbooks(F_0).Close SaveChanges:=False Exit Sub ed: MsgBox "エラーが発生したため、処理を取り消しました" End Sub

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

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

長々とコードを張り付けて、その目的、正常稼働のイメージも告げずに "すぐに回答を!" ってのはどうなんだろか。 以下、勝手に想像した仕様に基づいた検証。 仕様: A.xslm ファイルの全シートを B.xlsx にコピーする。 もし A.xlsm ファイルのシートと同じ名前のシートが B.xlsx に存在したら、先に B.xlsx 側の同名シートを削除してからコピーする。 サンプル: 以下の 2つのブックを使って検証を行った。 A.xlsm  "Sheet1" "シート1" "シート2" "シート3" "ほげ" の 4つのシートを持ち、各シートのセルにはブック名とシート名を記述。 B.xlsx  "シートA" "シートB" "シートC" "ほげ" の 4つのシートを持ち、各シートのセルにはブック名とシート名を記述。 検証結果: コードを実行した結果、B.xlsx には A.xlsm からコピーされた "Sheet1" "シート1" "シート2" "シート3" "ほげ" と、最初からあった "シートA" "シートB" シートC" が残り、最初から B.xlsx にあった "ほげ" は削除された。 したがって、「結果、Bファイルにはsheet(仮)が挿入されましたがAファイルのsheet1がコピーされません。」 は再現しなかった。ただし "Sheet (仮)" が何の事なのかは不明。 その他に気になった点: 提示されたコードでは B.xlsx に空のシートを追加して "仮" という名前にする箇所があるが、このシートに対して特に何の処理もせず、あとから削除しているのが不要だと感じた。 For ~ Next のカウントに使っている変数 f と T の宣言がされていない。 変数の使いまわしが多い。 別のブックをコントロールする内容なのにオブジェクト変数 (Workbook型や Worksheet型) を使用せずにブック名やシート名の文字列頼りになっている点で、処理対象を誤る危険性を感じる。 下のコードは洗練されてないが、とりあえず作ってみたもの。 コピー後のシートの並び順が希望と逆になっているが、とりあえず動くと思う。 Sub hoge()   Dim destBook As Workbook ' コピー先ブック   Dim destSheet As Worksheet ' コピー先ブックのシート   Dim srcBook As Workbook ' コピー元ブック   Dim srcSheet As Worksheet ' コピー元ブックのシート   Dim destPath As Variant, srcPath As Variant ' ブックのパス   destPath = Application.GetOpenFilename("Excel ファイル (*.xlsx), *.xls", , "貼り付け先ファイル")   If destPath = False Then     Exit Sub   End If   srcPath = Application.GetOpenFilename("Excel ファイル (*.xlsm), *.xls", , "コピー元ファイル")   If srcPath = False Then     Exit Sub   End If   Set destBook = Workbooks.Open(destPath)   Set srcBook = Workbooks.Open(srcPath)   For Each srcSheet In srcBook.Worksheets     For Each destSheet In destBook.Worksheets       If srcSheet.Name = destSheet.Name Then         Application.DisplayAlerts = False         destSheet.Delete         Application.DisplayAlerts = True         Exit For       End If     Next     srcSheet.Copy Before:=destBook.Worksheets(1)   Next   srcBook.Close SaveChanges:=False End Sub

taka7110
質問者

お礼

回答ありがとうございます。 質問の仕方が悪くすみません。 早々、実行してみます。

関連するQ&A

  • WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】

    よろしくお願いします。 今あるブックにあるシートを別のブックにコピーしたいのですが、今考えているのは ここから//////// 'ブックを開く Workbooks.Open コピー元のブックのパス 'シートをコピー Worksheets.Item(コピーするシート名).Copy _ after:=Workbooks(コピー先のブック名).Sheets(1) 'ブックを閉じる Application.DisplayAlerts = False Workbooks.Item(コピー元のブック名)Close True Application.DisplayAlerts = True ここまで//// なのですが、コピーものとのブックが複数ある時、画面がチラチラしてしまいます。ブックをオープンさせずにシートを他ブックにコピーさせる方法ってないでしょうか。 ご存知の方がいらっしゃいましたら、ご教授お願いします。

  • インデックスが有効範囲にありませんと出てしまう

    VBAで"実行時エラー9 インデックスが有効範囲にありません"と出てしまいます、解決方法を教えていただけないでしょうか? 以下のVBAで上記のエラーが出てしまいます。ちなみに私はVBA初心者です。 VBAの内容としてはとあるブックのシートを丸ごと、そのシートを必要とするブックのシートに貼り付けるというものです。 Sub コピー() Dim ファイル名, 基本ファイル名 Dim i, j As String i = ActiveWorkbook.Name j = ActiveSheet.Name Application.DisplayAlerts = False 基本ファイル名 = Sheets("データリスト").Range("B14").Value →ここでエラー発生 Workbooks.Open 基本ファイル名 If Err.Number > 0 Then MsgBox "『○○』を開けませんでした" & vbCrLf & _ "ファイル名が間違っているか、存在しないか、拡張子が違います" & vbCrLf & vbCrLf & _フォルダ & " に " & vbCrLf & _ 基本ファイル名 & "ファイルがありません" Exit Sub End If Worksheets("リスト").Range("A1:N400").Copy Workbooks(i).Worksheets("リスト").Range("A1:N400").PasteSpecial Workbooks(基本ファイル名).Close SaveChanges:=False →ここでもエラーが出てしまうことがある Sheets(j).Select Application.DisplayAlerts = True MsgBox ("リストを取り込みました") End Sub

  • VBAでも新規ファイル作成

    Excel2003です。 下記のコードであるシートを別ファイルにして保存するコードを書いています。ただ、このコードでは、コピー元のシートにExcel関数が入っているために、出来上がった新規ファイルを開くときに常に”リンクの更新”を聞かれてしまいます。リンクの更新をする必要はないのでファイルを開くたびに”更新しない”を選択してもよいのですが、初めからこの”リンクの更新”メッセージが出ないようにするには何か良い手立てはないでしょうか? ------------------------------------------------------------- Sub ファイル作成() '報告書を"名前を付けて保存" Sheets("Sheet1").Select Dim 既定ファイル名 As String Dim 保存ファイル名 As Variant 既定ファイル名 = "新規報告書" 保存ファイル名 = Application.GetSaveAsFilename(既定ファイル名, "Excel ブック(*.xls),*.xls") If 保存ファイル名 = False Then MsgBox "保存は中止されました。" Sheets("Sheet1").Select Else With ThisWorkbook.ActiveSheet Workbooks.Add .Copy After:=ActiveWorkbook.Sheets(1) Application.DisplayAlerts = False ActiveWorkbook.Sheets(1).Delete Application.DisplayAlerts = True ActiveWorkbook.SaveAs 保存ファイル名, xlNormal ActiveWorkbook.Close False End With Sheets("Sheet1").Select End If End Sub ---------------------------------------------------------------

  • 保護されたブックのコピーについて

    現在、ボタンを押すと新規ブックが作成され、最初のブックのシートをコピーするというマクロを組みました。 しかし、元になるブックにはブックの保護とシートの保護を両方かけていて、途中でエラーになるはずなのですが、何故かそうならずに普通に新規ブックにコピーがされます。 上手くいったのですがエラーが出ると予想していたので気持ちが悪く、また個人だけで使うわけじゃないので原因を知っておきたいです。 どなたかよろしくお願いします。 Private Sub makeBookButton_Click() Dim myWorkBook As String Dim newWorkBook As String Dim mySheet As Worksheet Application.ScreenUpdating = False On Error GoTo ErrTrap Application.DisplayAlerts = False myWorkBook = ThisWorkbook.Name Workbooks.Add ActiveWorkbook.SaveAs Filename:=NEWBOOK newWorkBook = ActiveWorkbook.Name Workbooks(myWorkBook).Activate For Each mySheet In ThisWorkbook.Worksheets Workbooks(myWorkBook).Sheets(mySheet.Name).copy after:=Workbooks(newWorkBook).Sheets(Workbooks(newWorkBook).Sheets.Count) Next Workbooks(NEWBOOK).Sheets("Sheet1").Delete Workbooks(NEWBOOK).Sheets("Sheet2").Delete Workbooks(NEWBOOK).Sheets("Sheet3").Delete Application.DisplayAlerts = True Application.ScreenUpdating = True Exit Sub ErrTrap: Call MsgBox("ブック作成時にエラーが発生しました。", vbCritical) End Sub

  • エクセルVBAが途中で止まります

    以前別のカテゴリで質問したのですが、そちらでは解決出来なかったので、こちらで改めて質問します。 下記のマクロで、一つのブックからSheet1だけをコピーして来て、少し処理をし、元のブックを閉じるというもので、ブックの数は多くて3000程、少ない時は300位です。 で、このマクロだと900位までですと最後まで行くのですが、それを超えるとリストが95位で止まってしまいます。 自宅で別データを作ってやってみるとうまくいきました。 コピー元のブックにはテキストデータのみで、200文字から500文字程度の大きさしかありません。 ファイル名も50文字程度の物を全部20文字程度まで短くしてもみましたが、ダメでした。 どうかお知恵をお貸しください。 Sub ★1★ブックの結合() Dim sFile As String Dim sWB As Workbook, dWB As Workbook, aWB As Workbook Dim dSheetCount As Long Dim i As Long Dim SOURCE_DIR As String 'エクセルデータに変換されたファイルのあるフォルダを選択します。 MsgBox "エクセルに変換されたデータのフォルダを選択" With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then SOURCE_DIR = .SelectedItems(1) & "\" End If End With Application.ScreenUpdating = False '指定したフォルダ内にあるブックのファイル名を取得 sFile = Dir(SOURCE_DIR & "*.xls") 'フォルダ内にブックが無ければ終了 If sFile = "" Then Exit Sub '集約用ブックを作成 Set dWB = Workbooks.Add '転記マクロの中のDMリストシートをコピーする Workbooks("転記用マクロ.xlsm").Worksheets("DMリスト").Copy Before:=dWB.Worksheets("Sheet1") Application.DisplayAlerts = False Worksheets(Array("Sheet1", "sheet2", "sheet3")).Select ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True '集約用ブック作成時のシート数を取得 dSheetCount = dWB.Worksheets.Count Do 'コピー元のブックを開く Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile) 'コピー元のsheet1を集約用ブックにコピー sWB.Worksheets("sheet1").Copy After:=dWB.Worksheets(dWB.Sheets.Count) シート転記 'コピー元ファイルを閉じる Application.DisplayAlerts = False sWB.Close Application.DisplayAlerts = True 'セルA2の名前を変更する 'シート名をセルA2の値に変更 'ActiveSheet.Name = Range("A2").Value '次のブックのファイル名を取得 sFile = Dir() Loop While sFile <> "" '集約用ブックを保存する 'dWB.SaveAs Filename:=DEST_FILE Application.ScreenUpdating = False End Sub

  • Excelマクロについての質問です。

    Excelのマクロについての質問です。 マクロについての質問です。 以下のようなマクロを作成しました。 このマクロを動作させているのはこのマクロを作成したファイル上です。 Sub Macro9() Dim WBA As Workbook Dim WBB As Workbook Dim WSA As Worksheet Dim WSB As Worksheet Set WBA = Workbooks("A") Set WBB = Workbooks("B") Set WSB = WBB.Worksheets("1") For i = 100 To 3000 Step 20 Worksheets.Add Before:=Worksheets("Sheet1") Dim k As String k = i ActiveSheet.Name = (k / 100) Set WSA = WBA.Worksheets(k / 100) WSB.Range("A1:AY30").Copy Destination:=WSA.Range("A1") WSA.Range("D4:I30").Clear WSA.Range("Q4:V30").Clear WSA.Range("AD4:AI30").Clear WSA.Range("AQ4:AV30").Clear Next i Application.DisplayAlerts = False Sheets("Sheet1").Delete Application.DisplayAlerts = True Application.DisplayAlerts = False Sheets("Sheet2").Delete Application.DisplayAlerts = True Application.DisplayAlerts = False Sheets("Sheet3").Delete Application.DisplayAlerts = True End Sub そこで質問ですが、このマクロを作動させると何のエラーの表示もなく最後まで動作は完了します。 ですが、シートの作成は30まで作成できてもその後のセルのコピー&ペーストはなぜかシート6.8までしかできていません(7~30までのシートはシート作成はできているのですがコピペのみが実行されず空白のままになっています。) シートもコピペも両方ともシート30まで完了するにはどの点を改善すればいいのでしょうか? 知恵が足りずどうしても直す事が出来ません。 長文申し訳ございませんが是非皆さまのお知恵をお貸しください。 宜しくお願い致します。

  • VBAで複数シートをまとめたい

    VBAを作るのは今回が初めてで行き詰ってしまいました。 フォルダ内の「.xlsx」4つのファイルのSheet1(4つともSheet1です) を統合.xLsmの1月シートのb2~値でコーピー貼り付けを行いたいのですが、 下記のものでやっていけば出来のかなと思ってますが、ご教授お願い致します。 Private Sub CommandButton1_Click() Dim sFile As String Dim sWB As Workbook, dWB As Workbook Dim dSheetCount As Long Dim i As Long Dim c As Long Dim ws As Worksheet Debug.Print (ws.Index) Const SOURCE_DIR As String = "C:\Users\KWEUSER\Desktop\data\" Application.ScreenUpdating = False '指定したフォルダ内にあるブックのファイル名を取得 For c = 1 To 4 sFile = Dir(SOURCE_DIR & "*.xlsx") 'フォルダ内にブックがなければ終了 If sFile = "" Then Exit Sub '集約用ブックを作成 Set dWB = Workbooks.Add '集約用ブック作成時のシート数を取得 dSheetCount = dWB.Worksheets.Count Do 'コピー元のブックを開く Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile) 'コピー元の c (1,2,3,4,5)シートを集約用ブックにコピー sWB.Worksheets(c).Copy After:=dWB.Worksheets(dSheetCount) 'シート名をファイル名に ActiveSheet.Name = sFile 'コピー元ファイルを閉じる sWB.Close '次のブックのファイル名を取得 sFile = Dir() Loop While sFile <> "" '集約用ブック作成時にあったシートを削除 Application.DisplayAlerts = False For i = dSheetCount To 1 Step -1 dWB.Worksheets(i).Delete Next i Application.DisplayAlerts = True '集約用ブックを保存して閉じる dWB.SaveAs Filename:="C:\Users\KWEUSER\Desktop\data\" & c & ".xlsx" dWB.Close Next Application.ScreenUpdating = False End Sub

  • VBAの質問です。

    VBAの質問です。 以下のプログラムで、4列おきにコピーしたい時はどうすればいいでしょうか? 1つのフォルダの中に集約第1期・集約第2期・集約第3期という名前の3つのファイルがあり、 その3つのファイル全てに「結果」というシートがあります。 この「結果」シートのC4:AU37の数値をコピーします。 コピーした数値を、集約第3期のファイルの中にある「集計用シート」のC2から貼り付けしていきたいのですが、 この時に、4列おきにはりつけたいと思っています。 集約第1期ファイル-結果-C4の列→集約第3期ファイル-集計用シート-C2の列から4列おきに 集約第2期ファイル-結果-C4の列→集約第3期ファイル-集計用シート-C3の列から4列おきに 集約第3期ファイル-結果-C4の列→集約第3期ファイル-集計用シート-C4の列から4列おきに といった具合です。 集約第3期ファイル-集計用シート-C5の列は空白し、C6からまた貼り付けます。 どこをどう直せば良いでしょうか? Sub データ抽出() Dim i As Long Dim flg As Boolean Dim myWb As Workbook Dim myWbName As String Application.ScreenUpdating = False ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path ThisWorkbook.Worksheets("集計用シート").Range("C2:EG35").Clear For i = 1 To 3 flg = False myWbName = "集約第" & i & "期.xls" If myWbName <> ThisWorkbook.Name Then For Each myWb In Workbooks If myWb.Name = myWbName Then flg = True Next myWb If flg = False Then Workbooks.Open Filename:=myWbName Else Workbooks(myWbName).Activate MsgBox myWbName & "を閉じてから再実行してください。" Exit Sub End If End If Worksheets("結果").Range("C4:AU37").Copy ThisWorkbook.Worksheets("集計用シート").Range("C2").Offset(, 45 * (i - 1)).PasteSpecial Paste:=xlPasteValues If myWbName <> ThisWorkbook.Name Then Application.DisplayAlerts = False Workbooks(myWbName).Close SaveChanges:=False Application.DisplayAlerts = True End If Next i Application.CutCopyMode = False Application.ScreenUpdating = True End Sub

  • Excel VBA 非表示の別ブックへシートコピー

    Excel2010のVBAで、別のExcelブックを非表示で開いて、 シートをコピーすると、 「実行時エラー'1004':WorksheetクラスのCopyメソッドが失敗しました。」 というエラーが出て、正しくシートをコピーすることができません。 (1)のように自分のブックへはシートをコピーすることはできるのですが、 (2)のように別のExcelブック上でシートをコピーする場合と (3)のように別のExcelブック上にシートをコピーする場合の いずれも同様のエラーになります。 どのように記述すれば(2)と(3)でもコピーすることができるのでしょうか。 ------------------------------------------------------------- Sub test()  Dim newEx As Excel.Workbook  Dim newFile As String  newFile = ThisWorkbook.Path & "\New_Book.xlsx"  Set newEx = Workbooks.Open(newFile, UpdateLinks:=0)  Application.Windows("New_Book.xlsx").Visible = False  '(1)New_BookのSheet3を自分のブックにコピーする (正常)  newEx.Worksheets("Sheet3").Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)  '(2)New_BookのSheet3をNew_Bookにコピーする (エラー)  newEx.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  '(3)自分のブックのSheet3をNew_Bookにコピーする (エラー)  ThisWorkbook.Worksheets("Sheet3").Copy after:=newEx.Sheets(newEx.Sheets.Count)  Application.Windows("New_Book.xlsx").Visible = True  Application.DisplayAlerts = False  newEx.Save  newEx.Close  Application.DisplayAlerts = True  Set newEx = Nothing End Sub -------------------------------------------------------------

  • EXCEL VBA のブック操作

    完全に自己流でEXCEL2000のVBAを作成しています。 とても単純な操作なのですが、思い通り動きません。 どうかご教授ください。 よろしくお願いします。 Main ファイルとSubファイルがあります。【パス名とファイル名は指定済み】 ブック内のシートの構成は全く同じになっています。 (MainファイルのVBAを実行後Subファイルが作成されます ファイル名は作成日を入れて保存していっています。) それで以前作成したデータを利用するために、 MainファイルのVBAを実行中にSubファイルを開き参照したいシートを Mainファイルにコピーし、Subファイルを閉じたいのですが フォーカスがうまくいかず、Mainファイルが閉じてしまいます。 何がおかしいのでしょうか? Workbooks.Open Filename:=SubFile Sheets("Sheet1").Select Worksheets("Sheet1").Name = "ASheet" Sheets("ASheet").Copy After:=Workbooks(MainFile).Sheets(TotalSheet) Workbooks(SubFile).Activate ActiveWorkbook.Close Workbooks(MainFile).Activate Sheets(TsumSheet).Select オープンしてコピーまではできているのですが・・・

専門家に質問してみよう