[[20190327095328]] 『コマンドボタンに設定したマクロが起動できない』(alliance) ページの最後に飛ぶ

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

 

『コマンドボタンに設定したマクロが起動できない』(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

Sub 呼び出し()
End Sub
の中身が見たいですね。

ボタンを押すと何か処理した後に他ブックのマクロを呼び出したいのですよね。
そこの部分の記述がどうなっているか知りたいです。
(通りすがり) 2019/03/27(水) 11:19


 こんにちは。

 >Workbook_BeforeCloseにてシート上のすべてのオートシェイプを削除している
 このときに、ボタンだけ消さないようにすればいいのでは?
(でれすけ) 2019/03/27(水) 11:23

他に考えられるのは、使用できるリソース数を使い切っていないか、という点です。 今ではどうか調べた事はないのですが、例えば2003以前の書式等の情報は4000個しかなく、古いものを消しても番号は詰まることはなく、4000番まで使い切ると、以降は着色等しようとするとエラーになっていました。 今は上限が上がったようですが、詰めないロジックのままであれば、いつかはリソース番号を使い切ってしまうのではないかと思います。

ボタン以外のシェイプとは、例えばグラフの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


===Workbook===
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

ここまでは2016で普通に動きましたよ。
再現性あり。
(通りすがり) 2019/03/27(水) 11:56


1回実行すると、オブジェクトを何千個、何万個と生成しているなら、先に書いた問題が発生する可能性が考えられますが、ボタン1つくらいなら、普通は全然平気です。 閉じる際にオブジェクト削除し、直後に終了というのが、少し気になるところですが、それならオブジェクトの配置エラーとかになって、起動時にエラーメッセージが表示されそう。

なので、このボタン生成以外の部分に外部参照する原因があるかも?(セルのコピペが原因なら、値貼り付けに変えるとか)
(???) 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


・xmlの文字コードに注意
・ZIPに戻すときはルートフォルダ指定はダメ。フォルダの中の複数のファイルに対してZIP圧縮しないと破損していますとなる。
(ななし) 2019/03/28(木) 13:41

 .OnAction = ThisWorkbook.Name & "!" & "Module1.呼び出し"
 ブック名とモジュール名を明示してもだめですかね?
https://blogs.yahoo.co.jp/bardiel_of_may/59424510.html

 提示先の通りFullNameで試したら、逆にできなかった・・・
(稲葉) 2019/03/28(木) 15:49

なんかおかしいですね。外部呼出しをしていないはずですが。
アドインなどの、他のマクロが別途動いていたりしてません?
参照設定を確認したい所ですが、
まずは関数名「呼び出し()」を誰にも想像できないヘンテコな長い名前に付け替えて
test.xlamを保存&実行してみて下さい。
(通りすがり) 2019/03/29(金) 10:04

通りすがりさん

実行してみましたが、だめでした。

アドインは現在入れておりません。

参照設定も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

浅い階層でも、ネットワーク上にブックを置いて実行し、再現しましたね。 フォームすら使わず、ボタンを押したときの動作はMsgBoxで代用したくらい、シンプルなブックでしたが。

ただ、必ず外部参照になる訳でもないようで、きっかけがよく判りません。 フルパス指定しても、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.