10秒目をつむったら…

【やりたい事】
以下のコードを実行すると、実行するファイルではない別ファイルに
マクロのボタンが作成されます。同ボタンにはマクロが割当てられており、動きます

ですが、2つのファイルが開いていて、実行されます
コードが保存されている、いろいろあり転記元.xlsmが開いている必要があります

ですので、マクロボタンを作る時に、マクロボタンが作成されるファイル
(240820_あいうえお.xlsx)にもマクロのコードが保存されるように出来ませんでしょうか?
⇒マクロボタンが作成されたファイル1つだけ開いている状態で、マクロを実行したいのです

ご存じの方、宜しくお願いします


【マクロを実行するファイル】
"C:\Users\2020\OneDrive\マクロ\コントロールファイル\いろいろあり転記元.xlsm"

【マクロボタンが作成されるファイル】
"C:\Users\2020\OneDrive\マクロ\240820_あいうえお.xlsx"



【別のブックにマクロが割当てられたボタンを作成のコード】
Sub Sample1()
Workbooks("240820_あいうえお.xlsx").Activate
With Workbooks("240820_あいうえお.xlsx").Worksheets("ボタン作成先シート").Buttons.Add(Range("E1").Left, _
Range("E1").Top, _
Range("E1:F1").Width, _
Range("E1:F2").Height)
.OnAction = "マクロプログラム"
.Characters.Text = "マクロボタン"
End With
End Sub


Sub マクロプログラム()
Dim lastrow As Long

lastrow = Workbooks("240820_あいうえお.xlsx").Worksheets("ボタン作成先シート").Cells(Rows.Count, 1).End(xlUp).Row

MsgBox lastrow

Range("A" & ActiveCell.Row & ":C" & ActiveCell.Row).Interior.ColorIndex = 15

Range("C" & ActiveCell.Row) = "削除"

Range("A" & ActiveCell.Row & ":C" & ActiveCell.Row).Cut Range("A" & lastrow).Offset(1, 0)

ActiveCell.EntireRow.Delete
End Sub

A 回答 (5件)

ボタンとマクロを登録するブックは、240820_あいうえお.xlsx ということですが、マクロを登録すると拡張子を.xlsmにしないといけないので、


最初から、240820_あいうえお.xlsmを作成しておき、そのブックに
ボタンとマクロを登録するようにすることは可能でしょうか。
そうであれば、以下のようにしてください。

以下のマクロを標準モジュールに登録してください。
Public Sub マクロ登録()
Dim trg_book_name As String
Dim tb As Workbook
Dim ts As Worksheet
Dim code As String
trg_book_name = "C:\Users\2020\OneDrive\マクロ\240820_あいうえお.xlsm"
Set tb = Workbooks.Open(trg_book_name)
Set ts = tb.Worksheets("ボタン作成先シート")
'ボタンの割り付け
With ts.Buttons.Add(Range("E1").Left, Range("E1").Top, Range("E1:F1").Width, Range("E1:F2").Height)
.OnAction = "マクロプログラム"
.Characters.Text = "マクロボタン"
End With
'マクロの登録(コピー元のマクロはModule1に可能納済みであること)
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
code = .Lines(.CountOfDeclarationLines + 1, .CountOfLines - .CountOfDeclarationLines + 1)
End With
With tb.VBProject.VBComponents.Add(1)
.CodeModule.AddFromString code
End With
tb.Save
tb.Close
End Sub




尚、標準モジュールのModule1には、以下のマクロを登録しておいてください。(これがコピーされます)
Sub マクロプログラム()
Dim lastrow As Long

lastrow = Workbooks("240820_あいうえお.xlsm").Worksheets("ボタン作成先シート").Cells(Rows.Count, 1).End(xlUp).Row

MsgBox lastrow

Range("A" & ActiveCell.Row & ":C" & ActiveCell.Row).Interior.ColorIndex = 15

Range("C" & ActiveCell.Row) = "削除"

Range("A" & ActiveCell.Row & ":C" & ActiveCell.Row).Cut Range("A" & lastrow).Offset(1, 0)

ActiveCell.EntireRow.Delete
End Sub
    • good
    • 1
この回答へのお礼

ご指導ありがとうございます

以下のコードにてデバックとなります
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule

