• ベストアンサー

シート名を変更すると起動するマクロ

エクセルのシート名を変更すると起動するマクロをVBAでつくりたいのですが、わかりません。みなさんのお力をお貸しください。エクセルのバージョンは2002です。

質問者が選んだベストアンサー

  • ベストアンサー
  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

かなり遠回りな方法になりますが、 まず標準モジュールにシート名を取得するユーザー定義関数を作ります。 Function Sheetname(ByVal Target As Range) As String   Application.Volatile   Sheetname = Target.Parent.Name End Function そして、対象とするワークシートのどこかのセルに =Sheetname(A1) などと式を入れて、シート名を表示させます。 ツール→オプションで計算方法を自動にしておきます。 こうしておくと、シート名を変更したときにWorksheet_Calculateイベント、Workbook_SheetCalculateイベントが発生しますので、それを拾って処理します。 Private Sub Worksheet_Calculate()   'イベントの発生がシート名の変更によるものかどうかを確認   '必要な処理を行う End Sub

konkon2
質問者

お礼

回答ありがとうございます。 回答のようにしてみたのですが、どうもうまく動きません。 少し質問しますが、よろしければ回答お願いします。 ユーザー定義関数「Sheetname」は動いて、シート名を変更するつど、セルにシート名が表示されるのですが、ワークシートが再計算されているように認識されないようなのです。 なので、 >Private Sub Worksheet_Calculate() >  'イベントの発生がシート名の変更によるものかどうかを確認 >  '必要な処理を行う >End Sub が、起動しません。 「'必要な処理を行う」の所にコマンドボタン「マクロの実行」で動くマクロをそのまま記述しているのですが、是がいけないのでしょうか?

その他の回答 (8)

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.9

No.7です。補足に回答します。 Workbook_SheetChangeではなく、Workbook_SheetCalculateを使用してみてください。

konkon2
質問者

お礼

回答ありがとうございます。 希望するように動きました。 適切に指示を頂いていたのに、私のミスで申し訳ないです。 親切な対応、ありがとうございました。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.8

こんにちは。 上で似たような質問に下記のように回答しましたので ここでも同じ回答を載せます。 今回のコードでシート名の変更を捕らえたければ Calculateイベントではなく、ユーザー定義関数そのものでやったらどうですか。 ユーザー定義関数は、No2.ShtWataさんのを利用しているみたいなのでそのまま利用させてもらいます。 間違いなくする為に、新しいブックで以下のコードをテストしてください。 簡単の為に、"sheet1"だけの変更に対応。 --------------------------------------------- (標準モジュール) Public OldName As String 'パブリック変数 Function Sheetname(ByVal Target As Range) As String  Application.Volatile  Sheetname = Target.Parent.Name  If OldName = "" Then    OldName = Sheetname  End If  If OldName <> Sheetname Then   MsgBox OldName & "が " & Sheetname & " に変更されました"   OldName = Sheetname   End If End Function --------------------------------------------- コードを書いたあと、Sheet1のどこかに、=sheetname(A1) を入れておく ようは、以前のシート名を保持しておき ユーザー定義関数が再計算されるとき比較するだけです。 もちろん、Calculateイベントで同様のことをしてもOKですよね。 何回も言うようですが、このサンプルは、シート1つだけに対応です。 全てのシートに対応したい場合は、ちょっと考えてみてください。 以上です。  

konkon2
質問者

お礼

回答ありがとうございました。 希望するように動きました。 すべてのシートに対応する場合も勉強して考えてみます。

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.7

No.2です。補足への回答です。 (1)書き忘れましたが、Private Sub Worksheet_Calculate()は、標準モジュールのほうではなくて、Sheet1等の対象とするシートのモジュールに記述してください。また、 Private Sub Workbook_SheetCalculate(ByVal Sh As Object) でもよいのですが、この場合はThisWorkbookのモジュールに記述してください。(Shという変数は、再計算が発生したシートを示します) (2)計算方法が自動になっていることを確認してください。シート名を変更すると表示が変更になるとのことなのでこちらはOKだと思いますが。

konkon2
質問者

お礼

丁寧な回答ありがとうございます。 教えていただいたように、標準モジュールにユーザー定義関数を、ThisWorkbookにとりあえず Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) MsgBox ActiveSheet.Name End Sub としてみて、シート名を変更してもメッセージボックスは表示されず、ワークシート内のセルを変更するとメッセージボックスが表示されます。 重ね重ね申し訳ないのですが、気が向きましたら回答お願いします。

  • WWolf
  • ベストアンサー率26% (51/192)
回答No.6

No4さんの指摘たしかにそうですね。 質問を少し勘違いしていますたが、No5を少し変更すれば可能だとおもいます。

konkon2
質問者

お礼

回答ありがとうございます。 No.5で頂いた回答のようにしてみたのですが、quit123さんのおっしゃるように、一度他のシートをアクティブにした後、目的のシートをアクティブにすると、マクロが走るようなのです。 >No5を少し変更すれば可能 とありますが、どのように変更すればいいのか、よろしければお教え願いますか?

  • WWolf
  • ベストアンサー率26% (51/192)
回答No.5

Module1に ↓ Public ShNa(1 To 10) だけ ThisBookに ↓ Sub Workbook_Open() For Each myWB In Workbooks For i = 1 To myWB.Sheets.Count ShNa(i) = Worksheets(i).Name Next i Next End Sub Sub Workbook_SheetActivate(ByVal Sh As Object)   If Worksheets(Sh.Index).Name <> ShNa(Sh.Index) Then     MsgBox "" ’実際はCall文   End If End Sub こんな感じでいけると思いますよ。

  • quit123
  • ベストアンサー率21% (4/19)
回答No.4

No.3のWWolfさんへ シート名の変更はシートがアクティブになった後でしか出来ないのでは?   で、シート名変更後、他のシートをアクティブにし、その後、シート名を変更したシートを再度アクティブにすれば、回答の方法でも出来ると思いますが、それでは質問者の要望とは違いますよね。  

  • WWolf
  • ベストアンサー率26% (51/192)
回答No.3

BookOpen時に各シートのシート名をPublic の変数に格納し各シートがアクティブになったときのシート名と比較で違えばCall これをVBAで書けばOK

noname#9268
noname#9268
回答No.1

シート名を変更するイベントが取得できないので 変更するとすぐに起動するマクロは作成できないと思います。 他のアプローチを考えたほうがよいと思います。

konkon2
質問者

お礼

回答ありがとうございました。 VBA等プログラムのようなものは、エクセルのヘルプやgoo等の掲示板で、少し目にした程度ですので、私のしようとしていることへのアプローチは、もっと違ったスマートな方法があるのかもしれないですね。もっと勉強します。

関連するQ&A