[[20180612155705]] 『一旦ファイルを保存後閉じて、再度ファイルを開い』(さとうだいごろう) ページの最後に飛ぶ

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

 

『一旦ファイルを保存後閉じて、再度ファイルを開いた際にコマンドボタンを押し、登録したイベント(クラスモジュールの内容)を実行できるようにしたい。』(さとうだいごろう)

ExccelVBAの下記プログラムについて、教えてください。最後のハードルが超えられません。どなたかお助けいただけないでしょうか。

下記のプログラムは1→2→3の順に実行し、しっかり動きます。
1.あるファイルのパスとファイル名を取得(標準モジュール1)
2.別のファイル上で1のファイルの名前とパスを入力し、コマンドボタンを作成及びイベントの登録(標準モジュール2)
3.コマンドボタンを押したときに1のファイルを開きたい。(クラスモジュールのイベント内容)
ただし、1回目はしっかり動くのですが、2回目に同じボタンを教えてもファイルが開かないのです。たぶんsetClass()のサブモジュールが1回しか実行されないからだと思いますが、2回目以降もボタンを押すだけでイベントが実行されるように。また、ファイルを一度閉じて再度開いて、ボタンを押したときにイベントを実行するにはどうすれば良いのでしょうか?
1.setClass()を常に有効にしておく方法
2.他の良い案等
どんなヒントでもいいのでご教示ください。困っています。

−−−−−標準モジュール1(任意のExcelブックAのファイル名とファイルパスを取得)−−−−−−

Public CurPath As String
Public FileName As String

Sub 現在のパスとファイル名を取得()

'アクティブファイル名を取得
FileName = ActiveWorkbook.Name

'アクティブファイルの絶対パスを取得
CurPath = ActiveWorkbook.Path

End Sub

−−−−−標準モジュール2(別の任意のExcelブックBファイルにコマンドボタンを貼り付けそのボタンを押したときにExcelAを開く)−−−−−−

Dim NewBtn As New Class1

Private Sub MakeCmdBtn()
Dim lRow As Long
lRow = ActiveCell.Row

'コマンドボタン作成
Dim NewCodBtn As CommandButton

Set NewCodBtn = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False).Object

With NewCodBtn
.Object.Caption = FileName
.Object.Font.Size = 10
.Object.BackColor = &H8000000F
.Width = ActiveCell.Width * 1
.Height = ActiveCell.Height * 1

End With

'ExcelBにExcelAのファイルパス、ファイル名を挿入する。
ActiveSheet.Range("T1").Value = FileName
ActiveSheet.Range("T2").Value = CurPath

End Sub

’作成したコマンドボタンにイベントを登録(最初に実行する標準モジュール1で指定したパスのファイルを開く)

Sub setClass()

Set NewBtn.button = ActiveSheet.OLEObjects("CommandButton1").Object

End Sub

Public WithEvents button As CommandButton

−−−−−−−−クラスモジュール(イベントの内容)−−−−−−−−

Private Sub button_Click()
Dim OpenPath As String
Dim OpenFile As String
OpenPath = ActiveSheet.Range("T2").Value
OpenFile = ActiveSheet.Range("T1").Value

'Excel上のセルのパス及びファイル名を参照し元ファイルを開く
Workbooks.Open OpenPath & "\" & OpenFile

End Sub

< 使用 Excel:Excel2016、使用 OS:Windows7 >


 クラス作成の勉強をされているのでしたら。他の詳しい方の回答を
お待ちください。動けばいいや^^
でしたら。
わたしなら、アクティブXのコマンドボタンを先にシートに配置後、コードーの表示で
当該シートモジュールに自動作成されるイベントをつかいます。
もしくはコードで作成するなら扱いやすいフォームコントロールにし
Actionプロパティに実行マクロを指定します。
お役に立たないかもですが何かの参考まで m(_ _)m
試してません。間違っていましたらお許しを

 ^^;;;
