アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは
「たった一秒で仕事が片づくエクセル自動化の教科書6章」p219で
全社員の勤怠表の残業時間を「残業時間管理一覧表」に転記するというものですが、
ある方法ではworkbooksOPEN時、社員の勤務表を開き「残業時間管理一覧表」に転記することができませんでした。

tanakakintai.xlsを開き、D1の内容を「残業時間管理一覧」シートCells(6, 1)にコピーする。

①Workbooks.Open ("tanakakintai.xls")
Worksheets("残業時間管理一覧").Cells(6, 1) = Range("D1")
「インデックスが有効ではありません」とエラーとなる。
開いたファイルtanakakintai.xlsがアクティブとなりそのブックには残業時間一覧シートがない為にエラーとなるため?

同様にwith end(with)を使うとエラーにならずうまく転記することができます。
②With worksheets("残業時間管理一覧")
   .Cells(6 1) = Range("D1")
end with
②では、エラーにならずに転記することができるのでしょうか?
 これもWorksheets("残業時間管理一覧").Cells(6, 1) = Range("D1")と同じ意味になる
 ようにおもえるのですが・・

②ではうまく転記(コピー)することができるのでしょうか?
宜しくお願いいたします。

補足
①がうまくいかなかったので、
Workbooks.Open ("tanakakintai.xls")
Workbooks("勤怠管理表集約ファイル.xls").Worksheets("残業時間管理一覧").Cells(6, 1) = Range("D1")  勤怠管理表集約ファイル.xlsをつけたらうまくいきました。

質問者からの補足コメント

  • HAPPY

    siffon9様

    草々のご回答ありがとうございます。
    ご指摘いただいたとおり、「②の例でWorkbooks.Open ("tanakakintai.xls")はWith構文の中にある前提で回答させていただきます。」でした。 ありがとうございます。
    ご質問についてご回答ありがとうございます。
    1)あくまでもWITH構文において内部的につくとういうことでしょうか?
    2)workbooks("勤怠管理表集約ファイル.xls").Worksheets("残業時間管理一覧")が内部的に保持されて、Wth構文内の.Cellsなどドットで始まるものに暗黙的に付加されるようになります
    ということをデバック?などで確認する方法はございますでしょうか?または、参考となるところがあればおしえてくださいませ。 よろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/06/25 06:26
  • どう思う?

    siffon9様
    with構文ではオブジェクトに格納されるみたいなことかかれておりましたので
    そこに格納され、WITH構文のなかではオブジェクトとして扱うためファイル名が補完されるのでしょうか? (よくわかりませんが・・) いま、オブジェクトの中をみたらPATHとファイル名が記載
    されていたのでそれを参照しているのかなぁーと。そう思いたいです。 ???

      補足日時:2018/06/25 06:59

A 回答 (2件)

No.1です。



> 1)あくまでもWITH構文において内部的につくとういうことでしょうか?

 そうです。このあたりはVBAの入門書や入門サイトのWith構文の説明をご覧ください。


> 2)workbooks("勤怠管理表集約ファイル.xls").Worksheets("残業時間管理一覧")が内部的に保持されて、
> Wth構文内の.Cellsなどドットで始まるものに暗黙的に付加されるようになります
> ということをデバック?などで確認する方法はございますでしょうか?
> または、参考となるところがあればおしえてくださいませ。

 ②の例でいうと以下で確認できます。
With workbooks("勤怠管理表集約ファイル.xls").worksheets("残業時間管理一覧")
   MsgBox .Name ' シート名の表示
   MsgBox .Parent.Name ' シートが所属しているブック名の表示
end with
    • good
    • 0
この回答へのお礼

ありがとうござました。
ご連絡遅れてもうしわけございませでした。
教えていただいた通り、MSGBOXをつかってやってみます。
いろいろとありがとうございました。

お礼日時:2018/06/28 05:54

複数のブックやシート上のセルを扱う場合注意すべき点は、操作対象のセルが、どのブックの、どのシート上にあるセルか意識して指定しなければいけないということです。

指定がない場合は現在アクティブなブックやシートが指定されたことになります。

②の例でWorkbooks.Open ("tanakakintai.xls")はWith構文の中にある前提で回答させていただきます。


①が上手くいかなかった理由は書かれているとおりですね
> 開いたファイルtanakakintai.xlsがアクティブとなり
> そのブックには残業時間一覧シートがない為にエラーとなるため?


②の場合
With worksheets("残業時間管理一覧")
   Workbooks.Open ("tanakakintai.xls")
   .Cells(6 1) = Range("D1")
end with

一行目で現在アクティブな
 Workbooks("勤怠管理表集約ファイル.xls").Worksheets("残業時間管理一覧")
が内部的に保持されて、Wth構文内の.Cellsなどドットで始まるものに暗黙的に付加されるようになります
さらに、二行目のWorkbooks.Openでtanakakintai.xlsがアクティブになります。

これにより
.Cells(6 1)は、Workbooks("勤怠管理表集約ファイル.xls").Worksheets("残業時間管理一覧")上のセル
Range("D1")は、tanakakintai.xls上のセル
が指定されたことになって、上手く転記されることになります。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!