• ベストアンサー

ExcelのVBAでシートのコピー

Excel2000 Win2000 複数(最低5)のシートが存在するExcelのBookでExcelのVBAを使用して strSheetName="XXX1" intSheetNo = 1 Sheets(strSheetName).Copy after:=Sheets(intSheetNo) とシートのコピーをしています。 この時コピーされたシートのインデックスが2にならないんですが、何故なんでしょ? やりたい事はコピーしたシートの名前をExcelが勝手につけた名前から変更したいんです。 コピーされたシートのインデックスが2になると思っていたので上手く行きません。 Sheets(intSheetNo + 1).Name = "XXX1-1"

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

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

INOPIIさん、StudyVBAさんへ もう、INOPIIさんも、StudyVBAさんは、お分かりにはなっているはずですが、一応、念のために、レスをつけておきます。 >質問者のコードが引用されていますので、そこだけ読むと質問者のコードではダメ >ですよ、 >というふうに取れ、No.4の回答と矛盾するようにかんじるのですが、 私は、INOPIIさんの着目している点は、私が以前指摘されたこともあって、直感的に分かりました。INOPIIさんの状況も正しければ、他の方が、Index が 2 になることも正しいと思いましたが、他の方のご指摘になっているものと、INOPIIさんの条件が違うということですね。 これは、最初の #1 のBLUEPIXY さんの回答をずっと追いかけていたのです。 # SheetsのIndex は、Index でしかありません。示されたコードで、何の問題もありません。 ただし、そのシート名とIndex は、つながらないっていう話を#4 で書いて、#6 で実証しようとしたのです。 StudyVBAさんもお分かりになっているとおりなんです。 >シート名が「Sheet1」だからといってインデックスも「1」とは限りませんよ >と受け取りました。 今回、私自身も新たな発見をしました。 >シートのコピーを実行すると「Message」シートの後ろにコピーされているようでした。(Visible=Trueが「Message」シートだけなので当たり前なのかな?) 私は、考えても見ませんでした。非表示は、まず、一番最後にまわすのと、最終段階のブックでつけるので、そういうことはやったことがないのです。たぶん、私も新たにコードは考えられるかもしれませんが、もう、分かっていらっしゃるようですね。 つたない私の説明で、お分かりになりにくかったかもしれませんね。

INOPII
質問者

補足

まだ、何故そうなってるのか分かっていないので、 これから調べる所です。 ただ、ここはもう閉じようと思います。 非表示にしたのは、多分(PGさんが作ったのを連休を使ってテストしていたので・・・)シートが色々切り替わって目障りなのでそうしたんだと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (9)

  • StudyVBA
  • ベストアンサー率0% (0/3)
回答No.10

おはようございます。 Wendy02さん、わざわざの回答ありがとうございます。 当方の読解力不足でご迷惑をお掛けしました。 これからも惚けた質問をすると思いますが 今回同様、宜しくお願いいたします。 それにしても本来のINOPIIさんの質問ですが、 シートが非表示になってるとは思いもよりませんでした。 色々勉強になることばかりです。

INOPII
質問者

補足

私は構わないと思います。 もし、後で見る事があった時に疑問があっても、もう聞けないですから。 言葉だけでやってるので、伝わらない所がでるのはしょうがないですし。 画像がUPできると楽になる部分も多いんですけどね。 まぁ、他の人は分からないんで、難しいですが(笑)

全文を見る
すると、全ての回答が全文表示されます。
  • StudyVBA
  • ベストアンサー率0% (0/3)
回答No.8

INOPIIさん、こんばんは。 補足読みました。 そうですよね。 それから、質問者の了解を取らずに便乗質問したことお許しください。 先ず、断りを入れてから質問するべきでした。 以後気をつけます。 Wendy02さん、アホウな質問、すみませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • StudyVBA
  • ベストアンサー率0% (0/3)
回答No.7

こんばんは。 Wendy02さん、またまた疑問符ありです。ご教授ください。 No.4 の回答で >示されたコードで、何の問題もありません。 と書いておられるのに No.6 の回答では >だから、結果的に、 >strSheetName="XXX1" >intSheetNo = 1 >Sheets(strSheetName).Copy after:=Sheets(intSheetNo) >Sheets(strSheetName) ←→ Sheets(intSheetNo) とは、シート名と、Index とは、同時に扱えないわけです。 と書いておられますが、質問者のコードが引用されていますので、そこだけ読むと質問者のコードではダメですよ、 というふうに取れ、No.4の回答と矛盾するようにかんじるのですが、 No.6で仰りたいのは、シート名とシートのindexは必ずしも同じではないということだけですよね。 宜しくお願いいたします。

