[[20210919103745]] 『マクロ ブックの指定方法がおかしい?』(おさる) ページの最後に飛ぶ

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

 

『マクロ ブックの指定方法がおかしい?』(おさる)

マクロ初心者です。
ネットで調べながら作成していますが、ブック名の指定方法がおかしいのか最初の段階からつまずいています。
すみませんが、ご教授頂けますと幸いです。

今開いているのがマクロを動かすファイル(名称はtest.xlsm)です。
sheet1のA1セルには開きたいファイルのパスを書いています。
そのパスに書かれたファイルを開いて色々作業をしたいのですが、うまくいきません。

変数pathに格納したファイルが開く所までは出来たのですが、
Workbooks(path).Sheets("sheet1").Range("B:B,C:C,D:D,F:F").Copy
の部分でインデックスが有効範囲にありません…とエラーが出てしまいます。
アクティブになっていない?とか色々考えたのですが、分かりません。
更に、コピーをしたら、test.xlsmのsheet2に値を貼り付けたいのですが、
その場合もブックを再指定し直すのかも併せて、教えて頂けると助かります。

宜しくお願いいたします。

Sub test()

    Dim path As String

path = Worksheets("sheet1").Cells(1, 1)

Workbooks.Open path

Workbooks(path).Sheets("sheet1").Range("B:B,C:C,D:D,F:F").Copy
Workbooks("text.xlsm").Sheets("sheet2").Cells(1, 1).PasteSpecial Paste:=xlPasteValues

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


(1)path にはフォルダ情報も入っているんですかね。
それなら、Workbooks(path)がNGです。
フォルダ情報を除いたファイル名だけにする必要があります。
(2)カレントフォルダなので、pathはファイル名だけです、ということならそこではなく、
シート指定が問題なのでしょう。
実際に存在していないシート名を指定しているのでは?

(γ) 2021/09/19(日) 11:03


    Dim wb As Workbook
    Set wb = Workbooks.Open(Path)
    wb.Sheets("sheet1").Range("B:B,C:C,D:D,F:F").Copy
 といった書き方をすることが多いですね。
(γ) 2021/09/19(日) 11:06

γさん

分かりやすいご説明、大変ありがとうございます。
フォルダ情報も入っていたので、教えて頂いたコードで出来ました。

すみません、もう一点だけ教えて下さい。
このコードを入れる場所を教えて頂きたいのと、仮に貼り付け先がさらに別のファイルだった際の指定方法は、
下記のような書き方でいいのか教えて下さい。一応動きましたが、一般的な書き方なのかが知りたいです。

Sub test()

    Dim path As String
    Dim wb1 As String
    Dim wb2 As String

path1 = Worksheets("sheet1").Cells(1, 1)
path2 = Worksheets("sheet1").Cells(2, 1)

Workbooks.Open path1
Set wb1 = Workbooks.Open(path1)
Workbooks.Open path2
Set wb2 = Workbooks.Open(path2)

wb1.Sheets("sheet1").Range("B:B,C:C,D:D,F:F").Copy
wb2.Sheets("sheet2").Cells(1, 1).PasteSpecial Paste:=xlPasteValues
End Sub

(おさる) 2021/09/19(日) 11:27


wb1とwb2の型が違いますよ。

(γ) 2021/09/19(日) 11:55


γ様
失礼しました。Workbookでしたね。

Sub test()

    Dim path As String
    Dim wb1 As Workbook
    Dim wb2 As Workbook
path1 = Worksheets("sheet1").Cells(1, 1)
path2 = Worksheets("sheet1").Cells(2, 1)
Workbooks.Open path1
Set wb1 = Workbooks.Open(path1)
Workbooks.Open path2
Set wb2 = Workbooks.Open(path2)
wb1.Sheets("sheet1").Range("B:B,C:C,D:D,F:F").Copy
wb2.Sheets("sheet2").Cells(1, 1).PasteSpecial Paste:=xlPasteValues
End Sub
(おさる) 2021/09/19(日) 12:02

どうして同じブックを二度開くのですか?
Workbooks.Open path1
Set wb1 = Workbooks.Open(path1)
は後者だけでいい。
(γ) 2021/09/19(日) 12:46

