[[20210715103950]] 『別ブックのセルが変わったときに計算式をしたい』(難問) ページの最後に飛ぶ

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

 

『別ブックのセルが変わったときに計算式をしたい』(難問)

よろしくお願いします。

はじめに、上手に伝えれる自信がないので予めご了承ください。

メインのブック(以下、「ブック1」という)があり、もう1つソフトから出力されるブック(以下、「ブック2」)があります。

ブック2の欲しいデータだけを編集するためにVBAを使って整理しようとしているのですが、ブック2のセルが変わった時にマクロを起動させることは可能でしょうか?ちなみにブック2はデータのみでマクロなど一切ないxlxsデータです。
色々検索してみたのですが、全然ヒットしませんでした。
ブック2のセルL1がchangeした時に、ブック2のセルL2にブック2のC2から最終行の数字の合計を出したいのです。
ブック2のL1セルにはリストボックスを設置するマクロは登録はしたのですが、L1が変更したときに計算させる方法がわかりません。

まず、別ブックにVBAコードが記述できるのか?
別ブックのセルが変更時にメインブックから起動できるのか?

説明が下手で申し訳ありません。

どなたかご教授お願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 希望することは無理なので、代替案を考える必要があります。

 なぜ無理なのか?
  => ブック2は、別のソフトから出力されるので、そのときExcelは起動していないから

 代替案は?
 
 (1) 定期的に時間を決めて(毎日何時)とか、マクロを動かしてブック1を更新する 難度中
 (2) フォルダを監視してブック2が更新されたタイミングで、ブック1を更新する   難度高
 (3) ブック1を開く度に、ブック2も同時に開いて更新する             難度低〜中
(´・ω・`) 2021/07/15(木) 11:24

まずブック1に「ブック2に変更があった場合マクロを実行」というものをブック1単独で行うことは不可能です(私が知らないだけで方法があったらすみません)
通常はシートに変更があった場合のマクロはブック(もしくはその中のシート)のChangeイベントで実行させるため「ブック2の変更があった場合マクロを実行」と言うものは前提条件としてブック2もマクロ有効ブックとして保存されていることが必要不可欠だと思われます。

上記前提としてお答えします。
>まず、別ブックにVBAコードが記述できるのか?
条件はありますが可能です。
要はブック2のChangeイベントにブック1のマクロを呼び出すコードだけ記入しブック1にメインのコードを記入すればいいのです。

>別ブックのセルが変更時にメインブックから起動できるのか?
不可能です。
ブック1単独でブック2に変更があったかどうか知るすべがありません。
(ブック1にブック2の状態を常に監視するマクロを常駐させればできないこともないでしょうが現実的ではないでしょう)
(砂糖) 2021/07/15(木) 11:25


すいません。説明不足でした。

ブック1にて、ソフトから出力されエクセルデータのブック2を開きいらない列やセルを消去するマクロは作成しました。(初心者なのでマクロの記憶を使用しているのでコードはいらないものがいっぱいですが。。。)

そしてリストボックスを作成しその中のリストもブック1を起動するとできるようにしてあります。

両方のブックが開いていたら可能でしょうか?

(難問) 2021/07/15(木) 11:42


 >ブック2のセルが変わった時にマクロを起動させることは可能でしょうか?

何を見たら、「変わった」とわかるでしょうか。
「変わった」ではなく、

「新しいブックが作られた時にマクロで、
必要なデータを取り込みたい。」ではないのでしょうか?

(まっつわん) 2021/07/15(木) 11:54


というか、

「マクロのあるブックを開いたときに、未取得のブックのデータを取り込みたい。」

というのが、現実的な気がします。
(まっつわん) 2021/07/15(木) 11:56


 前提条件を整理してもらえませんか?

 確認ですが、
 ・ブック2はソフトから出力される(ので、マクロは仕込めない)
 ・ソフトがブック2を書き換えた時にマクロを実行したいわけではない。
 ・マクロを実行するのは、ブック2のセルL1が変更した時
 ・ブック2のL1を変更するのは、手作業である。 

 この認識でいいですか?
(´・ω・`) 2021/07/15(木) 12:35