INOPII
質問者

補足

えぇ~と、私はそこの所は シート名が「Sheet1」だからといってインデックスも「1」とは限りませんよ と受け取りました。

全文を見る
すると、全ての回答が全文表示されます。
  • 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」シートを表示する時にすべてのシートを表示してから シートのコピー→名前の変更をしたら上手くいきました。 みなさんのコードを見てるともっと良いやり方もありそうですが、時間が無いのでこれで行こうと思っています。

全文を見る
すると、全ての回答が全文表示されます。
  • kikaida-
  • ベストアンサー率69% (37/53)
回答No.5

>この時コピーされたシートのインデックスが2にならないんですが、何故なんでしょ? そらそうでしょう。すでに何枚かシートがあるんですよね。 シートのインデックスは視覚的に並んでいる順番ではなく、作成された順番です。 従って下記のようにすればよいかと思います。 Sheets(Sheets.Count).Name = "XXX"

INOPII
質問者

補足

Excelシートは インデックス:見た目の順番 オブジェクト名:作成された順番 と理解しております。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

>コピーされたシートのインデックスが2になると思っていたので上手く行きません。 私も、以前混同していたことがあります。SheetsのIndex は、Index でしかありません。示されたコードで、何の問題もありません。 しかし、それは、あくまでも VBProjects 上のObject名とIndex の相関性があるだけであって、シートのプロパティ名とは直接関係がありません。 お出しになったコードを元に、試しに、以下のようなコードを書いてみました。 Sub SheetCopyW()  Dim num As Variant  Dim MaxNum As Integer  Dim i As Long  Const strSheetName As String = "Sheet1"  On Error GoTo ErrHandler  For i = 1 To Sheets.Count   With Sheets(i)    If .Name Like strSheetName & "-*" Then     num = Mid(.Name, InStr(.Name, "-") + 1)     If Val(num) > MaxNum Then      MaxNum = Val(num)     End If    End If   End With  Next  If MaxNum > 0 Then   Sheets(strSheetName).Copy After:=Sheets(strSheetName & "-" & CStr(MaxNum))   Else   Sheets(strSheetName).Copy After:=Sheets(strSheetName)  End If  ActiveSheet.Name = strSheetName & "-" & CStr(MaxNum + 1)  On Error GoTo 0  Exit Sub ErrHandler:  MsgBox "Error " & Err.Number & " (" & Err.Description & ") " End Sub

INOPII
質問者

補足

コードありがとうございます。 テストしてみたんですが、Sheet1が非表示の時に 1回目は上手くいくんですが、2回目から上手く行きませんでした。 なぜ上手く行かないのかも良くわかりませんでした。 結果と詳しい事はNo6さんの補足に乗せさせてもらいました。

全文を見る
すると、全ての回答が全文表示されます。
  • quit123
  • ベストアンサー率21% (4/19)
回答No.3

>この時コピーされたシートのインデックスが2にならないんですが で、どうなるんですか? それを書かないと、No.1さんも回答されてるとおり 提示されたコードであれば上手く行くはずですから この質問を読んだ人にとってはどんな状況なのか 見当もつきませんよね。

全文を見る
すると、全ての回答が全文表示されます。
  • yos40
  • ベストアンサー率0% (0/1)
回答No.2

Set ns = Worksheets.Add ns.Name = ws_edt.Range("comment1") で、どうでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ExcelXP(2002) WinXPPro では、質問文のコードでうまく実行できました。 シートNo1のシートの後に挿入はされているんですよね。 コピーされたシートのインデックスはいくつになっているんでしょうか? イミディエイトウィンドウで for i=1 to sheets.Count : ? i;":";sheets(i).name : next とかやってみたらどうなりますか?

INOPII
質問者

補足

なぜだかよく分かっていないんですが、 上手く行くBookと行かないBookがあるんです。 なので、割りつくIndex番号もばらばらです。 詳しくはNo.6さんの補足に書かせていただきました。

全文を見る
すると、全ての回答が全文表示されます。

関連する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

このQ&Aのポイント
  • 理系学部卒の就職活動では、「大学で頑張ったこと」と「大学以外の学生生活で頑張ったこと」のどちらが重要かについて質問しています。
  • 前期の席次が平均より上であり、恐らく後期もそれぐらいになる見込みであるため、面接で「大学の勉強を頑張りました」と言っても中途半端な印象を与えるのではないかと悩んでいます。
  • 大学の勉強以外にも資格の勉強をし、学外のサークルにも参加しています。就職先は東京都のIT企業を考えています。皆様のご意見をお聞きしたいと述べています。
回答を見る

専門家に質問してみよう