[[20190610184257]] 『book名の指定について』(tomo) ページの最後に飛ぶ

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

 

『book名の指定について』(tomo)

Workbooks名を指定せずにコピーする方法がありませんか?
都度book名が、違うので・・・マクロエラーが起こる

同時に開いているbookは対象は2つです。
よろしくお願いします。

Sub 共通掛率()
Dim sh As Worksheet
Set sh = Workbooks("内訳.xlsm").Worksheets("表紙")
With Workbooks("計算式_一般.xlsm").Worksheets("Sheet1")
.Range("P38").copy sh.Range("AK66:AK67")
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
End With
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


>Workbooks名を指定せずにコピー
>都度book名が、違うので

コピー先、コピー元、両方のブック名が変わるのですか?
シート名は固定ですか?
このマクロは、どこに記述しているのですか?

(マナ) 2019/06/10(月) 18:58


(マナ)さん
ありがとうございます。
以下です
>コピー先、コピー元、両方のブック名が変わるのですか?
はい、変化します。
>シート名は固定ですか?
固定しています。
>このマクロは、どこに記述しているのですか?
標準Moduleです。

(tomo) 2019/06/10(月) 19:14


>>シート名は固定ですか?
>固定しています。

表紙というシートは、コピー先にしかないですか。
Sheet1というシートは、コピー元にしかないですか。

>>このマクロは、どこに記述しているのですか?
>標準Moduleです。

どのブックの標準Moduleですか。
コピー元、コピー先、その他?

(マナ) 2019/06/10(月) 19:25


>表紙というシートは、コピー先にしかないですか。
はいありません
>Sheet1というシートは、コピー元にしかないですか
そうです。
>どのブックの標準Moduleですか。
>コピー元、コピー先、その他?
コピー先です。
(tomo) 2019/06/10(月) 19:27

コピー先は、
Thisworkbook.Worksheets("表紙")
で、表現できます。

で、最初に
ActiveWorkbook.name<>Thisworkbook.nameであれば
windows(2).activate
を実行し
Worksheets("Sheet1")
をコピー元シートとしてはどうですか。

(マナ) 2019/06/10(月) 19:52


ActiveWorkbook.name=Thisworkbook.nameであれば
の間違いでした。

無条件で、最初に、

Thisworkbook.activate
windows(2),activate

でもよいかもしれません。

(マナ) 2019/06/10(月) 19:57


(マナ)さん
ありがとうございます。
えっ以下でしょうか?
違いますか?

Dim sh As Worksheet
ThisWorkbook.Activate
Windows (2), Activate’★ココでエラー
.Range("P38").copy sh.Range("AK66:AK67")
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
(tomo) 2019/06/10(月) 20:07


ごめんなさい。タイプミスです。
 Windows (2), Activate
           ↓
 Windows (2).Activate

(マナ) 2019/06/10(月) 20:31


(マナ)さん
以下は、withでくくる必要ありますか エラーとなります。

.Range("P38").copy sh.Range("AK66:AK67")
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
(tomo) 2019/06/10(月) 20:38


もちろんです。
withの意味を理解していますか。

(マナ) 2019/06/10(月) 20:40


With Workbooks("計算式_一般.xlsm").Worksheets("Sheet1")
こちらの代わりの書き方は?
すみません。
よろしくお願いします。

(tomo) 2019/06/10(月) 21:01


With Worksheets("Sheet1")

(マナ) 2019/06/10(月) 21:07


(マナ)さん
外出してしまい返事遅れましたが
以下のようにしてみたのですが、なかなか通ってくれません
★部分エラー 
「オブジェクト変数またはWithブロック変数が設定されていません」
どこか違いますか?
Dim sh As Worksheet
ThisWorkbook.Activate
Windows(2).Activate

With Worksheets("Sheet1")
.Range("P38").copy sh.Range("AK66:AK67")★
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
End With
(tomo) 2019/06/11(火) 01:33


こちらも×でした
ThisWorkbook.Activate
Windows(2).Activate

With Worksheets("Sheet1")
.Range("P38").copy Range("AK66:AK67")
.Range("P39").copy Range("AK70:AK71")
.Range("P40").copy Range("AK74:AK75")
End With
(tomo) 2019/06/11(火) 01:44


