• ベストアンサー

Excel VBAでシートのコピー、移動が時々おかしい

Sheets(OldNendo & "_年提案進捗状況表と元データ").Copy after:=Sheets(OldNendo & "_年提案進捗状況表と元データ") としていますが、 Worksheet クラスの Copy メソッドが失敗しました。 というエラーになってしまいます。 Sheets(OldNendo & "_年提案進捗状況表と元データ").Select は実行すると正常に動作するのでシートの指定の仕方がおかしいわけではないとは思うんですが…。 よろしくお願いします。

  • w-inty
  • お礼率72% (1169/1618)

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

  • ベストアンサー
  • R-Fuji
  • ベストアンサー率40% (18/45)
回答No.4

正直、これでできなければ私にはお手上げです。スミマセン。 下の例を説明しますと、Book1.xlsをいうファイルを作成し、第一シートに"test1"、第二シートに"test2"と見出しタブから名前を付け、"test1"にボタンを置き、そのクリックイベントです。 Private Sub CommandButton1_Click() Dim xlBook As Workbook Dim xlSheet1 As Worksheet Dim xlSheet2 As Worksheet 'Book1.xlsは現在使用しているエクセルブック名(フルパスではありません) Set xlBook = Workbooks("Book1.xls") 'コピー元のシート Set xlSheet1 = xlBook.Worksheets("test1") 'コピー先の対象シート Set xlSheet2 = xlBook.Worksheets("test2") 'コピー実行 xlSheet1.Copy after:=xlSheet2 End Sub 私の環境、OS:Win2000 EXCEL2000で動作を確認しました(以前のも)。 コピーができなければ、確認してください。 ・シートの見出し名を間違っていないか(半角スペースなど注意)。 ・ブックに保護(ロック)がかかっていないか。ヘッダーメニューの[ツール]>[保護]から確認。 ・新規ブックを作成して試してみる。 上記のことを試してみてください。あとはちょっと想像がつきません。

w-inty
質問者

お礼

回答ありがとうございます。 私でさえ嫌気がさしてるのに(笑)何度もありがとうございます。 今新規ファイルを作成して、そちらに移行中です。 今のところ無事動いているようです。 少々様子を見ようと思います。 その間は締め切らずにいます。 また何かありましたら質問させていただきますのでよろしくお願いしますm(_ _)m

その他の回答 (3)

  • R-Fuji
  • ベストアンサー率40% (18/45)
回答No.3

