プロが教える店舗&オフィスのセキュリティ対策術

ブック内のシート間で集計するようなマクロ入りの雛形をエクセルで作りました。
出来上がったのですが、その雛形はコピペして何十ファイルと増えて各現場ごとに使っていかなければいけないのですが、コピペした雛形ブックではブック名が当然変わっているのでマクロがエラーになってしまいます。
ブック名が変わってもマクロが正常に作動するにはどういう手順で変えていけばいいか詳しい方教えてください!

質問者からの補足コメント

  • 説明不足ですみません!!このブックには下記のマクロ名があります。
    その中でブック名が入っているマクロは「新1」から「新4」の4つでした。

    「マクロについて2」の補足画像1
    No.4の回答に寄せられた補足コメントです。 補足日時:2018/02/28 18:03
  • 「新4」のマクロの内容です。
    たぶん「新4」は「新1」から「新3」までを合体させて追加してるのではないかなと

    「マクロについて2」の補足画像2
      補足日時:2018/02/28 18:05
  • 「新4」の続きです

    「マクロについて2」の補足画像3
      補足日時:2018/02/28 18:06
  • 原本をコピーペーストし、新たな現場名の書類として作ったものをマクロ実行すると下記のようなエラーになります

    現場は同時に何個もあるので直接原本を使いながら出来上がったら名前をつけて保存というのは出来ません。コピペして何個も作っておいてマクロのブックのところだけ新たな現場名に書き換えてというのも記入するのはパソコンをまったく知らない現場人ですので難しいと思います。

    「マクロについて2」の補足画像4
      補足日時:2018/02/28 18:23

A 回答 (7件)

取りあえずコピーした物で No.4 または No.5 のように書き換えて実行したらどうなりますか?

    • good
    • 0
この回答へのお礼

試したところ・・・

なんとできました!!目からうろこの状態です!1週間悩み倒していたので本当に本当に助かりました(泣)
これで複製してもマクロを活用して従業員の方が分かりやすい雛形が完成いたしました!
感謝いたします!

お礼日時:2018/03/01 23:11

こんばんは。



前回、返事を書いた一人です。
やはり分かっていただけていなかったようです。
Application.Run でも Call でも、その呼出の登録の中身自体の問題です。
登録が変わっていないから、エラーは続きます。

画像をみると、フォームコントロール・ボタンのようです。

その中の、OnAction プロパティは、コピーしたり名称を変えても、そのままでは内部は変更しないわけですから、当然、前のままの登録した名称を呼ぼうとして、見つからない場合は、エラーになるわけです。

私の場合は、QATの中身なので、それを書き換えられると思ったら、できなかったのです。そこで、今は、アドイン型に変えようとしています。ところが、このご質問者さんの場合は、フォームコントロールボタンにしてしまって、それにあまりにも手を加えすぎた感じがします。

解決方法は2つあることは書きましたが、もう片方のほうは、今、私がしようとしている方法で、ボタンを、Command.Control のボタンにすることで、アドイン形式に変えてしまうことですが、取っ掛かりが面倒です。

注意:
もう一つが、ボタンのOnAction を書き換える方法です。
しかし、Application.Run は、今の段階では意味がないので、元のオリジナルに戻してください。必ず、内部のマクロを呼び出すようにしてください。

フォームコントロールボタンのみに作用します。
ActiveX コントロールのボタンは、極力使うのは控えたほうが良いです。
Excel自体で自動的に変わる場合もありますが、これは、復旧できないほど、書き換わってしまった場合に有効です。(ただし、シートモジュールのマクロは想定していません)


'//標準モジュール
Sub Auto_Open()
'ボタンリンク自動修正マクロ
Call CheckButtonPrc
End Sub

Sub CheckButtonPrc()
Dim wd1 As String, wd2 As String
Dim bln As Boolean
Dim btn As Object, i As Long
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
For i = 1 To sh.Buttons.Count
  Set btn = sh.Buttons(i) '最初に見つけたフォームコントロール・ボタン
  bln = True
  Exit For
Next i
If bln Then
  Exit For
End If
Next sh
wd1 = btn.OnAction
wd2 = ActiveWorkbook.Name
If InStr(1, wd1, wd2 & "'!") = 0 Then
MsgBox "OnActio   : " & wd1 & vbCrLf & _
  "ThisWorkbook名: " & wd2
 MsgBox "呼出が掛かっています。", vbExclamation
 If MsgBox("修正しますか?", vbOKCancel) = vbCancel Then Exit Sub
 Call ReplaceOnActions