上記では、
Windows(2).Activate
が、アクティブになるのですが
以下のcopyが実行されないみたいです。
With Worksheets("Sheet1") が
With Workbooks("計算式_一般.xlsm").Worksheets("Sheet1") なら
マクロが通るのですがbook名が変わるとエラーになるので・・・
なにか方法無いでしょうか?
(tomo) 2019/06/11(火) 11:29

>コピー先は、
>Thisworkbook.Worksheets("表紙")
>で、表現できます。

コピー先が指定されていませんが、
理解できていますか。

(マナ) 2019/06/11(火) 19:15


(マナ)さん
↓以下のようなことでしょうか
理解が悪くてすみません。
Dim sh As Worksheet
Windows(2).Activate
Set sh = ThisWorkbook.Worksheets("表紙")
With Worksheets("Sheet1")
.Range("P38").copy sh.Range("AK66:AK67")
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
End With
(tomo) 2019/06/11(火) 20:14

ThisWorkbook.Activate がなくなったのはなぜ?

(マナ) 2019/06/11(火) 21:46


こうですか?<(_ _)>
Dim sh As Worksheet
Windows(2).Activate
Set sh = ThisWorkbook.Worksheets("表紙")
With Worksheets("Sheet1")
.Range("P38").copy sh.Range("AK66:AK67")
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
End With
ThisWorkbook.Activate
(tomo) 2019/06/12(水) 01:30

おちついて、最初から読み直してください。
意味わからないところを質問してください。
理解しないで、適当にコピペしてもだめです。

(マナ) 2019/06/12(水) 19:09


今回、何をしようとしているかですが、

ブック名では、指定できないので、
そのかわりに、

コピー先は、自ブック(Thisworkbook)
コピー元は、activeなブック(最前面のブック)

としています。

(マナ) 2019/06/12(水) 19:13


(マナ)さん
連日、すみません。

2019/06/12(水) 01:30の
マクロで一応希望通りの動きなのですが、不安なため確認です。
手順をもう一度説明すると
1.コピー先bookからマクロ実行ぃます。 .Worksheets("表紙") このbook
2.コピー元 .Worksheets("Sheet1") です。このbook
違いますか?
>ActiveWorkbook.name<>Thisworkbook.nameであれば
>windows(2).activate
>を実行し
>Worksheets("Sheet1")
>をコピー元シートとしてはどうですか。
このあたりの説明が 理解できていません?
(tomo) 2019/06/12(水) 20:08


Workbooks("計算式_一般.xlsm").Worksheets("Sheet1")

でなく、
↓のように、ブック名を省略すると

Worksheets("Sheet1")

アクティブなブックのSheet1という意味になります。
一番手前に表示されているブックのSheet1です。

なので、Sheet1のあるコピー元ブックはアクティブにしないとだめです。

ですが、仮にマクロ開始時に、アクティブでなかったとしても
マクロの中、強制的にアクティブにしてあげればよいわけです。

つまり、2番めのブックをアクティブにするということで
それが、
windows(2).activate
です。

でも、もし、最初からコピー元がアクティブなら
windows(2).activate
を実行すると、
逆に、コピー先がアクティブになってしまいます。
なので、こう書きました。

>ActiveWorkbook.name<>Thisworkbook.nameであれば
>windows(2).activate
>を実行し

でも、あとで考えてみたら
どっちがアクティブであったとしても

Thisworkbook.activate
windows(2),activate

を実行すると、
まずはThisworkbookがアクティブになり
(実行前からアクティブでも変化しないだけ)
つぎの、windows(2),activateでコピー元がアクティブになるはず。

ということです。

>コピー先bookからマクロ実行ぃます。

この意味が、表紙に、マクロを登録したボタンがあるとかなら
絶対に、最初はThisworkbookがアクティブなので、
Thisworkbook.activate
は、必要ありません。

(マナ) 2019/06/12(水) 20:55


横からすいません。
>ActiveWorkbook.name<>Thisworkbook.nameであれば
>windows(2).activate
>を実行し
で引っ掛かっておられるなら、5分後の(2019/06/10(月) 19:57)に

