[[20231020100913]] 『マクロを別ブックへコピー』(お寿司) ページの最後に飛ぶ

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

 

『マクロを別ブックへコピー』(お寿司)

勉強させて下さい。
以下のブックのシートを書いてハイパーリンクを作るマクロを使っています。
名前が分かりませんが、標準モジュールではなく当該リンクを作るシートのObjectsのSheet1に書いてます。

Sub シート名記載()
Dim i As Byte
For i = 2 To Worksheets.Count

    ActiveSheet.Hyperlinks.Add anchor:=Range("c" & i + 2), _
    Address:="", _
    SubAddress:="'" & Worksheets(i).Name & "'" & "!A1", _
    TextToDisplay:=Worksheets(i).Name
Next
End Sub

これをフォームコントロールのボタンでマクロ名Sheet1.シート名記載をえらんで使ってます。

これが便利なので他のExcelでも使いたいと思い、シートをコピーしてボタンを押したところコピー元のExcelが開き、コピー元に記載がされてしまいます。
マクロの登録をし直せば望む動作が行われますのでコードではなくボタンの設定が悪いのかと思ったりコードを適切にかけばそんなことないのかと思ったりしますがお手上げです。毎回ボタンのマクロの登録しなおすしかないのでしょうか。
どうすれば良いか分かればご教示願えないでしょうか。

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


シートを別ブックにコピーした場合、ボタンに張り付いているマクロ名が

旧Book名!Sheet名.マクロ名

になっていると思います。これを

新Book名!Sheet名.マクロ名

にする必要があります。

以下に同じ質問をしている人がいて、マクロで書き換えることが提案されています。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11157690516
(ゆたか) 2023/10/20(金) 11:03:56


同じブックの場合はBook名を指定する必要はないですね。

誤)新Book名!Sheet名.マクロ名
正)Sheet名.マクロ名
(ゆたか) 2023/10/20(金) 11:14:27


多分これはマクロでマクロの登録のし直しをしているということですかね。
う〜ん、僕がこの知恵袋のマクロをよく分からず失敗してしまいましたがこれをヒントにやってみたいと思いますが、
これだと結局このマクロを起動させるボタンが必要になり、
結果そのマクロも旧ブック名!になって同じになってしまいそうな気がしていますがどうなんでしょうか。

自分は個人マクロブックとかに入れたりそもそも分かるので良いのですが他人がワンクリックで使いたいと思っているところです。

(お寿司) 2023/10/20(金) 11:23:50


手順としては以下の通りです。

1.シートを旧ブックから新ブックへコピーする
2.ブック名変更用のマクロを動かす

ブック名変更用のマクロはボタンに登録する必要はないですが、しても構いません。
その場合には、そのボタンの登録マクロ名だけ、手作業で変更する必要があります。
(シートのモジュールとして書いておけば、シートと一緒にコピーされますね)

ただ、コピーされたブックで1回だけ実行する処理ですから、マクロエディタから起動すれば良いと思いますよ。
(ゆたか) 2023/10/20(金) 11:38:07


 ActiveXコントールのCommandBottunを使えばいいのでは?
 Formコントロールである必要がありますか?
(´・ω・`) 2023/10/20(金) 11:38:33

ゆたか様
なるほど、わかりました。ちなみに
Sub InitAction()
For Each oSh In ActiveWorkbook.Sheets
For Each oShape In oSh.Shapes
With oShape
If oShape.OnAction <> vbNullString Then
oShape.OnAction = ThisWorkbook.Name & "!" & Split(oShape.OnAction, "!")(1)
End If
End With
Next
Next
End Sub

知恵袋のは汎用性あるタイプでそのまま流用してで良いんですかね。

(´・ω・`)様
特段必要は無いですが触れたことがなくまた、
そのように回答している知恵袋を見つけやってみた結果失敗したので諦めた経緯があります。

(お寿司) 2023/10/20(金) 12:05:35


(´・ω・`)様
今改めて行ったところうまくいきました。
先ほどは何で出来なかったんでしょうか笑
取り敢えず〆とさせていただきます ありがとうございました。
(お寿司) 2023/10/20(金) 14:05:11

話が終わっていますが2点ほど。

■1
↓ですから、(´・ω・`)さんのアドバイスが一番手っ取り早いのでは?
>標準モジュールではなく当該リンクを作るシートのObjectsのSheet1に書いてます。

適当に直しましたが↓のようなことじゃないですか?

 #シートモジュールに記述すること

    Private Sub CommandButton1_Click()
        Dim 出力行 As Long, MySH As Worksheet
        出力行 = 4

        For Each MySH In Me.Parent.Worksheets
            If MySH.Name <> Me.Name Then
                Me.Hyperlinks.Add _
                    anchor:=Me.Cells(出力行, "C"), _
                    Address:="", _
                    SubAddress:="'" & MySH.Name & "'" & "!A1", _
                    TextToDisplay:=MySH.Name
                出力行 = 出力行 + 1
            End If
        Next MySH
    End Sub

■2
>ちなみに〜知恵袋のは汎用性あるタイプでそのまま流用してで良いんですかね。
質問の意味がよくわかりません。
インデントが付いておらず見ずらいので整理してみると↓のようになっているわけですよね。
どのあたりが理解できないのでしょうか?

    Sub 整理()
        Dim oSh As Worksheet
        Dim oShape As Shape

        For Each oSh In ActiveWorkbook.Sheets
            For Each oShape In oSh.Shapes
                With oShape
                    If oShape.OnAction <> vbNullString Then
                        '▼ここでマクロの登録し直しをしている
                        oShape.OnAction = ThisWorkbook.Name & "!" & Split(oShape.OnAction, "!")(1)
                    End If
                End With
            Next
        Next
    End Sub

(もこな2 ) 2023/10/20(金) 14:50:20


コメント返信:

[ 一覧(最新更新順) ]


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