• ベストアンサー

ExcelのVBAでシートのコピー

Wendy02の回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#1 のBLUEPIXY さんのテスト・コードを、もう一度、詳しくさせてみました。 Sub test() Dim i As Long Debug.Print "Index: Sheets.Name: ObjectName" For i = 1 To Sheets.Count   Debug.Print Sheets(i).Index; " : "; Sheets(i).Name; " : "; Sheets(i).CodeName Next i End Sub ※わざと、Sheet1 と Sheet3 を入れ替えたブック。 ObjectName= CodeName = WorksheetName 挿入前 Index : Sheets.Name : ObjectName 1 : Sheet1 : Sheet3 2 : Sheet2 : Sheet2 3 : Sheet3 : Sheet1 4 : Sheet7 : Sheet7 挿入後 Sheet1-1 を挿入したら、 Index : Sheets.Name : ObjectName 1 : Sheet1 : Sheet3 2 : Sheet1-1 : Sheet4 3 : Sheet2 : Sheet2 4 : Sheet3 : Sheet1 5 : Sheet7 : Sheet7 Indexは、間違いなく、2になります。作った順序ではありません。 当然、シート名は、きちんと並んでいるという条件になりますね。 >シートのインデックスは視覚的に並んでいる順番ではなく 私は、それはみたとおりに並んでいる順序だと思いますね。 シート1 をシート3 の後ろに移動させたら。 Index: Sheets.Name: ObjectName 1 : Sheet1-1 : Sheet4 2 : Sheet2 : Sheet2 3 : Sheet3 : Sheet1 4 : Sheet1 : Sheet3 5 : Sheet7 : Sheet7 この状態で、枝番シートを挿入したら、通常のコードでは、Index は、5 になりますね。 Index: Sheets.Name: CodeName 1 : Sheet1-1 : Sheet4 2 : Sheet2 : Sheet2 3 : Sheet3 : Sheet1 4 : Sheet1 : Sheet3 5 : Sheet1-2 : Sheet4 6 : Sheet7 : Sheet7 だから、結果的に、 >strSheetName="XXX1" >intSheetNo = 1 >Sheets(strSheetName).Copy after:=Sheets(intSheetNo) Sheets(strSheetName) ←→ Sheets(intSheetNo) とは、シート名と、Index とは、同時に扱えないわけです。

INOPII
質問者

補足

お返事遅くなって申し訳ないです。 今日1日コード追ってました。 私の現状認識が甘く質問の仕方が悪かったみたいです。 ちょっと不安ですが結果的には解決しました。 状況 Index:SheetName:ObjectName 1  :xxx1   :Sheet1 2  :check1  :Sheet3 3  :Message  :Sheet7 4  :check2  :Sheet4 5  :work1   :Sheet2 SheetName「xxx1」をコピーして「xxx1-1」とする。 元々「xxx1-1」がある場合は「xxx1-2」とする。以下順に名前の枝番(-n)を増やす。 SheetName「xxx1」はそのまま残す。 コピーする対象シートはシート「work1」に記載してあり、複数ある場合がある。 シート「check1」「check2」「Message」「work1」は順番は決まっていない。 想定結果 Index:SheetName:ObjectName 1  :xxx1   :Sheet1 2  :xxx1-1  :Sheet8 3  :check1  :Sheet3 4  :Message  :Sheet7 5  :check2  :Sheet4 6  :work1   :Sheet2 の予定が 実際の結果 Index:SheetName:ObjectName 1  :xxx1   :Sheet1 2  :xxx1-1  :Sheet3 3  :Message  :Sheet7 4  :xxx1(1)  :Sheet8 5  :check2  :Sheet4 6  :work1   :Sheet2 となり「xxx1(1)」が残り「check1」のシート名が変わってしまっていました。 色々調べてみたら、最初の状態の時にIndexの2~5が非表示(Visible=False)となっており コードが実行されると「Message」シートが表示され他のシートはすべて非表示と なっていました。 で、シートのコピーを実行すると「Message」シートの後ろにコピーされているようでした。 (Visible=Trueが「Message」シートだけなので当たり前なのかな?) ScreenUpdating = False だったので気がつきませんでした。 なので、「Message」シートを表示する時にすべてのシートを表示してから シートのコピー→名前の変更をしたら上手くいきました。 みなさんのコードを見てるともっと良いやり方もありそうですが、時間が無いのでこれで行こうと思っています。