>ActiveWorkbook.name=Thisworkbook.nameであれば
に訂正されてますよ。
それなら理解できますか?
(チオチモリン) 2019/06/12(水) 21:18


質問時の基本形から(Web上にサンプルあり)で
考えを巡らせているので今回解説を頂き更に
わからなくなりました。いろいろ試したのですが・・
基本形元にすると
コピー元、コピー先を指定し copyしている単純なものと
考えられるのですが .activate なのでちょっと難しいです。ね

(tomo) 2019/06/13(木) 01:40


いろんな人に同時に言われると混乱してしまうかもですけど、箸休め的なお話で。
 ・同時に開いているbookは2つ
 ・コピー先となるブックにマクロを記述している

という前提が崩れないなら、それぞれのブックは↓でも特定できますよ。

    Sub ブック取得()
        Dim 複写元 As Workbook
        Dim 貼付先 As Workbook

        Set 貼付先 = ThisWorkbook

        For Each 複写元 In Workbooks
            If 複写元.Name <> 貼付先.Name Then Exit For
        Next

        Debug.Print "貼付先のブックは" & 貼付先.Name & "です"
        Debug.Print "複写元のブックは" & 複写元.Name & "です"

    End Sub

(もこな2) 2019/06/13(木) 03:18


(もこな2)さん
ありがとうございます。

貼付先のブックは内訳.xlsmです
複写元のブックはPERSONAL.XLSBです
となりますが、今回対象は、もう一つ開いている
計算式_一般.xlsm こちらが2つ目なのですが
マクロ指定の仕方ですか?
copyPasteはどのように絡んできますか
(tomo) 2019/06/13(木) 04:32


計算式_一般.xlsm 複写元です。
(tomo) 2019/06/13(木) 04:34

個人用マクロブックですか〜盲点でした。
ちょっと良い方法が思いつかないので苦肉の策です。
    Sub ブック取得()
        Dim 複写元 As Workbook
        Dim 貼付先 As Workbook
        Set 貼付先 = ThisWorkbook

        For Each 複写元 In Workbooks
            If 複写元.Name <> 貼付先.Name And StrConv(複写元.Name, vbUpperCase) <> "PERSONAL.XLSB" Then Exit For
        Next

        Debug.Print "貼付先のブックは" & 貼付先.Name & "です"
        Debug.Print "複写元のブックは" & 複写元.Name & "です"

    End Sub

(もこな2) 2019/06/13(木) 19:42


 最初に
 >同時に開いているbookは対象は2つです。
 とありますが、それは
 >内訳.xlsm
 >計算式_一般.xlsm
 じゃなかったんですか?
 〜〜〜〜〜〜〜〜〜〜〜〜 それはそれとして
 PERSONAL.XLSBのワークシートが表示されているんですね。
 〜〜〜〜〜〜〜〜〜〜〜〜 シンプルに
 計算式_一般.xlsm がアクティブな状態で 「ブック取得」を走らせれば良さげに思います。
 Sub ブック取得()
     Dim 複写元 As Workbook:Set 複写元 = ActiveWorkBook
     Dim 貼付先 As Workbook:Set 貼付先 = ThisWorkbook
 とか
 〜〜〜〜〜〜〜〜〜〜〜〜
 >都度book名が、違うので・・・マクロエラーが起こる
 >Workbooks("計算式_一般.xlsm").Worksheets("Sheet1") 
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ の部分を
  ActiveWorkBook.Worksheets("Sheet1") 
 に置き換えられます。
(チオチモリン) 2019/06/13(木) 23:22

(もこな2)さん
(チオチモリン)さん
ありがとうございます。
イミディエイトウインドの結果です。
貼付先のブックは内訳.xlsmです
複写元のブックは計算式_一般.xlsm.xlsmです