すいません補足します。 前もって云いますと、見当が外れてると全く関係がないと思います。 EXCELのシート上でWindowオブジェクト(ボタンなど)を置けることはご存知だと思います。また、EXCELシート自体もオブジェクトだと考えてください。 VBAではオブジェクトを扱う時、表示しているオブジェクトのハンドル(IDみたいなもの)を取得して操作しています。逆に云えばハンドルが取得できなければ操作できないというわけです。 ここで、WindowオブジェクトとEXCELオブジェクトのハンドルが違うことがわかっています。 つまり、VBAのメソッドではActive状態のハンドルだけを取得して操作してますので、ボタンなどにフォーカス(カーソルの位置)が移っている状態だと、EXCELシートの操作ができないということ。さらにEXCEL固有のメソッド(命令文)が使えないということに繋がります。 実例を挙げると、Sort、Protected、Window操作(スクロールの表示非表示)などがボタンにフォーカスが付いたままだとエラーが発生します。 しかし、Sheet("test").Activeしてもボタンからはフォーカスが移りませんので(バグ?)、Cells(1,1).Activeなどすると解決します。 例) Sheets("test").Activate Sheets("test").Cells(1,1).Activate Sheets("test").Copy after:=Sheets("test2") 尤も対象シート上にボタンなどのオブジェクトを設置していない場合については問題にならないのですがね(^_^; 尚、VBの参考サイトですが、EXCEL&WORD操作は、エクセルオブジェクトの宣言を少し変えてやればそのまま使えます。 dim xlsBooks as Workbooks dim xlsSheet as Worksheets で作れるエクセルオブジェクトを使えるようになれば色々試してみることができると思います。 http://www.bcap.co.jp/hanafusa/

w-inty
質問者

お礼

回答ありがとうございます。 #2の回答をよんで「どこかのセルを指定すればOKってことかな?」と思いやってみたんですが、またしてもエラーに…。 今回もこのようにしてみました。 SheetName1 = OldNendo & "_年提案進捗状況表と元データ" Sheets(SheetName1).Activate Sheets(SheetName1).Cells(1, 1).Activate Sheets(SheetName1).Copy after:=Sheets("表紙") しかしこれまたエラーになってしまいました。 ボタンを作成し、それにコードを貼り付けてみたんですが、同じくエラーになってしまいました。。

  • R-Fuji
  • ベストアンサー率40% (18/45)
回答No.2

状況がいまいちわからないのですが、EXCEL VBAはバージョンによって動作仕様が違います。もちろんヘルプにも出ていません、MS的仕様です(苦笑) 経験則では、EXCEL97においてオブジェクトにフォーカスが移っている時Sheetのhandleが取れず、各メソッドが動作不能になることを確認しています。 オブジェクトにフォーカスが移ってるようであれば、Cellsに対してSelect又はActiveしてみては? あと、OSのバージョン、EXCELのバージョンと状況を提示したほうがわかりやすいですよ(^ ^

w-inty
質問者

お礼

回答ありがとうございます。 Excel2000、windows2000です。 >オブジェクトにフォーカスが移ってるようであれば、Cellsに対してSelect又はActiveしてみては? これはどういうことでしょうか?(^^ゞ 申し訳ありませんが、詳しく教えてください。よろしくお願いします。

w-inty
質問者

補足

Sheets(OldNendo & "_年提案進捗状況表と元データ").Copy というようにすると新規ブックにきちんとコピーが生成されるので、コピーもきちんと作動していると思います。 この後の表記をいろんなシート名にしてみたり、before/afterを変更したりしていますが、エラーばかりです。 時々ちゃんと動作したりもすることがあります。 Sheets(1)とかもしてみましたが、ダメでした。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

コピー元のシートがアクティブでない可能性があります。 また、ボタンをマクロ実行のきっかけにしている場合、ボタンのプロパティ『TakeFocusOnClick』をFalseにすれば正常に動作することもあります。 いずれにしても、下記のように、該当シートをアクティブにする命令を追加してみてください。 Sheets(OldNendo & "_年提案進捗状況表と元データ").Activate Sheets(OldNendo & "_年提案進捗状況表と元データ").Copy after:=Sheets(OldNendo & "_年提案進捗状況表と元データ")

w-inty
質問者

お礼

回答ありがとうございます。 Sheets(OldNendo & "_年提案進捗状況表と元データ").Activate Sheets(OldNendo & "_年提案進捗状況表と元データ").Copy after:=Sheets("表紙") としてみましたが同じくエラーが出ました。 (今まで1行目にactivateではないですがselectということでシート選択を入れたりはしてました) 今のところ実行はMicfosoft VBから直接実行しています。

関連するQ&A

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

    初質問です。よろしくお願いします。 マクロを使って、あるブックのシート(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 ・・・以下貼り付け元シートを変えつつ複数回繰り返し これができる様になれば非常にラクになるので、ぜひご教授願います。

  • VBAのSheet.copyとsheet.selectについて

    For i = 1 To 50 Sheets(1).Select Sheets(2).Copy after:=Sheets(2) Sheets(1).Copy after:=Sheets(2) Next のようにして、Excelの2つのSheetを50セットコピーするとします。しかし、最初の何回かは成功するのですが、時々コピーが失敗したというダイアログが出て止まってしまいます。必ず止まるわけではないので原因が分かりません。 また、似たような理由で、 For x = 1 to 100 Sheets(2 + x).Cells(1, 1).Select With ActiveCell.Characters (Start:=9, Length:=2).Font .ColorIndex = 3 Next End With のように回していると、「Rengeクラスのselectメソッドが失敗しました」というエラーダイアログが出てしまうことがあります。成功する時は成功します。 どなたか教えてください。

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

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

  • エクセル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 で設定できましたが、それ以外の方法はないでしょうか?

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

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

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

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • VBA シートのコピー

    シートをコピーし、挿入をシートの末尾にする場合はどうなりますか? マクロを使ってやったときに、20のシートがあったため、下記のようになりますが、これだと、2回目以降にコピーしたとき20番目に挿入されて末尾には移動しないですよね。 そこは、どうしたらいいですか?? シート名「あああ」 Sheets("あああ").Copy After:=Sheets(20) お願いします。

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

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

    エクセルで外部データを参照させるために, 別のブックを開きシートをコピーし元のブックに貼り付け別のブックは閉じるというマクロを作成しました。 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("メニュー")  が動かないことに気が付きました。 何かいい方法があればご教授お願いします。

専門家に質問してみよう