- ベストアンサー
ブック間のシート移動エラーの原因と対策方法
- EXCEL VBA初心者がブック間でシートを移動しようとする際にエラーが発生する原因と対策方法について教えてください。
- ブックAとブックBの間でシートを移動するVBAコードを実行するとエラーが出る場合、エラーが発生する原因はブック名が毎回変わるためにシートの移動先を特定できないことです。対策方法としては、ブック名ではなくシートの取得方法を変更し、シートを識別する別の特徴を利用することです。
- ブックAのシートAをブックBの一番左側に移動させようとするVBAコードでエラーが発生する場合、エラーの原因はブックBが開かれていないためにシートの移動先が正しく識別できないことです。対策方法としては、ブックBが開かれていることを確認してからシートを移動することです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>元々の質問のエラー原因 元のご質問のマクロでブックを指定していないのは確かにエラーの遠因ですが,ブック名が不定(しかしシート名は固定)という前提条件では,若干致し方ない部分ではあります。 エラーの直接の原因は,元のご質問マクロで「Worksheets("シートA").Move (後略)」と書いてますが,こう書くとマクロは「マクロを実行した時点でアクティブな(現在選択されている)ブック」に「シートA」を探しに行きます。しかしマクロを実行した時点でブックBなどが選択されていると,シートAはブックBには無いので,ありません(エラー9)となります。 裏を返すとメールの添付エクセルを(=シートAを)選択しておいた(アクティブな)状態で,必ずマクロを実行するように運用でカバーすれば,エラーは回避できたという言い方も出来ます。 こういった失敗は慣れた人でもしばしばうっかりやらかしてしまいますが,必ず ○シートを操作するなら →どのブックのどのシートを? ○セルを操作するなら →どのシートのセルを? というのを意識して,「そうでない場合」があるのか無いのか,あるならどう手当てしたら良いのか,状況を"想定"しながらマクロを作成するよう心がけます。
その他の回答 (3)
- keithin
- ベストアンサー率66% (5278/7941)
>教えていただいたコードを実行しました アタマ使わないで回答をただコピーして実行したのでは,ダメかもしれませんね。 マクロを登録しているブックの名前とか,あなたのおっしゃってる持ってきたいシートの正しい名前とか,ちゃんと実際のそれと間違いなく合ってるか,再度よくよく確認してください。 また。 しばしば,ご自分が実際に使っているシートの名前すら正しく確認できずに「出来ない」ご相談も多いので,次のマクロを使ってメールに添付されたブックの正しいシート名をエクセルに取り出させて,それをコピーしてマクロにキチンと書き込んでください。 #いわずもがなですが,目的のメール添付のエクセルを開いて実行します sub test() dim w as workbook dim s as worksheet dim i worksheets.add before:=worksheets(1) for each w in workbooks for each s in w.worksheets i = i + 1 cells(i, "A") = w.name cells(i, "B") = """" & s.name &"""" next next end sub
お礼
ありがとうございます。 教えていただいたコードを実行し取り出した名前を確認したところ 半角スペースが一箇所抜けておりました。 正しい名前に変更し実行すると正しく動作しました。 よく確認することの重要性がわかりました。 ところで元々の質問のエラー原因は何だったのでしょうか。 シート名の間違いではなかったようです。 やはりブック名の指定でしょうか。
- imogasi
- ベストアンサー率27% (4737/17069)
マクロの記録を採ると(質問者はマクロの記録を採って勉強してみましたか?) (BooK1で"01化B.xls”を開き、マクロの記録を始め、01化.xlsを開いて、01化B.xlsのSheet1を01化.xlsのシートタブの末尾に移動した例。 Sub Macro4() Workbooks.Open Filename:="C:\Documents and Settings\XXX\My Documents\01化.xls" _ , UpdateLinks:=3 Windows("01化B.xls").Activate Sheets("Sheet1").Select Sheets("Sheet1").Move After:=Workbooks("01化.xls").Sheets(8) Windows("01化B.xls").Activate End Sub こういうのと、自分のコードを比べて勉強し、それからわからない点は質問してください。 というか、出てきたコードそのものを使えば良いのでは。
補足
ありがとうございます。 マクロの記録はとっておりません。 ブック間のシートの移動をマクロの記録でとることはできるのでしょうか。 すみません。ブックAはWEBメールの添付ファイルを開いた状態なんです。 あ、今ふと思いましたが、シートAのブック名を指定しないと(またはそれに代わるもの) が必要なんですかね。 ブックBにマクロコードを置くのであればNO.1の方の回答がそれをあらわしているのだと思いました。
- keithin
- ベストアンサー率66% (5278/7941)
>エラーの原因と対策方法を教えて下さい。 それを聞きたいなら最低限,いったい全体どんな内容のエラーが出たのかという状況の説明が必要ですね。 とはいえとりあえず,次のようにしてみましょう。 ○シートAを探して見つけたら移動する sub macro1() dim w as workbook for each w in workbooks if w.name <> "ブックB.xls" and w.worksheets(1).name = "シートA" then w.worksheets(1).move before:=workbooks("ブックB.xls").worksheets(1) exit sub end if next msgbox "not found" end sub
お礼
ありがとうございます。 エラー内容は 実行時エラー 9 インデックスが有効範囲にありません。 と出てデバッグボタンを押すと2行目3行目がすべて黄色に変わります。 以上ですがわかるでしょうか。 シートAのあるブックAがWEBメールの添付ファイルを開いたものだからでしょうか。 教えていただいたコードを実行しましたが、not foundが立ち上がります。
お礼
ありがとうございます。 とてもわかりやすい解説ありがとうございます。 たしかに仰る通りメール添付ブックをアクィテブにするとエラーが出ず動作しました。 ブック名が不明なのにブック名の指定をしなければならない事は先のご回答で かすかに感じておりました。 ブックAの名前が固定でないからこそNO.1のご回答にある if w.name <> "ブックB.xls" and w.worksheets(1).name = "シートA" が必要となるような気がします。 この構文の意味するところは今後の課題といたします。 また注意事項にも留意していきたいと思います。 本当にありがとうございました。