Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13258 / 13644 ツリー ←次へ | 前へ→

【5899】アドインに登録したコードでWORKSHEET_Change イベントを作成したい。 B-BOSS 03/6/7(土) 10:07 質問
【5902】Re:アドインに登録したコードでWORKSHEET_C... ichinose 03/6/7(土) 11:59 回答
【5903】訂正 ichinose 03/6/7(土) 12:07 回答
【5908】Re:訂正 B-BOSS 03/6/7(土) 15:06 質問
【5909】Re:訂正 ichinose 03/6/7(土) 17:52 回答
【5917】Re:訂正 B-BOSS 03/6/9(月) 14:26 お礼
【5922】Re:訂正 B-BOSS 03/6/9(月) 17:26 質問
【5928】Re:訂正 ichinose 03/6/9(月) 22:50 回答
【6310】Re:訂正 B-BOSS 03/6/23(月) 16:47 お礼

【5899】アドインに登録したコードでWORKSHEET_Ch...
質問  B-BOSS  - 03/6/7(土) 10:07 -

引用なし
パスワード
   アドインに登録したコードで
現在アクティブなワークシートに対し、WORKSHEET_Change イベントを
作成する様なコードを書きたいのですが、可能でしょうか?

【5902】Re:アドインに登録したコードでWORKSHEET...
回答  ichinose  - 03/6/7(土) 11:59 -

引用なし
パスワード
   ▼B-BOSS さん:
こんにちは。
>アドインに登録したコードで
>現在アクティブなワークシートに対し、WORKSHEET_Change イベントを
>作成する様なコードを書きたいのですが、可能でしょうか?
クラスモジュールを使用すると、可能です。
アドインにクラスモジュールを追加してください(既定の名前のClass1とします)。
クラスモジュールに、
'=======================================================
  Public WithEvents app As Application
  Private WithEvents acc_bk As Workbook
'========================================================
Private Sub acc_bk_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox "ブック: " & acc_bk.Name & "-シート: " & Sh.Name & "-:セル: " _
    & Target.Address & " が変更されました"
'ここにコードを書きます
End Sub
'=====================================================
Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
  Set acc_bk = Wb
End Sub
'=====================================================
Private Sub Class_Initialize()
  Set app = Application
  Set acc_bk = ActiveWorkbook
End Sub

次にアドインのThisworkbookモジュールに
'======================================================
  Public app_ev As Class1
Private Sub Workbook_Open()
  Set app_ev = New Class1
End Sub

簡単なテストのみしかしていませんが、確認してください。

【5903】訂正
回答  ichinose  - 03/6/7(土) 12:07 -

引用なし
パスワード
   ▼ichinose さん:
>▼B-BOSS さん:
>こんにちは。
>>アドインに登録したコードで
>>現在アクティブなワークシートに対し、WORKSHEET_Change イベントを
>>作成する様なコードを書きたいのですが、可能でしょうか?
>クラスモジュールを使用すると、可能です。
>アドインにクラスモジュールを追加してください(既定の名前のClass1とします)。
>クラスモジュールに、
>'=======================================================
>  Public WithEvents app As Application
>  Private WithEvents acc_bk As Workbook
>'========================================================
>Private Sub acc_bk_SheetChange(ByVal Sh As Object, ByVal Target As Range)
>  MsgBox "ブック: " & acc_bk.Name & "-シート: " & Sh.Name & "-:セル: " _
>    & Target.Address & " が変更されました"
>'ここにコードを書きます
>End Sub
>'=====================================================
>Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
>  Set acc_bk = Wb
>End Sub
>'=====================================================
>Private Sub Class_Initialize()
>  Set app = Application
>  Set acc_bk = ActiveWorkbook
>End Sub
>
>次にアドインのThisworkbookモジュールに
>'======================================================
  private app_ev As Class1
'↑に変更してください
>Private Sub Workbook_Open()
>  Set app_ev = New Class1
>End Sub
>
>簡単なテストのみしかしていませんが、確認してください。

【5908】Re:訂正
質問  B-BOSS  - 03/6/7(土) 15:06 -

引用なし
パスワード
   ありがとうございました。
しかし、私の説明が不足だったので、チョット問題が発生しています。
そこで、再度質問させて下さい。

 現在、私が検討しているのは、次の内容です。
現在既にアドインに登録してある内容のコードがあります。
 内容は簡単な物で行を追加したり、又削除したり、文字列を
入力したりするものです。
つまり、ワークシートのスタイルに変更を与える物です。

 そしてその変更が完了してから、そのシート(又はブック)に
WORKSHEET_Change イベント を作成したいのです。

ichinoseさんに教えていただいたコードでは、いきなり
クラスのモジュールが動作してしまいました。

 良い方法があれば教えて下さい。

【5909】Re:訂正
回答  ichinose  - 03/6/7(土) 17:52 -

引用なし
パスワード
   ▼B-BOSS さん:
こんにちは。

>ichinoseさんに教えていただいたコードでは、いきなり
>クラスのモジュールが動作してしまいました。

そうなるようにしたつもりです・・・。

> 現在、私が検討しているのは、次の内容です。
>現在既にアドインに登録してある内容のコードがあります。
> 内容は簡単な物で行を追加したり、又削除したり、文字列を
>入力したりするものです。
>つまり、ワークシートのスタイルに変更を与える物です。
> そしてその変更が完了してから、そのシート(又はブック)に
>WORKSHEET_Change イベント を作成したいのです。
考え方としては、

  Set acc_bk = Wb(ブックのオブジェクトという意味で)

のコードをどこで実行させるかという問題だと思いますが、
既に作成してあるコードでは「ワークシートのスタイルに変更」をしているとのこと、
コード内では、対象ブックが特定できますよね(Activeworkbookかもしれません、あるいは、Workbooks("xxx")という指定が可能なのかもしれません)。