End If
End Sub
Private Sub ReplaceOnActions()
 Dim sh As Worksheet
 Dim shp As Object
 Dim buf As String
 Dim wd1 As String, wd2 As String
 Dim i As Long
 For Each sh In Worksheets
   For Each shp In sh.Shapes
    If shp.Type = msoFormControl Then
     buf = shp.OnAction
     i = InStr(1, buf, "'!")
     wd1 = Mid(buf, 2, i - 2)
     wd2 = ActiveWorkbook.FullName
     shp.OnAction = Replace(buf, wd1, wd2) '修正
    End If
   Next shp
 Next sh
End Sub
'//

添付の画像は、どれが出ても、基本的には無視して構いません。
Excel側で、自動で直っている場合は、メーセージなど何も出てきません。
真ん中の「申し訳ございません」のメッセージの「OK」ボタンをクリックするとマクロが修正するはずです。
「マクロについて2」の回答画像7
    • good
    • 0
この回答へのお礼

見てくださりありがとうございました!
画像まで用意してくださってとっても分かりやすかったです
WindFaller様の教えは今後もっと詳しくかつ精密に作製していく上で力になる方法で必ず理解し活用させていこうと思います!
本当にありがとうございました!

お礼日時:2018/03/01 23:08

>Application.Run "'見積.予算書.日報 原本 -最終形.xlsm'!日報集計"



見積.予算書.日報 原本 -最終形.xlsm
これが今やっているBookなら
その部分を変更して

Application.Run "'" & ThisWorkbook.Name & "'!日報集計"

としてみます?

既出の『Call ~』に書き換えるのも良いかもですけど。
    • good
    • 0

「Application.Run "'見積.予算書.日報 原本 -最終形.xlsm'!日報集計"」自体何をやっているか?よく判らないのですが、もしかしたら「日報集計」というマクロを呼び出しているならば「Call 日報集計」だけで済むのですが…


違う意味が有るならば、説明していただけますか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

私はこのブックを引継ぎで作成しているので詳しくは分からなくて説明が分からなくて申し訳ないありません。。

ブック名は見積.予算書.日報 原本 -最終形.xlsmで、マクロを実行するときはフォームコントロールから実行ボタンを作ってマクロを実行しようと思ってボタンを作っています(絶対ではないのでボタンを作らないほうがよいのなら消してもかまいません)

この資料で分かりますでしょうか?足りない部分がありましたら是非おっしゃってください!

お礼日時:2018/02/28 18:12

No.2のお礼に対して。



多分GooUserラックさんの方から回答がつくと思いますよ。
私はあくまで1つのBookだけで操作をする場合を想定していましたので。

ってApplication.Runで呼び出しているBookは自分自身なのかな?
    • good
    • 0
この回答へのお礼

このブックを引継ぎで作成しているので詳しくは分からなくて説明が分からなくて申し訳ありません。。

ブック名は見積.予算書.日報 原本 -最終形.xlsmで、マクロを実行するときはフォームコントロールから実行ボタンを作ってマクロを実行しようと思ってボタンを作っています(絶対ではないのでボタンを作らないほうがよいのなら消してもかまいません)

この資料で分かりますでしょうか?足りない部分がありましたら是非おっしゃってください!

困っていますよろしくお願いいたします・・・

お礼日時:2018/02/28 18:15

回答は既に出ていますが。

。。

逆に他のBookとの連携をする必要がない(Bookは各々1つでよい)なら、Bookの指定をしないという選択もありかな~と思いますよ。
    • good
    • 0
この回答へのお礼

よろしければそのような設定にするための手順を教えていただけませんか?!

お礼日時:2018/02/28 14:32

自ブックを指定するときにファイル名ではなく「ThisWorkbook」を使えばよいと思います。

    • good
    • 0
この回答へのお礼

原本のブック名が見積.予算書.日報 原本 -最終形.xlsmなのですが、マクロを書くところで Application.Run "'見積.予算書.日報 原本 -最終形.xlsm'!日報集計" となっている部分を Application.RunThisWorkbook "!日報集計"ThisWorkbook にしたらよいのですか?

してみたのですができなくて・・・

お礼日時:2018/02/28 14:22

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