γ様
例えば、path1, path2の2ファイル(別々)を開く場合も同様に繰り返せばよいのか知りたかったのです。
言葉足らずで申し訳ありませんでした。
(おさる) 2021/09/19(日) 12:59

 二つのブックを開くのでも、
 Workbooks.Open path1
 Set wb1 = Workbooks.Open(path1)
 Workbooks.Open path2
 Set wb2 = Workbooks.Open(path2)
 は重複しているという指摘をしています。

 Set wb1 = Workbooks.Open(path1)
 Set wb2 = Workbooks.Open(path2)
 だけでいいんですよ。

 Workbooks.Open path1
 Set wb1 = Workbooks.Open(path1)
 という二つは完全に重複しています。

 Set wb1 = Workbooks.Open(path1)
 と書くことによって、開いたブックを
 ブックの名前を指定しなくても
 変数で指定できます、というのがキモであり、
 私の指摘の眼目です。
(γ) 2021/09/19(日) 13:11

まあ実際に動かしてみればわかりますよ。
同じ名前のブックを開こうとすることへの警告がでるはずです。
頭で考えることも大事ですし、手を動かして確認することも大切ですよ。

(γ) 2021/09/19(日) 13:15


γ様
色々ありがとうございました。
勘違いしておりました。
今回教えて頂いたこと、とても今後の勉強の参考になりました。
お忙しい所、本当にありがとうございました。
(おさる) 2021/09/19(日) 13:18

書いている間にかぶっちゃいましたし、話が終わってしまったようですが、せっかくなので投稿しておきます。
 -------------------------------------------------
横からですが何点か。

■1
↓だとそれぞれ、同じファイルを2回開いちゃいます

 Workbooks.Open path1
 Set wb1 = Workbooks.Open(path1)

 Workbooks.Open path2
 Set wb2 = Workbooks.Open(path2)

■2
>貼り付け先がさらに別のファイルだった
つまり、全部で以下の3ブックが登場するということであっているのですか?

 ・マクロを記述するブック
 ・コピー元のシート(セル)があるブック
 ・貼付先のシート(セル)があるブック

■3
自分で組んだコードの検証はもちろんのこと、ネットで見つけたコードや質問掲示板で提示されたコードを研究するには【ステップ実行】という方法を使うと、コードを1行ずつ実行でき大変便利です。
聞いたことがない言葉であれば↓を読んでみてください。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

また、以下も知っておいて損は無いと思います。

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

また、実行上の問題は生じませんが【インデント(字下げ)】を使うとコードの構造が把握しやすくなり、ご自身のデバッグ作業に貢献するとおもいますので、こだわりがなければインデントを付けるようにされるとよいでしょう。
https://kabu-macro.com/detail.php?dir=word&dir2=sa-so&uri=zisage
http://club-vba.tokyo/vba-indent/

■4
提示されたコードだとおかしなところがあります。

 Dim path As String
 path1 = Worksheets("sheet1").Cells(1, 1)
 path2 = Worksheets("sheet1").Cells(2, 1)

↑の部分をよく見てみましょう。
【path】と【path1】ないし【path2】はそれぞれ別物です。

こういったつまらないミスは、変数の宣言を強制しておくと防ぐことができます。

 【変数の宣言】
http://officetanaka.net/excel/vba/beginner/06.htm

■5
ということを踏まえると、↓のように整理することも可能だとおもいます、

    Option Explicit
    Sub さんぷる()
        Dim wb1 As Workbook
        Dim wb2 As Workbook

        Stop 'ブレークポイントの代わり

        With ThisWorkbook.Worksheets("sheet1")
            Set wb1 = Workbooks.Open(.Range("A1").Value)
            Set wb2 = Workbooks.Open(.Range("A2").Value)
        End With

        wb1.Sheets("sheet1").Range("B:D,F:F").Copy
        wb2.Sheets("sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues
    End Sub

(もこな2 ) 2021/09/19(日) 13:22


もこな2様

とても今後の参考になるご投稿、感謝いたします。
まだまだ勉強したてで独学でどこから手をつけたら良いのやら状態ですが、
イミディエイトウィンドウ、ローカルウィンドウは知らなかったので今後勉強してみます。

また、コードの整理もありがとうございます。
色々やって、動かない…と今朝から試行錯誤中で訳が分からなくなっていました。
一度、落ち着いて基礎を勉強してみたいと思います。

γ様、もこな2様のご丁寧な対応、ほんとありがとうございます。
(おさる) 2021/09/19(日) 13:29


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.