プロが教えるわが家の防犯対策術!

【緊急】EXCEL VBAの『THIS WORKBOOK』について質問があります.

現在,シート数100枚程度にマクロをかけようとしています.
これらにマクロをかける際に『THIS WORKBOOK』でマクロを作成し,全体にかけているのですが
二枚程度は表紙のニュアンスでシートを作成したもので,マクロをかけたくありません.
このような場合,どのようにマクロをかければよいのでしょうか.

私のイメージでは
『シート1と2以外であればマクロを実行する.』なのですが
なかなかそれらしいサンプルプログラムが発見できずに悩んでいます.

『THIS WORKBOOK』ではできないのですかね・・・・.

A 回答 (4件)

>100枚ほどシートがございましたので各シートにマクロを作成するのが面倒であったので『THISWORKBOOK』でマクロを作成いたしました.



そのような意味でThisWorkbookにマクロを記述するのは誤りかと思います。
ThisWorkbookのイベントを使っているのかどうか解りませんが、このイベントを使いこなすにはしっかりとした知識を持っていないと無理かも知れませんよ。

>マクロでは日付などの条件分岐を用いて,表紙の2枚はその条件にはあてはまらないはずなのですが,なぜかマクロが実行されてしまうので悩んでいました.

シート名でチェックする以外に、セルの内容でも除外シートのチェックが可能ということですか?
それなら、その方式でチェックする方が面倒が無くて良いかもしれませんが、この条件分岐が動作しないということなら、記述になんらかの誤りがある(記述コードにあなたの思い込みがあるとか)と言うことでしょう。

いずれにしても、マクロの具体的な動作仕様やあなたが書かれたコードが不明なので、適切なアドバイスを貰いたいと思っても回答者の想像でしか回答できませんから、アドバイスを貰いたいコードを提示して再質問するもの良いでしょう。
この質問へのリンクを記入しておくと良いかも知れません。


例えば・・・
1.マクロの実行方法(ThisWorkbook使用の可否)
2.実行(除外)シートのチェック方法(今回の回答で理解できないなら)
3.うまく実行できない条件分岐に付いて
    • good
    • 0

マクロを各場所の認識を間違えているようですね。



セルの値が変更されたらマクロを実行、とか、選択するセルの位置が変わったらマクロを実行、とか、そういうワークシートイベントの記述をワークシートモジュールに記述して、通常のマクロは、標準モジュールに記述するのが一般的です。

あなたがやりたいことは、標準モジュール内で、

Dim Sh As Worksheet
For Each Sh In Worksheets
If Sh.Name <> "シート1" And Sh.Name <> "シート2" Then
'ここにシート1と2以外のシートで実行したいマクロを記述
End If
Next Sh

と書けば実現できるはずです。
    • good
    • 0

質問者は、我流でVBAをやっていて、教えてもらったことが無いような感じです。


(1)THIS WORKBOOKはワークシートのイベントのコードを書くところです。
質問ではシートのイベントに関連させて実行することはやっていないようなので、標準モジュールにコードを書いて実行するべきです。
>マクロをかけたくありません
この表現もあまり使われない。
>二枚程度は表紙のニュアンスでシートを作成したもので,
表紙のニュアンスとは。表示としてシートを作った?
意味が不明。全体の理解には影響しないようではあるが。書く必要が無ければ、書かないこと。
>『シート1と2以外であればマクロを実行する
これが本題だろう。
>私のイメージでは
イメージではなく、それ以下の「シート1と2以外であれば・・」を質問表題にかかげるべきです。
>表題の、「THIS WORKBOOK』について質問」
は、的はずれを公言していることに見える。
ーー
シートを特定して、それに対する処理をスキップすれば良い。
シートの特定は
A.シートの名前
B。インデックス番号
C。Activesheet
D。NextやPrevious
E。For Each  などある。この基本を抑えてますか。
ーー
Activesheetはひとつ、インデックス番号はシートタブを移動させると変わるので当てにならない。

本件は処理する全シート100個の中で2個を除いて全て処理をするならE.の方法が良かろう
2+100+アルファのシートがあるなら別だが。その場合はアルファのシート名も除外する中に含める。
>サンプルプログラムが発見できずに悩んでいます
Googleででも「VBA シート 多数」で照会すればFor Eachの処理にいたる。
検索にはある程度のVBAの素養が必要で、背景にある勉強が、まだそこまで行ってない(経験が少ない)のが原因でしょう。
コード例
Sub test01()
For Each sh In Worksheets
Select Case sh.Name
Case "Sheet1", "Sheet3"
Case Else
MsgBox sh.Name
End Select
Next
End Sub
シートを挿入操作で10程度つくり、シート名を変えず上記を実行。Sheet1、Sheet3以外のシート名が
出てくることを確認し納得。
その上でMsgboxのところへしたい処理のコードを入れる。
ーー
上記はCase文を使ったがIF文でもよい。
もっと除外シートが多ければ、1つのシートの1つの列のセルに、除外するシート名を並べ、それのどれかに該当するかどうか、聞けば良い。数百までなら使用に耐えるでしょう。
ーーー
>シート数100枚程度に
エクセルでは予想を超えた使い方ではないかな。
システム設計を良く考えて、アクセスなどで処理すべき領域ではないかな。
    • good
    • 0

>マクロをかける際に『THIS WORKBOOK』でマクロを作成し,全体にかけているのですが



マクロをかけるとは言いません。
設定するとか実行させるといいます。

それになぜ、ThisWorkBookにマクロを設定しているのでしょうか?
ブックの各種イベントで動作させるマクロなら ThisWorkBookのイベントに記述するのは正しいです。

>私のイメージでは『シート1と2以外であればマクロを実行する.』なのですが

コードでシート名を受け取る(チェック)するだけですから、難しいことではないはずですよ。
アクティブシートで実行するマクロなら、ActiveSheet.Name でシート名が解りますよね。


シートのイベントであれば、イベントのパラメータに”Sh As Object”というのがあるので、下記のようなコードでシート名を判別して実行できます。
プロシージャではShというオブジェクト変数で内容を受け取ることができます。
「Private Sub Workbook_SheetActivate(ByVal Sh As Object)」

________________________________________

'シート1と2以外であればマクロを実行する
If Not (Sh.Name = "シート1" Or Sh.Name = "シート2") Then
'処理
End If

'シート1と2であればマクロを終了する
If Sh.Name = "シート1" Or Sh.Name = "シート2" Then
Exit Sub
End If
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました.

>それになぜ、ThisWorkBookにマクロを設定しているのでしょうか?
ブックの各種イベントで動作させるマクロなら ThisWorkBookのイベントに記述するのは正しいです。

100枚ほどシートがございましたので各シートにマクロを作成するのが面倒であったので『THISWORKBOOK』でマクロを作成いたしました.
また,マクロでは日付などの条件分岐を用いて,表紙の2枚はその条件にはあてはまらないはずなのですが,なぜかマクロが実行されてしまうので悩んでいました.

お礼日時:2010/07/13 07:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!