・マクロを登録すると拡張子を.xlsm⇒実施しました
・標準モジュールのModule1には、以下のマクロを登録
⇒いろいろあり転記元.xlsmのブックに保存しています

アドバイスありましたら、お願いします

お礼日時:2024/08/21 04:52

>以下のコードにてデバックとなります


>With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule

その時のエラーメッセージは、何が表示されていますか。


>・標準モジュールのModule1には、以下のマクロを登録
>⇒いろいろあり転記元.xlsmのブックに保存しています

Module1にいろいろなプロシージャを登録しているように見えます。
Sub マクロプログラム()~End Subのみを登録してください。
もし、それが大変なら、新規にModuleを追加してください。
それをModule2とします。(実際にいくつになるかはあなたの環境できまりますが、例としてModule2で説明します)
そのModule2へSub マクロプログラム()~End Subのみを登録してください。
そして、
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule

With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
に変えてください。
    • good
    • 1
この回答へのお礼

【デバックについて】
解決しました
エラーの内容をよく、見ていませんでした
お手数をおかけしました

実行時エラー 1004:
プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます

⇒「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」をチェックする

⇒解決しました
【マクロボタンの設置について】
マクロボタンの設置やモジュールのコピーは出来たのですが
ボタンのマクロの登録(Sub マクロプログラム)先が、コピー先ではなく
コピー元のマクロを登録しています

何とか、240820_あいうえお.xlsmにコピーされたモジュールを登録するように
は、どんな方法がありますでしょうか

ご教授お願いします

お礼日時:2024/08/21 22:04

No1です。



>もし、ヒントありましたら、宜しくお願いします
ヒントを持っているのは、質問者様の方です。
こちらには何も情報がないので、ほとんどわかりかねます。

例えば、エラーメッセージ。
仮に「インデックスが~」等であれば、指定(したつもりの)オブジェクトが見つからない(=存在しない)ということになります。

>以下でエラーとなりうまく出来ませんでした
単純に、With構文でオブジェクトの参照ができていないだけと推測されます。
属性参照がネストしているので、分解して、親オブジェクトから順にどこまで取得できているのかを調べれば、具体的なエラーの原因かわかるはずです。
プログラムを作成しようと思うのなら、デバッグの方法ぐらいは覚えましょう。
    • good
    • 1
この回答へのお礼

いつもご指導ありがとうございます
エラーの意味を理解していませんでした

全てデバックではなく、ご指摘のとおり
エラーメッセージが出た後に、デバック表示となっているんですね

>例えば、エラーメッセージ。

お礼日時:2024/08/22 08:42

No1です。



連投失礼。

実行したいマクロを「個人用マクロブック」に登録しておけば、.xlsx単体でも実行できますね。(失念していました。)
ボタンへマクロを設定する際には、個人用ブックを指定しておけば良いです。
    • good
    • 1
この回答へのお礼

いつも、ご指導ありがとうございます
1つ目の回答について、検証させて頂いています

当方、常に、複数人にて、個別のパソコンのエクセルから
マクロを実行します

個人用マクロブックも考えたのですが、複数人が不特定多数
の為、他の方法にて考えています

お礼日時:2024/08/18 19:16

こんにちは



ご質問の内容がよくわかりませんけれど・・

>マクロボタンが作成されたファイル1つだけ開いている状態で、
>マクロを実行したいのです
OnAction属性を設定する際に、ブックのフルパス付でマクロを登録しておけば、実行時に当該ブックが開かれて実行されるようになります。
(最初にマクロのあるブックが開かれます)

単体のブックだけで、実行できるようにしたいのであれば、マクロそのものをコピペするなりしておく必要がありますが、こちらの場合には、拡張子をマクロ付きのブック(=.xlsm)に変更する必要があるでしょう。
コピペの要領としては、こんな感じでしょうか。
http://www.officetanaka.net/excel/vba/vbe/07.htm
    • good
    • 0
この回答へのお礼

リンクにて、マネして実施しましたが、以下でエラーとなり
うまく出来ませんでした

やりたい事は、マクロ(コード)の別ブックへのコピーです
ハンドではなく、マクロを使ってです

もし、ヒントありましたら、宜しくお願いします

With Workbooks("Book1.xlsm").VBProject.VBComponents("Sample1").CodeModule

お礼日時:2024/08/20 07:27

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A