[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『別ブックにシートをコピー後、マクロの再登録』(とらじま)
いろいろ事例を探して試してみましたが、上手くいかず、困っています。
元ファイルには複数のシートと複数の標準モジュールが存在します。
複数シートの内、2つのシートと標準モジュール1つを、新しく作成したファイルにコピーし、デスクトップ上に名前を付けて保存します。
シートにはマクロボタンがあります。
新しく作成したファイルのマクロボタンのマクロの再登録をOnActionで行うのですが、コピー元のパスを参照してしまい、上手くいきません。
' 作成した工程表を別ファイルで保存
Sub 別名保存()
Dim Ws As Worksheet
Dim nm As Name
Workbooks.Add
'作成するシートと休日シートをコピー
ThisWorkbook.Worksheets("休日").Copy After:=ActiveWorkbook.Worksheets(Sheets.Count)
ThisWorkbook.Worksheets(ShName).Copy Before:=ActiveWorkbook.Worksheets(Worksheets.Count)
'標準モジュール6をコピー
Dim VBP, Code As String
With ThisWorkbook.VBProject.VBComponents("Module6").CodeModule
Code = .Lines(.CountOfDeclarationLines + 1, .CountOfLines - .CountOfDeclarationLines + 1)
End With
With ActiveWorkbook.VBProject.VBComponents.Add(1)
.CodeModule.AddFromString Code
End With
'マクロ実行中に警告やメッセージを表示させない
Application.DisplayAlerts = False
'不要なシートを削除
For Each Ws In Worksheets
If Ws.Name <> ShName And Ws.Name <> "休日" Then
Ws.Delete
End If
Next Ws
'名前の定義を【休日】・【色】以外削除
For Each nm In Names
If nm.Name <> "休日" And nm.Name <> "色" Then
nm.Delete
End If
Next nm
ActiveSheet.PageSetup.PrintArea = 印刷範囲
'改ページプレビューを標準にする
ActiveWindow.View = xlNormalView
Call デスクトップに保存
Sheets(1).Select
ActiveSheet.Shapes.Range(Array("工程塗色ボタン")).Select
ActiveSheet.Shapes(1).Select
Selection.OnAction = "工程表" & "!工程LINE"
Application.DisplayAlerts = True
'変更を保存せず、元のファイルを閉じる
ThisWorkbook.Saved = True
ThisWorkbook.Close
End Sub
Sub デスクトップに保存()
Dim Path As String
Dim WSH As Variant
Set WSH = CreateObject("WScript.Shell")
Path = WSH.SpecialFolders("Desktop") & "\"
ActiveWorkbook.SaveAs Filename:=Path & "工程表.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
Set WSH = Nothing
End Sub
元ファイル名:工程表作成
新しいファイル名:工程表
マクロ名:工程LINE
エラーは起きず、デスクトップ上に新しいファイル(工程表)の作成は出来て、元のファイルも保存せず閉じますが、マクロボタンの登録が元のファイルのまま、【'C:\Users\kuron\Desktop\工程表作成.xlsm'!工程LINE】となります。OnActionで、ここを新しいファイルの工程表の【工程LINE】と変えたいのですが出来ません。
よろしくお願いします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
With ThisWorkbook.VBProject.VBComponents("Module6").CodeModule
Code = .Lines(.CountOfDeclarationLines + 1, .CountOfLines - .CountOfDeclarationLines + 1)
End With
With ActiveWorkbook.VBProject.VBComponents.Add(1)
.CodeModule.AddFromString Code
End With
ActiveSheet.Shapes(1).OnAction = "工程LINE"
Call デスクトップに保存
の順にやればイケるのではないでしょうか?
(白茶) 2020/07/06(月) 19:23
ご回答ありがとうございます。
残念ながらダメでした。
私も 『Call デスクトップに保存』を後に書いていたのですが、
先に保存して確定しないと変わらないと思い、今の順番にしました。
ActiveSheet.Shapes(1) にしましたが、変わりません。
どうしても、元のファイル名が付きます。
(とらじま) 2020/07/07(火) 13:48
あら、そうなんですか。 もちろん元のまま ActiveSheet.Shapes(1).OnAction = "工程表" & "!工程LINE" とかでやってないですよね?
試しに
Module1 *********************************************************************************************
Sub test()
Dim Code As String
Workbooks.Add
ActiveSheet.Shapes.AddShape msoShapeRectangle, 72, 72, 72, 72
With ThisWorkbook.VBProject.VBComponents("Module6").CodeModule
Code = .Lines(.CountOfDeclarationLines + 1, .CountOfLines - .CountOfDeclarationLines + 1)
End With
With ActiveWorkbook.VBProject.VBComponents.Add(1)
.CodeModule.AddFromString Code
End With
ActiveSheet.Shapes(1).OnAction = "工程LINE"
Call デスクトップに保存
End Sub
Sub デスクトップに保存()
Dim Path As String
Dim WSH As Variant
Set WSH = CreateObject("WScript.Shell")
Path = WSH.SpecialFolders("Desktop") & "\"
ActiveWorkbook.SaveAs Filename:=Path & "工程表.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
Set WSH = Nothing
End Sub
Module6 *********************************************************************************************
Sub 工程LINE()
MsgBox "工程LINE"
End Sub
↑だけのブックを作って実行してみましたが、まともに動きました(当方Excel2010ですけど) これでも私と違う結果なら、私にはわかんないです。
(実はDisplayAlerts切らずに実行したら、どこかで失敗してたりして) なんて、コッソリ思ったりしてます。
(白茶) 2020/07/07(火) 18:05
ActiveSheet.Shapes(1).OnAction = "工程表" & "!工程LINE" ではなく、
= "工程LINE" としております。
試しで記載いただいた『test』の図形を追加作成しての登録は上手くいきました。
同じブックで、マクロの登録(OnAction)の部分を、図形を追加して登録(下記)に変えて、元のブックではなく、"工程LINE”のみの登録名になりました。
ActiveSheet.Shapes.AddShape msoShapeRectangle, 72, 72, 72, 72
ActiveSheet.Shapes(1).OnAction = "工程LINE"
なので、予め用意したボタンのマクロ登録変更が上手くいかないのかと思い、
ボタンを削除して、新たにボタンを追加して登録しようと下記コードで試しましたが、
出来ませんでした。どうしても元のファイル名が付いてしまいます。
With ActiveSheet.Buttons.Add(Range("B3").Left, _
Range("B3").Top, _
Range("B3").Width, _
Range("B3").Height)
.OnAction = "工程LINE"
.Characters.Text = "塗色"
End With
図形だと上手くいくのですが、ボタンだと駄目なのでしょうか。
よろしくお願いします。
(とらじま) 2020/07/08(水) 16:08
おお!! ボタンなら現象再現出来ましたよ。
Sub test()
Dim Code As String
Workbooks.Add
' ActiveSheet.Shapes.AddShape msoShapeRectangle, 72, 72, 72, 72
ActiveSheet.Buttons.Add Range("B3").Left, Range("B3").Top, Range("B3").Width, Range("B3").Height
Rem 試しにわざと元ブックのマクロを登録 -------------------
With ActiveSheet.Buttons(1)
.OnAction = "工程LINE"
End With
Stop '確認用ストップ
Rem ------------------------------------------------------
With ThisWorkbook.VBProject.VBComponents("Module6").CodeModule
Code = .Lines(.CountOfDeclarationLines + 1, .CountOfLines - .CountOfDeclarationLines + 1)
End With
With ActiveWorkbook.VBProject.VBComponents.Add(1)
.CodeModule.AddFromString Code
End With
' ActiveSheet.Shapes(1).OnAction = "工程LINE"
With ActiveSheet.Buttons(1)
.OnAction = ActiveWorkbook.Name & "!工程LINE"
.Characters.Text = "塗色"
End With
Call デスクトップに保存
End Sub
とりあえず↑でやってみたら、なんとかなってるっぽいです(こちらの環境では)
実行後、改めて工程表.xlsmを開いて ボタンの[マクロの登録]でマクロ名を確認したら [工程表.xlsm!工程LINE]になってました。
(白茶) 2020/07/08(水) 17:10
出来ました!
【ActieWorkbook.Name & "!工程LINE"】
とすると、ボタンの追加でなく、元からあるボタンでも登録名変更が出来ました。
ファイル名を直接記載ではなく、【ActieWorkbook.Name】としないといけないのですね。
できれば、ファイル名が付かない [工程LINE] で登録できればスッキリしますが、
ボタンだと、ファイル名が前に付いてしまうのですね。
何かスッキリしませんが、動くので、こちらで進めようと思います。
ありがとうございました。
感謝!
(とらじま) 2020/07/08(水) 17:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.