関連するQ&A

  • Excel VBAでのシートのコピーがヴァージョン違いで出来ない?

    Excel VBAでのシートのコピーをしようとしてヘルプを参考に Sheets("master").Copy After:=Sheets("master") のようにマクロを書きました。 これでExcel2000ではちゃんとコピーしたのですが、Excel97ではコピーをしてくれません。 いくつかの端末(OSはWin95、WinNT4、Win2000)でやってみましたがExcel2000はOK、Excel97ではダメでした。 なにか原因があるのでしょうか?

  • 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 -------------------------------------------------------------

  • ACCESS EXCELシートのコピー

    ACCESSでEXCELシートのコピーを教えてください。 ブックに原本というシートがあり、それを先頭にCOPYして シート名を店舗名にしようと思っています。 原本が原本(2)にCOPYはできるのですが、名前の変更が 出来ません。 原本(2)の(2)がまずいのか、”インデックスが有効の範囲にない” でエラーになります。 COPYする時に、直接、名前を指定出来るならその方がありがた いのですが、何か方法はありませんか? EXCELブックOPENして、店舗マスタを読みながらCOPYするようにしています。 xlsobj_.sheets("原本").Copy before:=xlsobj_.sheets("原本") xlsobj_.sheets("原本(2)").NAME = 店舗名 単純に原本と言うシートを10個程度(店舗が10店舗ぐらいあります) COPYしてそれぞれのシート名を店舗名にしたいだけです。 宜しくお願い致します。

  • VBAでsheetのコピー

    初めまして、宜しくお願い致します。環境:WindowsXPSP3EXCEL2010やりたい事Book1に複数の名前の付いたsheetがあります。sheetの数は可変です。このBook1のsheetをVBAから新に作成するBook2のsheet1に纏めたいのですが、Book2のsheet1だけに纏めたいのですが、Book2のsheet1の名前は、固定で構いません。Book1の一番初めのsheetにコピーする時だけ3行目にある見出しだけは、Book2のsheet1に付けたく。それ以外のBook1のsheetは、デターだけをコピーしたいのですが、作成したマクロでは、実行時エラーがでます。【実行時エラー'9'】【インデックスが有効範囲にありません】とでます。次の部分です。「Sheets("mySheetName(i)").Copy Before:=Workbooks("Book1").Sheets("Sheet1")」また、Book2のsheet1の名前は固定で構いません。しかし、マクロの記述の仕方も判りません。どなたかご教授願います。何卒宜しくお願い申し上げます。

  • マクロでエクセルシートのコピー

    マクロでシート1を最後尾に名前をつけてコピーしたいと思ってます。 つけたい名前は、シート2のあるセルにかいてあります。 私は下記のように書いたのですが、エラーになってしまいます。 Worksheets("Sheet2").Select newsheet = Cells(1, 1) Sheets("Sheet1").Select Sheets("Sheet1").Copy After:=Sheets(newsheet) どのようにすればシートをシート名をつけてコピーできますか? 教えてください。 エクセル97です。

  • エクセルVBAでシートコピー

    Sheets("Sheet1")をCopyして、現在の最終のシートの後に持っていき、それを変数wsに設定しようとしています。 Sub TEST01() Sheets("Sheet1").Copy After:=Sheets(Sheets.Count) Set ws = Sheets(Sheets.Count) MsgBox ws.Name End Sub これで通常はうまくいきますが、最終シートが非表示になっているとwsはその非表示のシートが指定され、Sheets("Sheet1")をCopyしたものでなくなってしまいます。 Sheets("Sheet1")をCopyして、現在の最初のシートの前に持っていき、それを変数に設定しようとしています。 Sub TEST02() Sheets("Sheet1").Copy Before:=Sheets(1) Set ws = Sheets(1) MsgBox ws.Name End Sub これで通常はうまくいきますが、最初のシートが非表示になっているとwsはその非表示のシートが指定され、Sheets("Sheet1")をCopyしたものでなくなってしまいます。 Set ws = ActiveSheet で設定できましたが、それ以外の方法はないでしょうか?

  • Excel VBAの不可解(?)な動作について

    Excel 2000 VBAでの質問です。 Sheet1に以下のようなコードを書きました。 --------------------------------------------------------- Public Sub test() Application.DisplayAlerts = False Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "test" Sheets("test").Visible = xlVeryHidden Sheets("Sheet3").Visible = xlVeryHidden Sheets("test").Visible = True Sheets("test").Delete Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "test" '問題の行 Application.DisplayAlerts = True End Sub --------------------------------------------------------- このコードで期待している動作は、最終的にSheet3(xlVeryHiddenになっている)の後ろにSheet2をコピーし、その名前を「test」にするというものです。 しかし、実際にはSheet3の後ろにSheet2がコピーされるものの、名前はSheet2が「test」と変更されてしまいます。 Sheets.Countの値はSheet3をさしているはずなのですが・・・。 皆様に教えていただきたいのは、 ・この意図しない動作がなぜ起こるか ・どうすればこの問題を回避できるか です。よろしくお願いいたします。 もし初歩ミスでしたら、申し訳ありません・・・。ご指摘ください。

  • Excel VBA

    今、Excel2000で作成したEXcelブックをExcel2007でも正常に動作するか確認しています。 伝票のようなもので、枠内に数字を記入後、保存する際に別のブックにセルの全コピーしてから保存するようになっているのですが、Excel2007で実行すると列幅と行幅がコピーされません。 Set NewBook = Workbooks.Add Workbooks(ThisWorkbook.Name).Sheets("伝票").Cells.Copy NewBook.Sheets("Sheet1").Activate ActiveSheet.Paste Excel2003で動かしたときは、大丈夫でした。 原因がわかりません。コピーの仕方がいけないのでしょうか。

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

    シートのコピーを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

  • EXCEL VBA(作業グループの解除)

    EXCEL VBAについての質問です。 複数のシートをコピーして別ブックに保存した後、元のブックが作業グループになってしまいます。 これを解除するコードを伝授いただけませんでしょうか? Sheets(Array("1", "2", "3")).Select Sheets(Array("1", "2", "3")).Copy