Excel (VBA) |
![]() ![]() |
(Windows 10全般 : Excel 2019)
外部リンクを発生させない方法
投稿日時: 23/09/24 23:10:30
投稿者: たっくんプードル
|
---|---|
1.毎営業日、1ブック1シートで集計表(データベース)を作っています。
|
![]() |
投稿日時: 23/09/25 06:40:32
投稿者: WinArrow
|
---|---|
これはエラーではなくアラームです。
|
![]() |
投稿日時: 23/09/25 09:44:08
投稿者: WinArrow
|
---|---|
初めに
|
![]() |
投稿日時: 23/09/25 10:55:00
投稿者: higejee
|
---|---|
たっくんプードル さんの引用: ということは集計用新規ブックにコピーされたすべての営業日別シートには同じマクロボタンがあるということ。ただし登録されているマクロは各営業日のブック(つまり外部ソース)のものだから、ワーニングが出て当然です。 新規ブックに集計した時点でマクロボタン自体が不要であれば、全シートのマクロボタンを削除してから保存すればよいかと。 |
![]() |
投稿日時: 23/09/25 12:31:57
投稿者: WinArrow
|
---|---|
そうか・・・・マクロがありましたね・・・・
|
![]() |
投稿日時: 23/09/25 23:28:23
投稿者: たっくんプードル
|
---|---|
WinArrow さんの引用: セル内の可能性は確認しましたのでないはずです。文字列内に「!」が含まれていないか、名前の定義、条件付き書式等、外部参照の可能性がある場所は検索しました。 プロシージャ内しか考えられない、という結論に至っています。 |
![]() |
投稿日時: 23/09/25 23:41:56
投稿者: たっくんプードル
|
---|---|
WinArrow さんの引用: (1)毎営業日のブックは単純な入力&集計表(最終行に合計がある)です。 主なフィールド・・・[項目][単価][件数][単価*件数] (質問に記載の1.のとおり) 次の日は、前日のブックをコピーして新規作成し、入力していきます。(毎日繰り返し) (質問に記載の2.のとおり) (2)翌月初めに集計用の月締めブック内には、前月毎営業日(1-31日)のブックを順に開いて、シートごとコピーしてくる、というマクロがあります。 (質問に記載の3.4.のとおり) |
![]() |
投稿日時: 23/09/25 23:59:10
投稿者: たっくんプードル
|
---|---|
higejee さんの引用: 複写してきたシートには、もともとのマクロボタンがそのままあるのは、おっしゃるとおりです。また、マクロ自体が元ブックに依存しているので、ワーニングが出て当然なのも、おっしゃるとおりです。 ですが、このマクロボタンは、集計表のオートフィルタによる抽出を楽にするために設けたボタンなので、月締め集計ブックに複写してきた後もボタンは必要なので、消すわけにはいかないのです。 ですので、今回の質問に至った次第です。 想定される解決法として思いつくのは、 1.日々の毎営業日用シートのマクロボタンに割り当てられたプロシージャを、シートが別ブックにコピーされても影響されないような書き方にする。 2.月締め集計ブックに複写された後、このブック内に複写された全シート内の外部リンクとなった部分を書き換える。 くらいかな、と想定はするものの具体的にどうプロシージャを記述するかまでは思いつけません・・・ |
![]() |
投稿日時: 23/09/26 08:25:23
投稿者: higejee
|
---|---|
たっくんプードル さんの引用: であるなら たっくんプードル さんの引用: ということが無意味(というか不可能)だと理解できるかと思います。なぜならボタンマクロ登録されたプロシージャ名には元のブック名がひっついてますから。 ボタン自体を消したくないなら集計用ブックに同じ処理を行うプロシージャを用意して、OnAction でボタンのマクロ登録を変更すればよいと思います。 |
![]() |
投稿日時: 23/09/26 09:31:05
投稿者: simple
|
---|---|
要するに、ボタンに登録されたマクロがリンクされている実体ですね?
Sub test() Dim linksource As Variant For Each linksource In ThisWorkbook.LinkSources ThisWorkbook.ChangeLink Name:=linksource, _ NewName:=ThisWorkbook.Name, _ Type:=xlExcelLinks Next End Sub # 個人的には、ボタンに登録されたマクロを使う機会が無いような気がしないでもありません。 |
![]() |
投稿日時: 23/09/26 10:01:48
投稿者: WinArrow
|
---|---|
私見です。
|
![]() |
投稿日時: 23/09/26 13:02:03
投稿者: WinArrow
|
---|---|
>月締め集計ブックに複写してきた後もボタンは必要なので、消すわけにはいかないのです。
|
![]() |
投稿日時: 23/09/26 13:28:47
投稿者: WinArrow
|
---|---|
>2番目以降は、いままでシートを複写すればよいです。
|
![]() |
投稿日時: 23/09/26 17:08:53
投稿者: WinArrow
|
---|---|
WinArrow さんの引用: 代案 元ブックを一時的にシートを1つ増やして、 シート複写ではなく、シート移動にすれば、外部リンクにはなりません。 元ブックは、上書き保存しないで閉じれば、よいでしょう。 |
![]() |
投稿日時: 23/09/27 11:21:17
投稿者: simple
|
---|---|
先日の投稿内容について補足します。
たっくんプードル さんの引用:このうち、2番目の方法に対応するマクロを提案しました。 なお、このコードのイメージを示すと、 「データ」 − 「リンクの編集」から入って、「リンク元の変更」を使って、 すべてのリンク先を、自分自身に変更する動作、をマクロにしたものです。 こちらで動作を確認してから投稿しています。そちらでも試してみてください。 なお、普通の使い方であれば、カレントフォルダ内に集計ブックがあると思うので、 提案どおりのコード(リンク先を ThisWorkbook.Name に変更)でOKなはずです。 もしそうでないこともあるとすれば、 ThisWorkbook.Nameに代えてThisWorkbook.Path とすれば安全ではあるでしょう。 (ただし、ThisWorkbook.Pathを使う場合、集計ブックがいったん保存されていることが前提です) |
![]() |
投稿日時: 23/09/28 09:01:42
投稿者: WinArrow
|
---|---|
各営業日ブックと集計用ブックの両方に同一マクロが登録される
|
![]() |
投稿日時: 23/10/05 23:54:09
投稿者: たっくんプードル
|
---|---|
higejee さんの引用: やはり元のブック名がひっついてくるのは不可避なのですかね。 であれば私の仮説どおり、シートを複写してきてからボタンのマクロ登録を変更するのがよいのですね。 しかし、残念ながらOnActionをまだ理解していないので、これから勉強します。ありがとうございます! |
![]() |
投稿日時: 23/10/06 00:15:33
投稿者: たっくんプードル
|
---|---|
simple さんの引用: ご質問についてはお見込みのとおりです。 そうであれば、私の仮説でも申し上げましたが、シートを複写してきてから、リンク元を付け替える処理を付け加える、という手法がよさそうなのですね。 ただ、For Each 〜 Next構文の中の部分が見たことがないキーワードなので、これから勉強してみますが、いったんこのプロシージャで挙動を確認させていただきます。 なお、ボタンに登録されたマクロを使う機会は100%ありますので悪しからず。。。 |
![]() |
投稿日時: 23/10/06 22:10:28
投稿者: WinArrow
|
---|---|
>シートを複写してきてから、リンク元を付け替える処理を付け加える、という手法がよさそうなのですね。
|
![]() |
投稿日時: 23/10/07 23:54:32
投稿者: たっくんプードル
|
---|---|
WinArrow さんの引用: 質問4.に記載したとおり、毎営業日ファイル&集計用ファイルが保存されているフォルダの中から前月の毎営業日ファイルを探して、一つずつ開いて、シートをコピーし、ファイルを閉じ、また次の日のファイルを開いて・・・という作業をマクロ化しています。 この作業を ・営業日ファイルを開く ・新規シートを1枚増やす ・目的シートを集計用ファイルに移動する ・営業日ファイルを上書き保存せず閉じる ・次の日のファイルを開く・・・・・・・ と書き換えるということでしょうか? |
![]() |
投稿日時: 23/10/08 07:42:10
投稿者: simple
|
---|---|
質問時の前提に沿った回答をしているわけですから、
Sub test() Dim linksource As Variant For Each linksource In ThisWorkbook.LinkSources ThisWorkbook.ChangeLink Name:=linksource, _ NewName:=ThisWorkbook.Name, _ Type:=xlExcelLinks Next End Sub集計用ブックは一旦保存してからマクロを実行してください。 |
![]() |
投稿日時: 23/10/08 09:08:16
投稿者: WinArrow
|
---|---|
引用: その通りです。 但し、最初に、「新しいブック」を用意するのではなく、 1回だけ「1つの営業日ファイルを開く」を追加することです。 これは、マクロを取込むためのお措置です。 その後、ソートを複写すのではなく、「移動」します。 これ(移動)に伴い「リンク情報」は消えます。 しかし、1つしか存在しないシートは移動できないので、事前に一時的にダミーシートを作成します。 複写元は、は、上書き保存せずに閉じます。 この操作を、4のマクロに組み込みます。 |
![]() |
投稿日時: 23/10/08 09:54:23
投稿者: Moko
|
---|---|
higejee さんの引用:同意見です。 たっくんプードル さんの引用: 新規シートを増やさず シートをコピーしたあとに、そのシートのボタンの「マクロの登録」を続けて 行うのが簡単でしょう。 だいたいこんな流れになるでしょう。 Dim wb As Workbook Set wb = Workbooks.Open("C:\Users\aaa\bbb\20230901.xlsm") wb.Sheets(1).Copy Before:=ThisWorkbook.Worksheets(1) ActiveSheet.Buttons("ボタン 1").OnAction = "マクロ1" wb.Close False |
![]() |
投稿日時: 23/10/08 10:44:46
投稿者: simple
|
---|---|
皆さん自分のが正しいと主張しているようですけど、色々なやり方があるんですよ。
|
![]() |
投稿日時: 23/10/08 11:01:06
投稿者: WinArrow
|
---|---|
>4.の作業はマクロで自動化しています
|
![]() |
投稿日時: 23/10/22 00:49:32
投稿者: たっくんプードル
|
---|---|
simple さんの引用: ありがとうございました。図形(フォームコントロール)のコピーの際、別の問題等が発生し手こずっていましたので時間がかかり申し訳ありませんでしたが、ついに問題が解決しました。 仕事のファイルなのでなかなかじっくり時間を取れず、少しずつしか前進できませんでしたが勉強になりました。 |
![]() |
投稿日時: 23/10/22 00:57:50
投稿者: たっくんプードル
|
---|---|
higejee さんの引用: ありがとうございました。最終的には、月締め集計ブックに、毎営業日ファイルのフォームボタンに割り当てているプロシージャをコピーしておくこととし、シート複写後、OnActionでプロシージャを自ブック内のプロシージャに付け替える手法に落ち着きました。 仕事のファイルなのでなかなかじっくり時間を取れず、少しずつしか前進できませんでしたが勉強になりました。 |
![]() |
投稿日時: 23/10/22 01:02:56
投稿者: たっくんプードル
|
---|---|
Moko さんの引用: 最終的には、こちらのコードを自分の環境に合わせて少し修正して採用させていただきました。なぜなら、もう一つ別ボタンがあり、逆にこのボタンからプロシージャを削除したいという希望がありましたので、続けてOnAction = ""で簡単に消せるからです。 本当にありがとうございました。少しづつですが勉強になりました。 |
![]() |
投稿日時: 23/10/22 01:08:23
投稿者: たっくんプードル
|
---|---|
WinArrow さんの引用: ありがとうございました。ご教示していただいた方法も試し、ついに問題が解決しました。皆様の手法をひとつひとつ検証しながらで時間がかかってしまい申し訳ありませんでした。 |