(隠居じーさん) 2018/06/12(火) 16:52

 何回か読みましたけど、よく分かりません。

 >1.あるファイルのパスとファイル名を取得(標準モジュール1) 

 「あるファイル」と言ってますが、コードではActiveWorkbookですよね?
 「ある」と言うのは作り話(=本当のコードじゃない)ですか?

 >2.別のファイル上で1のファイルの名前とパスを入力し、
 >コマンドボタンを作成及びイベントの登録(標準モジュール2) 

 その別のファイルに「標準モジュール1,2、Class1のコード」が書かれているのですか?

 >1回目はしっかり動くのですが、2回目に同じボタンを教えてもファイルが開かないのです。

 2回目が開かないと言うのが腑に落ちないですねぇ・・
 ・・グローバル変数なので何かの拍子にクリアされるってことはありますけど・・

 1回目も2回目も同じファイル名ですか?
  
 コードはそう見えるんですけど、同じだったら、2重オープンになっちゃいますよね?

 Class1のコードも作り話なんですか?

 >ファイルを一度閉じて再度開いて、
 >ボタンを押したときにイベントを実行するにはどうすれば良いのでしょうか? 

 ブックのオープンイベントにもsetClassを書いて置けばいいんじゃないですか?

 そもそも、何故ボタンを自動で作成する必要があるのかもよ分からないです。
 初めから手動で作って置けば済みそうなものです。

 多分、下記ブックの関係が明確だと、こちらの理解が進むのかも知れません。
  開きたいブック(一つなのか、複数なのか)
  マクロがあるブック
  ボタンを乗せるブック(一つなのか、複数なのか)

(半平太) 2018/06/12(火) 18:02


ご返信ありがとうございます。あるファイルと表現したのは、最終的にはこのプログラムをアドインでExcelに追加して、ショーカット等に割り当て、どのファイルを開いたときにもコピー元ファイルのパスとファイル名を取得し、コピー先ファイルにボタンを配置し、そのボタンを押したときに元のファイルを開くツールを作成したいのです。

1回目のコピー先ファイル、コピー元ファイルを開くのはあくまで、ボタンにコピー元ファイルのパスとファイル名を記憶させる操作です。(リンク付けとでもいえばいいでしょうか?)

やりたいことは、1回目の操作を行った後(リンク付け後)に、コピー元ファイルを開かず、コピー先ファイルのボタンを押したら、コピー元のファイルが開くようにしたいのです。(半平太様の言うように同じタイミングでやれば当然2重オープンになります。後日、ほかの人がボタンをおして、ファイルを開くことを想定しています)

引き続き助言をお願いいたします。
(だいごろう) 2018/06/13(水) 00:14


 >>2.他の良い案等
 良い案かどうかはわかりませんが。 ^^
1.実行予定マクロを作成しエクスポートで保存
 2.作業BOOK、(BATファイルの様な。。。^^;)を作成
 3.その作業BOOKから 自動実行で新規BOOK(実際に使用する分)作成
 4.新規BOOKにマクロを書き戻し保存
 5.作業BOOKを自分で閉じる
Excel様のショートカットのコマンドの後ろにこの作業BOOKをパラメータ指定で
常にこの作業ファイルを開くようにする。
わたしはこの方法でここのボードに表示される表などを分割してセル毎に格納するマクロ
とか、シート操作とかボタン操作マクロなど用意出来たBOOKを作っています。
BOOK1の替わりですね ^^
そんなの、必要ないよ! でしたら お許しを 
でわ
m(__)m
(隠居じーさん) 2018/06/13(水) 09:16

 1.アドインブックのコードを次の様に変更する。

 >Sub setClass() 
 >    Set NewBtn.button = ActiveSheet.OLEObjects("CommandButton1").Object 
 >End Sub 

  ↓ へ変更

 Sub setClass()
     On Error Resume Next
         Set NewBtn.button = ActiveSheet.OLEObjects("CommandButton1").Object
     On Error GoTo 0
 End Sub

 2.アドインブックのThisWorkbookモジュールに以下のコードを貼り付ける。

 Public WithEvents App As Application

 Private Sub Workbook_Open()
     Set App = Application
     setClass
 End Sub

 Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
     setClass
 End Sub

 '※ グローバル変数(buttonと上記App)は何かの拍子に勝手にクリアーされるので
    強制的にWorkbook_Openを実行する手段も別途作って置く方が無難。

(半平太) 2018/06/13(水) 11:29


 ひとつ確認。毎回「プログラムは1→2→3の順に実行」されるのでしょうか。

(2u) 2018/06/13(水) 18:54


2u様へ
プログラムは1回目は1→2→3ですが、2回目は3のみになります。
そのため、1のファイル名とパスを直接セルに記載するようにしています。
また、ボタンの作成は2で作成後、ファイルが保存されている場合を想定しています。

半平太様へ
ご回答ありがとうございます。教えてもらったコードでできるか試してみます。
(さとうだいごろう) 2018/06/14(木) 09:01


コメント返信:

[ 一覧(最新更新順) ]


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