[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『新規ブックにシートをコピーしたい(マクロ)』(蘭)
作業中のTESTという名前のブックにある、 dataというシートとmeisaiというシートを 新規ブックを追加した際にコピーしたいのですが 下のようなコードを作成するとエラーになります。 どのように修正すれば良いのでしょうか 教えていただけますか?
新規ブックは、名前をつけて保存しないので(作業者が個別に行う) newbkという定義?をつけています。 2つのブックをまとめてコピーするやり方が本にのっていないので 下のように同じような動作を2回繰り返して 2枚のシートをコピーするようにしています。 エラーになるのは●マークのところからです。
Sub new_add()
Dim NewBk As Workbook Set NewBk = Workbooks.Add
●Workbooks("TSET").Worksheets("data").Copy after:=Workbooks(NewBk).Worksheets("sheet1") Workbooks("TSET").Worksheets("meisai").Copy after:=Workbooks(NewBk).Worksheets("data")
End Sub
エラーメッセージは 実行時エラー 13 型が一致しません。 ですね?
たとえば、最初の2行を Dim NewBk As String NewBk = Workbooks.Add.Name に変更すると 動くと思います。
或いは、後ろ2行を Workbooks("TSET").Worksheets("data").Copy after:=NewBk.Worksheets("sheet1") の様に修正します。 ~~~~~
それぞれの変数の違いを確認してみて下さい。
(HANA)
>HANAさん
回答ありがとうございます。 丁寧でわかりやすいです。
エラーメッセージは 実行時エラー 13 型が一致しません。でした
変数の宣言の違いだったのでしょうか 教えて頂いたように2パターンのコードに修正してみましたが どちらもエラーになってしまいます。
どこが間違っているのか いま勉強中なので、考え方も教えて頂けると助かります。
Sub new_add()
Dim NewBk As String NewBk = Workbooks.Add.Name
Workbooks("TSET").Worksheets("data").Copy after:=Workbooks(NewBk).Worksheets("sheet1") Workbooks("TSET").Worksheets("meisai").Copy after:=Workbooks(NewBk).Worksheets("data")
End Sub
Sub new_add()
Dim NewBk As Workbook Set NewBk = Workbooks.Add
Workbooks("TSET").Worksheets("data").Copy after:=NewBk.Worksheets("sheet1") Workbooks("TSET").Worksheets("meisai").Copy after:=NewBk.Worksheets("data")
End Sub
どちらのコードの場合も、エラーになってしまいます。 実行時エラー"9" インデックスが有効範囲にありません
(蘭)
本当です・・・(泣) 綴りが違いました。
正しく動かすことができました。 考え方としては NewbkをString型で定義して 追加する新規ブックの名前をNewbkとするということですね。
Dim NewBk As String NewBk = Workbooks.Add.Name
私が最初に書いていたコードの場合は どういう意味のコードになっているのでしょうか。 本に書いてあるコードを繋ぎながら作っているのですが このコードは全く使えない?ものですか? それとも、何か違う場合に使うようなコードなのでしょうか ↓
Dim NewBk As Workbook Set NewBk = Workbooks.Add
(蘭)
あらら、投稿前に衝突しちゃいました。。。 既に解決している部分も有りますが 合わせて投稿しておきます。
>変数の宣言の違いだったのでしょうか 違います。 「変数に何を入れたのか。」の違いです。
Set NewBk = Workbooks.Add これは、追加したブック自体が NewBk = Workbooks.Add.Name これは、追加したブックのブック名のみが 変数に入っています。
新規ブック名が Book1 だった場合 Set NewBk = Workbooks.Add とした場合、NewBk は Workbooks("Book1") と同じだとイメージして下さい。 ブック名が知りたい場合は Workbooks("Book1").Name とする様に NewBk.Name で取得出来ますし、Sheet1を表す場合も Workbooks("Book1").Worksheets("Sheet1") とする様に NewBk.Worksheets("Sheet1") と書きます。
もしも Workbooks(Workbooks("Book1")).Worksheets("sheet1") となっていたら、Workbooksが重複していて変な感じじゃないですか? Workbooks(NewBk).Worksheets("sheet1") は、その様に書いてある事に成ります。
Workbooks(NewBk).Worksheets("sheet1") ~~~~~ここに何を指定しないといけないか の意識が必要だと思います。
>このコードは全く使えない?ものですか? >それとも、何か違う場合に使うようなコードなのでしょうか 使えますよ? 「インデックスが〜」のエラーが出たコードも どちらも ブック名を正しく書けば動きますよね? 以下、解決済みの内容も含まれていますが。。。
>インデックスが有効範囲にありません これは、指定したブックやシートが無い場合に表示されます。
デバッグボタンを押したときに、どの行がハイライトされて止まりますか?
NewBkが無い と言う事は考え難いので TSETと言うブックが無い(開いてない)。 TSETと言うブックにdataと言うシートが無い。 あたりでしょうか。
「TSETちゃんと開いてるよ」って場合は、エクセルの上の部分にブック名が表示されていますが もう一度確認してください。 もしも TSET.xls と成っていたら、コード内でもその様に指定しておく必要が有ります。
表示されるエラーメッセージは 少し分かりにくいですが 同じ意味をもつ時は同じメッセージが表示されますので どういう意味が有るのか 分かる様に成ると良いと思います。
(HANA)
衝突しましたがそのまま出します。
蘭さん、こんにちは。佳です。
> 綴りが違いました。 シート名の書いてあるところからコピーして、コードに貼り付けるようにしたら 綴り間違いは起きませんよ (*^ー゜)b
> 本に書いてあるコードを繋ぎながら作っているのですが 理解できないコードは使わないこと。 日本語だって、理解できてない単語や文法では、まともにしゃべれないでしょう。 VBAも言語です。理解できないけどしゃべれるなんてことはありません。
その本に、コードの意味がちゃんと分かるように書いてないなら その本はたぶん、ダメダメな本です。 またはもしかしたら、あなたにはまだ早い本。 いったん他の本に切り替えた方がいいです。
で、そのコードをどんな場合に使うかですが addしたブック、そのブックそのものを変数に入れるときです。
分からないなら無理に使う必要はないですよ。 使わなければ、ちゃんと勉強していれば、 そのうちいずれ、そういう用途に合うものが欲しくて欲しくてたまらなくなります。 そうなったら「理解」はもう自分の中にあるわけですから、こっちのものです。 自分が熟するのを待つのも勉強のうち、とわたしは思います。 個人的な考えですけど。
>HANAさん
わかりやすい説明ありがとうございました。 「変数に何を入れたのか。」の違いという理解ができたので いろいろとコードを使用してみて試してみますね♪
>佳さん
文章を読ませていただいて、「私にはまだ早い本」に該当するように思いました。 もう少し説明がかいてある本を探してみようと思います。 仕事でエクセルを使うことが多く、社内でエクセルにたけている方がいないので 私に要望が集まり、試行錯誤でやっています。 自分にはレベルが高い要望も多く、少しずつ挑戦している次第です。 理解できないものをコードだけうつして作成しても、後で困りますよね。 少しずつお勉強しながらやってみます。
お二方とも、ご親切にありがとうございました。
(蘭)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.