(´・ω・`)さん返信ありがとうございます。
その認識であっています。説明下手で申し訳ございません。

まっつわんさん返信ありがとうございます。
日本語って難しいですね。。とらえ方で考え方が変わってくるようにみえます。
もう少し調べて簡単な考え方があるのかもしれません
(難問) 2021/07/15(木) 13:37


 >その認識であっています
 であれば、

 ・ブック2はソフトから出力される(ので、マクロは仕込めない)
 ・ソフトがブック2を書き換えた時にマクロを実行したいわけではない。
 ・マクロを実行するのは、ブック2のセルL1が変更した時
 ・ブック2のL1を変更するのは、手作業である。 
 ・ブック1、ブック2とも開いている状態
 という条件の下で、

  ブック2のL1が変更されたときに、ブック1のマクロを実行し、ブック2のL2セルの値を更新すること
  は可能です。  
(´・ω・`) 2021/07/15(木) 14:22

(´・ω・`)さん返信ありがとうございます。

今、手動でブック1のマクロで変更するようにはできました。

ブック2にはマクロがないのにどうやってセルを更新するんですか?やはり、ボタンにマクロを登録して
ポチッと押す感じですか?
それとも、changeイベントで可能なのですか?

ヒントをお願いします
(難問) 2021/07/15(木) 15:50


ブック2のL2セルをブック1にリンク参照して値が変われば
処理がはしるようにマクロ組めばよさそうですがそれではだめですか?
(no_name) 2021/07/15(木) 16:05

no_nameさん返信ありがとうございます。

それは、ソフトから抽出されたデータを1度開いてリンク参照させて編集するという意味でしょうか?

今考えているのは、ソフトから抽出されたエクセルデータ(編集もせずにそのままの状態)を
メインのブック1のボタンを押すと開いた瞬間に行と列を削除したりリストボックスを登録
して表示したいのです。
そして、ブック2のL1セルを変更すればchangeイベントが発生して実行するという流れが
理想です。

可能ならばヒントが欲しいです。あと、不可能ならどうすればよいのかアドバイスを
お願いします

(難問) 2021/07/15(木) 16:17


 こんな感じです。

 '--------ブック1の標準モジュール-------------------   
    Sub setwb()
     ' CommandButtonにこのマクロを割り当てる。
     ' ブック2を閉じた状態で、これを最初に実行する。ブック2が開いたら準備OK
       Set ThisWorkbook.wb = Workbooks.Open("D:\test\ブック2.xlsx")
    End Sub

 '--------ブック1のThisWorkBookモジュール-------------------
    Private WithEvents wb As Workbook

    Private Sub wb_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      If Not wb.Worksheets("Sheet1") Is Sh Then Exit Sub
      Set Target = Intersect(Target, wb.Worksheets("Sheet1").Range("L1"))
      If Target Is Nothing Then Exit Sub

      MsgBox Target.Address(External:=True) & "が変更されました"
    End Sub
(´・ω・`) 2021/07/15(木) 16:44

先ほどからトライしているのですが、
「コンパイルエラー  メソッドまたはデータメンバーがみつかりません」と表示され
前にすすみません。

新規にデスクトップ上に「ブック1」と「ブック2」を作成し、コードをコピペ
してコマンドボタンに登録したのですが

「Set ThisWorkbook.wb」の「.wb」部分で黄色くなってメッセージが出ます。

なぜでしょうか?

(難問) 2021/07/16(金) 10:43


 ごめんなさい

  '--------ブック1のThisWorkBookモジュール-------------------
    Public WithEvents wb As Workbook
    ↑ Private から Public に修正してください。 
(´・ω・`) 2021/07/16(金) 10:47

(´・ω・`)さんできました!!
ありがとうございます。

ちなみになんですが、L1セルが変更されたらN1セルを計算したい場合は
どこにコードを記述したらよいでしょうか?

(難問) 2021/07/16(金) 11:16


すいません。

Callで呼び出したらすんなりできました。

ありがとうございました。
(難問) 2021/07/16(金) 11:39


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.