[[20120219125217]] 『新規ブックにシートをコピーしたい(マクロ)』(蘭) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

  『新規ブックにシートをコピーしたい(マクロ)』(蘭)

  作業中の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"
 インデックスが有効範囲にありません

 (蘭)


Workbooks("TSET")は間違っていない?

 本当です・・・(泣)
 綴りが違いました。

 正しく動かすことができました。
 考え方としては
 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.