[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コマンドボタンに設定したマクロが起動できない』(alliance)
シート上にコマンドボタンを作成し、同ブックのmodule1に記述したマクロ(呼び出し)を登録するコードを記述してWorkbook_Openイベントにて起動しています。
Workbook_BeforeCloseにてシート上のすべてのオートシェイプを削除しているため、起動のたびに作成、削除が繰り返される状況です。
何度か使用したところ、「"ファイルのフルパス"が見つかりません。移動、名前の変更、または削除された可能性があります」というエラーメッセージが表示、okをすると「"ファイルのフルパス"にアクセスできません。」というエラーメッセージが表示され、起動できませんでした。
コマンドボタンに登録されたマクロを確認するとファイルのフルパス!マクロ名となっており、データタブの接続に同ブックのリンクが張られており、別ブックのマクロが登録されていることになっていると推察されますが、解決方法がわかりません。
リンクを解除しコマンドボタンに同一のマクロを登録しても同様の現象が起こります。
コードを記述する場所をmodule1からthisworkbookに変更してみましたが特に変わらず、諦めて新規のブックから作成し直すと一時的に解決されますが、また同様の現象が発生し、根本的な解決に至りませんでした。
どうしたら解決出来るのかご教示頂きたいです。
以下にコマンドボタンを作成するコードを載せておきます。
Private Sub Workbook_Open()
With ThisWorkbook.Worksheets("表示用").Buttons.Add(200, 15, 200, 25.5)
.OnAction = "呼び出し"
.Characters.Text = "フォームを呼び出す"
.Placement = xlFreeFloating
.PrintObject = False
End With
End Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
それならば、以下のように自ブックのファイル名を明示するとどうなりますか?
.OnAction = "Book1.xlsm!呼び出し" (???) 2019/03/27(水) 11:07
ボタンを押すと何か処理した後に他ブックのマクロを呼び出したいのですよね。
そこの部分の記述がどうなっているか知りたいです。
(通りすがり) 2019/03/27(水) 11:19
こんにちは。
>Workbook_BeforeCloseにてシート上のすべてのオートシェイプを削除している このときに、ボタンだけ消さないようにすればいいのでは? (でれすけ) 2019/03/27(水) 11:23
ボタン以外のシェイプとは、例えばグラフの1要素だけで線を1つ使っているとか、膨大な数を利用していないでしょうか?
(???) 2019/03/27(水) 11:34
.OnAction = ThisWorkbook.FullName & "!呼び出し"
に変更してみましたがやはり外部参照になってしまいました。
呼び出しはユーザーフォームを呼び出すだけの処理です。
一応下記に記載します。
Sub 呼び出し()
UserForm1.Show (vbModeless)
End Sub
このときに、ボタンだけ消さないようにすればいいのでは?
そうですね!根本的に解決しないようでしたらそうしようと思います。
知識不足で恐縮なのですがコマンドボタンを作成しなおすのはバグ等の危険性が高いものなのでしょうか
他に考えられるのは、使用できるリソース数を使い切っていないか、という点です。 今ではどうか調べた事はないのですが、例えば2003以前の書式等の情報は4000個しかなく、古いものを消しても番号は詰まることはなく、4000番まで使い切ると、以降は着色等しようとするとエラーになっていました。 今は上限が上がったようですが、詰めないロジックのままであれば、いつかはリソース番号を使い切ってしまうのではないかと思います。 ボタン以外のシェイプとは、例えばグラフの1要素だけで線を1つ使っているとか、膨大な数を利用していないでしょうか?
そのようなことがあるのですね。勉強になります。
シェイプは膨大な数は使用していません。
(alliance) 2019/03/27(水) 11:37
With ThisWorkbook.Worksheets("表示用").Buttons.Add(200, 15, 200, 25.5) .OnAction = "呼び出し" .Characters.Text = "フォームを呼び出す" .Placement = xlFreeFloating .PrintObject = False End With End Sub ===module1=== Sub 呼び出し() UserForm1.Show (vbModeless) End Sub
ここまでは2016で普通に動きましたよ。
再現性あり。
(通りすがり) 2019/03/27(水) 11:56
なので、このボタン生成以外の部分に外部参照する原因があるかも?(セルのコピペが原因なら、値貼り付けに変えるとか)
(???) 2019/03/27(水) 11:59
通りすがりさん
ありがとうございます。
質問の際に書き忘れていましたが、ファイルはサーバー上にあります。
デスクトップ上で作成した際には問題なく動いていたのですが、サーバーに置いてからではうまくいきません。
後出しになってしまい申し訳ありません。
???さん
セルのコピペは心当たりがありますので、参考にして変更してみます。
(alliance) 2019/03/27(水) 12:09
>コマンドボタンを作成しなおすのはバグ等の危険性が高いものなのでしょうか
97の時から、ありました。 原因がよく解らないので、マクロで消すと不具合とういか何だったか覚えてないけど。 非表示にした方が・・・。 手動で消す分には問題は少なかったような。
>シェイプは膨大な数は使用していません。 実際、ブックに何かしらオブジェクト(ボタン等他グラフなども含む)が残っているとカウントはされ続けます。 リセットしたかったら、ブックから全てのオブジェクトを削除し上書き保存後再度開きなおす。
ボタンにマクロ登録するときに、マクロの保存先をどこにしてますか? マクロの保存先を、「作業中のブック」にしてないのでは・・・。(自ブック名ではない) たぶんこの辺の間違いで、ボタンの作成削除繰り返すようにしたのではないかと推測。 (BJ) 2019/03/27(水) 12:11
===ThisWorkbook===
Private Sub Workbook_Open() With ThisWorkbook.Worksheets("表示用").Buttons.Add(200, 15, 200, 25.5) .OnAction = "呼び出し" .Characters.Text = "フォームを呼び出す" .Placement = xlFreeFloating .PrintObject = False End With End Sub ===module1=== Sub 呼び出し() UserForm1.Show (vbModeless) End Sub ===UserForm1=== (何も配置されていないただの枠)
これを新規に作ってtest.xlsmで保存して起動してみて下さい。
それでも再現しますか?
(通りすがり) 2019/03/27(水) 13:37
BJさん
オブジェクト数の件ですが、閉じる前にすべてのオートシェイプを削除してますので、ご教示いただいた通りにリセットされていると思います。
ボタンのマクロ登録は自ブックにしています。デスクトップ上では問題なく動くことから登録時の間違いではないと思います。
通りすがりさん
ファイルサーバーです。
test.xlsmを新規で作成してみました。
デスクトップ上では問題なく動きましたが、ネットワークフォルダでは発生しました。
ステップインしてみるとマクロを登録した時にデータタブの接続にリンクが発生しています。
自ブックのマクロを登録しているのに、何故外部参照が発生するのでしょうか。
(alliance) 2019/03/27(水) 16:18
外部参照が発生したブックをコピー後、拡張子をZIPに変更。 ZIP解凍して、\xl\worksheets 下にあるXMLファイルから、リンクの編集で表示された外部参照文字列を探してみてください。 これが手掛かりにならないでしょうか。
なお、見つかった外部参照文字列を、実在するブックのフルパスやシート名、セル範囲に書き換え、ZIPに書き戻し、拡張子をxlsmに戻すと、「リンクの編集」からリンク解除できるようになるはずです。 ミスするとブックを壊しますので、必ずコピーを取って作業してください。
(???) 2019/03/27(水) 17:11
???さん
こんな方法もあるのですね・・・本当に勉強になります。
ご提案頂いた中でのリンク解除は問題なく出来ています。
サーバー上で発生したものをご教示いただいた通りに探してみました。恐らくこれでしょうか。
一応問題なく動いたデスクトップ上のものも同様に探してみました。
違いとしては位置の違いくらいでしょうか。
この[0]が曲者なのでしょうか。
おそらく"呼び出し"プロージャのあるファイルを指定しているのでしょうが、明示的に指定されていないことからファイルの保存場所によって動きが異なり、今回の現象を起こしているのではないかと推察します。
ちなみに、デスクトップ上で動いた方のxmlファイルをサーバー上のものに置き換えてみましたが、ファイルが破損していますとのエラー表示で開けませんでした。
(alliance) 2019/03/27(水) 17:58
.OnAction = ThisWorkbook.Name & "!" & "Module1.呼び出し" ブック名とモジュール名を明示してもだめですかね? https://blogs.yahoo.co.jp/bardiel_of_may/59424510.html
提示先の通りFullNameで試したら、逆にできなかった・・・ (稲葉) 2019/03/28(木) 15:49
通りすがりさん
実行してみましたが、だめでした。
アドインは現在入れておりません。
参照設定もVisual Basic For AppicationsとMicrosoft Excel 16.0 Object library、OLE Automation、Microsoft Office 16.0 Object Library、Microsoft Forms 2.0 Object Library の4つのみです。
(alliance) 2019/03/29(金) 10:36
なかなかお手上げ気味です。
===ThisWorkbook===
With ActiveSheet.Buttons.Add(1, 15, 200, 20)
.OnAction = "呼び出し"
.Characters.Text = "messageBOXを呼び出す"
End With
End Sub
===module1===
Sub 呼び出し()
MsgBox "AAA"
End Sub
ここまで簡素化してもダメですかねぇ。
(通りすがり) 2019/03/29(金) 11:41
もしかしたら、ネットワークフォルダのパス名が長すぎるということはないですか? パス名が256文字以上ないか確認してみてください。 (でれすけ) 2019/03/29(金) 12:07
ただ、必ず外部参照になる訳でもないようで、きっかけがよく判りません。 フルパス指定しても、Excelは保存時に、相対パスで書けそうなファイルは勝手に書き換えてしまうので、駄目でしょうね。
原因っぽいのは、Excelのオプションの中に、「他ブックへのリンクを更新する」とか「外部リンクの値を保存する」とかがデフォルトで有効になっているので、これが悪さをしているのかと思います。 自分だけならこれらをオフにしてしまうというのも考えられますが、他人にもこれを強制するのは良くないでしょう。(フルパスっぽいのを貼ると勝手にハイパーリンク化する、なんて機能も止まります)
なので、ボタンをActiveXのものに変えてしまうのはどうでしょうか。 ActiveXの方は必ずシートモジュールのプロシジャを使うので、外部参照とは無縁です。 これが一番すっきりするのではないかと思います。
(???) 2019/03/29(金) 14:06
新規ブックにてテストしているのでしょうか?? そうではなく、1度マクロで削除したことのあるファイルを使いまわしているのでしょうか?
もしくは、そのファイルを単純に別のフォルダに移動した場合の時は? (BJ) 2019/03/29(金) 14:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.