そのプロシジャーが書かれているモジュールで、
'========================================
  Private app_ev As Class1
'========================================
Private Sub アドインプロシジャー()
' 既に作成されているコード
'    ・
'    ・
'    ・
  Set app_ev = New Class1
'    ↑当初考えていたものと違ってきていますから、変数名は変えてください
'    尚、このSetは、一度だけでよいと思いますが(どこか他のところ
'     で例えばWorkbook_Open)、全体が見えないのでとりあえずここで設定。
  Set app_ev.acc_bk = ActiveWorkbook
'              ↑イベントを発生させたいブックを指定する
End Sub

クラスモジュールでは、
'====================================================
Public WithEvents acc_bk As Workbook
'↑今度は、クラス外からも設定できるようにPublicで宣言
'====================================================
Private Sub acc_bk_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox "ブック: " & acc_bk.Name & "-シート: " & Sh.Name & "-:セル: " _
    & Target.Address & " が変更されました"
End Sub

とすると、アドインブログラムの実行後に指定したブックでChangeイベントが可能になるかと思いますが・・・。

【5917】Re:訂正
お礼  B-BOSS  - 03/6/9(月) 14:26 -

引用なし
パスワード
    ありがとうございました。
初心者な者で、私の質問の仕方が悪くて御迷惑かけました。
しかし、おかげさまでうまくいきました。

理屈は良く分からないけど・・・。
これから、勉強してなぜうまくいったのか確認していきます。

どうもありがとうございました。


              − B-BOSS −

【5922】Re:訂正
質問  B-BOSS  - 03/6/9(月) 17:26 -

引用なし
パスワード
    何度も申し訳ありません。
実はうまくいって喜んでいたのですが、
マクロを実行した後、そのワークブックを名前を付けて保存しました。
その後、再度開いた所、WORKSHEET_Change イベントのイベントは
実行されませんでした。
WORKSHEET_Change イベントも一緒に保存はできるのでしょうか?
何回にも分けて質問して申し訳ありません。
 解れば教えて下さい。

   すいません。宜しくお願いします。

【5928】Re:訂正
回答  ichinose  - 03/6/9(月) 22:50 -

引用なし
パスワード
   ▼B-BOSS さん:
こんばんは。

>実はうまくいって喜んでいたのですが、
>マクロを実行した後、そのワークブックを名前を付けて保存しました。
>その後、再度開いた所、WORKSHEET_Change イベントのイベントは
>実行されませんでした。
>WORKSHEET_Change イベントも一緒に保存はできるのでしょうか?

アドインのクラスモジュールを使用していますので、保存したブックにはコードは
書かれていません・・・。
コードを付けて保存したいと言うことなら、全く別のコードになってしまいます。

Vbprojectを操作しますが、私もあまり詳しくないし、プログラム編集用にしか使ってないのですが(この場合は、仕方ないのかなあ?)。
まず、クラスモジュールは要りません・・・、削除して下さい。


'=====================================================
Private Sub アドインプロシジャー()
dim in_code(1 to 5) as string
' 既に作成されているコード
'    ・
'    ・
'    ・
  in_code(1) = "  dim bn as string"
  in_code(2) = "  dim shnm as string"
  in_code(3) = "  bn=target.parent.parent.name"
  in_code(4) = "  shnm=target.parent.name"
  in_code(5) = "  msgbox ""ブック: "" & bn & ""  シート: "" & shnm & "" セル: "" & target.address"
'この配列にコードを入れます。例では、直接コード文字列を代入していますが、
'実際はテキストファイルから読み込むようにしたらどうでしょうか?
'コード訂正が楽なような気がしますが・・・。

  Call Put_SheetChange_Event(ActiveWorkbook, in_code())
  '                ↑イベントを発生させたいブックを指定する
End Sub
'===================================================================
Sub Put_SheetChange_Event(Wbook As Workbook, Ev_Code() As String)
'機能 : 指定されたブックのThisworkbookモジュールに
'     SheetChangeイベントコードを指定された配列の内容で作成する
'input : Wbook    - コードを作成するブック
'    Ev_Code()  - 作成するVBAコード
  
  Dim cmp As Object
  Dim ar_stline As Long
  Dim ar_cd_cnt As Long
  Dim new_stline As Long
  With Wbook.VBProject
   For Each cmp In .vbcomponents
    If cmp.Name = "ThisWorkbook" And cmp.Type = 100 Then
      With cmp.codemodule
       On Error Resume Next
       ar_stline = .ProcStartLine("workbook_sheetchange", 0)
       If Err.Number = 0 Then
        ar_cd_cnt = .ProcCountLines("workbook_sheetchange", 0)
        .DeleteLines ar_stline, ar_cd_cnt
        End If
       On Error GoTo 0
       new_stline = .CountOfLines + 1
       .InsertLines new_stline, "Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)"
       new_stline = new_stline + 1
       For idx = new_stline To new_stline + UBound(Ev_Code()) - LBound(Ev_Code())
        .InsertLines idx, Ev_Code(idx - new_stline + LBound(Ev_Code()))
        Next idx
       .InsertLines idx, "End Sub"
       End With
      End If
    Next
   End With
End Sub

尚、Excel2002の場合、標準の設定では、エラーが出るそうです。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=1261;id=excel

そうだとしたら、↑を参考に設定して下さい。

【6310】Re:訂正
お礼  B-BOSS  - 03/6/23(月) 16:47 -

引用なし
パスワード
   ありがとうございました。
なんとか悩みながら出来ました。
まだ 一部完全に理解したわけでは有りませんが、一応
動きました。
ありがとうございました。

13258 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free