しかしながら、取得できたとしても私のマクロ知識では次の展開が読めません。
ネット上で、いろいろググってみたのですが「ブック間コピペ」など
同じような事案がなくとても、難しく思います
>計算式_一般.xlsm がアクティブな状態で 「ブック取得」を走らせれば良さげに思います。
マクロ登録ボタンは、内訳.xlsmに配置してあります。内訳.xlsm側から操作
乏しい知識の中で以下のようなマクロで一応は希望する動き(コピペ)するのですが
回答の内容を踏まえ、修正点教授いただけると助かります。
計算式_一般.xlsm.sheet1(シート名)
内訳.xlsm.表紙(シート名)
Sub test()
Dim sh As Worksheet
Windows(2).Activate
Set sh = ThisWorkbook.Worksheets("表紙")
With Worksheets("Sheet1")
.Range("P38").copy sh.Range("AK66:AK67")
.Range("P39").copy sh.Range("AK70:AK71")
.Range("P40").copy sh.Range("AK74:AK75")
End With
ThisWorkbook.Activate
End Sub
(tomo) 2019/06/14(金) 01:12


提示のコードは
・マクロ登録ボタンは、内訳.xlsmに配置
・同時に開いている(表示)bookは2つ、(Windowも2つ)
 (PERSONAL.XLSBは開いていてもワークシートは非表示とする)
なら希望通りに動くと思います。
〜〜〜〜〜
ただ、これまでのやり取りをみてみると複写元のブックの指定についての理解に不安があるようですので、
確認するようなサンプルを書いてみました(↓)
試してみて下さい。
 Sub 共通掛率()
     Dim 貼付先 As Worksheet
     Dim 複写元 As Worksheet
     Dim W1 As Workbook
     Set 貼付先 = ThisWorkbook.Worksheets("表紙")
     For Each W1 In Workbooks
         If W1.Name <> 貼付先.Parent.Name Then
         If W1.Windows(1).Visible = True Then
             If MsgBox("複写元は【" & W1.Name & "】ですか?", vbYesNo) = vbYes Then Set 複写元 = W1.Worksheets("Sheet1")
         End If
         End If
     Next
     If 複写元 Is Nothing Then MsgBox "複写元が指定されませんでした。", vbCritical: Exit Sub
     With 複写元
         .Range("P38").Copy 貼付先.Range("AK66:AK67")
         .Range("P39").Copy 貼付先.Range("AK70:AK71")
         .Range("P40").Copy 貼付先.Range("AK74:AK75")
     End With
 End Sub
(チオチモリン) 2019/06/14(金) 02:10

(チオチモリン)さん
ありがとうございます。
朝早いので、時間でき次第 確認報告申し上げます。
すみません。おやすみなさい
(tomo) 2019/06/14(金) 02:57

(チオチモリン)さん
ありがとうございました。

 For Each〜next文という手順を踏まないと、book(Sheet)の指定ができないと言うことなんですか?

Set 複写元 = W1.Worksheets("Sheet1") 
with ・・・   のように1行で表したのでは×なんでしょうね

貼付先.Parent.Nameとか、あまり目にしたいマクロを使うんですね
とても、手に負えませんね・・・
(tomo) 2019/06/14(金) 17:35


 >For Each〜next文という手順を踏まないと、book(Sheet)の指定ができないと言うことなんですか?
 できないか?という直球にこたえれば、そんなことはないです。

 >with ・・・   のように1行で表したのでは×なんでしょうね 
 いいですよ。

 >貼付先.Parent.Nameとか、あまり目にしたいマクロを使うんですね
 手におえないですか? 別の書き方もできますよ。
 自分が理解できる書き方が良いと思います。
 でも、理解しようとすれば、視野が広がるかもしれませんよ。(今は無理でも)

 ある意味、お好きなようにです。
 10人いれば、10通りの書き方があるといってもいいです。
 そのうち、自分のスタイルもできます。

 〜〜〜〜〜〜〜〜〜 
 ※ 2019/06/14(金) 01:12 のコードで希望通りの結果になるなら、それでよいと思います。
     希望通りにならないなら、その時に原因を追究して修正すればよいです。

(チオチモリン) 2019/06/14(金) 18:32


(チオチモリン)さん
> でも、理解しようとすれば、視野が広がるかもしれませんよ。(今は無理でも)
> ある意味、お好きなようにです。
> 10人いれば、10通りの書き方があるといってもいいです。
> そのうち、自分のスタイルもできます。
ありがとうございました。
自分なりに、Web参考にしながら理解出来るかどうかわかりませんが
確認していこうと思います。

(tomo) 2019/06/15(土) 01:03


コメント返信:

[ 一覧(最新更新順) ]


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