「夫を成功」へ導く妻の秘訣 座談会

エクセル自動実行のマクロを作成中にうまく動かないので
サンプルをコピーして、変更してみたのですが
そのサンプルも動いません、マクロとは違う何か悪いのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim intColor As Integer
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("B2:B11")) Is Nothing Then Exit Sub
Select Case Target.Value
Case Is <= 20
intColor = 3
Case 21 To 40
intColor = 46
Case 41 To 60
intColor = 9
Case 61 To 80
intColor = 10
Case Is > 80
intColor = 5
End Select
Target.Font.ColorIndex = intColor
Application.EnableEvents = True
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんばんは。



Application.EnableEvents = False
が実行されたあとにエラーが発生し、
Application.EnableEvents = True
が実行されることなく、Falseになったままに
なっているのでは無いでしょうか?

以下を実行してTRUEに戻してみてください。
Sub test()
 Application.EnableEvents = True
End Sub
    • good
    • 1
この回答へのお礼

動くようになりました
ありがとうございます

お礼日時:2009/12/03 21:00

#1です。



コードを良く見ると、
Application.EnableEvents = False
が実行されたあとに
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("B2:B11")) Is Nothing Then Exit Sub
の2行で条件一致すると
Application.EnableEvents = True
が実行されずに
Exit Sub
されます。

以下のようにしたらどうでしょうか?
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim intColor As Integer
  If Target.Count > 1 Then Exit Sub
  If Intersect(Target, Range("B2:B11")) Is Nothing Then Exit Sub

  Select Case Target.Value
    Case Is <= 20
      intColor = 3
    Case 21 To 40
      intColor = 46
    Case 41 To 60
      intColor = 9
    Case 61 To 80
      intColor = 10
    Case Is > 80
      intColor = 5
  End Select

  Application.EnableEvents = False
    Target.Font.ColorIndex = intColor
  Application.EnableEvents = True
End Sub

ただ、ColorIndexを変更してもWorksheet_Changeイベントは発生しない
ようなので、
  Application.EnableEvents = False
  Application.EnableEvents = True
で囲む必要は無いような気がします。。。
    • good
    • 0
この回答へのお礼

いらないですね
アドバイスありがとうございます

お礼日時:2009/12/03 21:01

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBAでのWorksheet_Changeが動作しない原因

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = Falseを入れてあります。

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C3")) Is Nothing Then
Exit Sub
Else
Application.EnableEvents = False
Call test
Application.EnableEvents = True
End If
End Sub

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = ...続きを読む

Aベストアンサー

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かします。そしてマクロが、正しく動いているかチェックします。そして、そのマクロが、再び、戻ってくるかどうか、様子をみます。
ただし、今回のマクロは途中で止めると、Application.EnableEvents = True に戻っていないことがありますから、イミディエイトウィンドウあたりで、設定を戻したほうがよいです。

また、初心者ならでは失敗は、Test プロシージャが、標準モジュールか、そのシートモジュールのどちらかに置いていないのが原因だったりします。

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かし...続きを読む

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む

QExcelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。

タイトルの通りです。
Excelで、「特定のセルの値が変わったらマクロを実行する」という設定はできないでしょうか。
ご存知の方がいらっしゃいましたら教えて下さい。

Aベストアンサー

WorksheetのChangeイベントで出来ます。
イベントの引数で値の変わったセルのRangeオブジェクトがわたってくるので、マクロを実行させることができます。

QEXCEL あるセルに数字が入力されれば既存マクロ実行させたい

ボタン等のグラフィックオブジェクトのマクロ実行は簡単なのですが、
ある位置のセルにデーターが入力されれば、
既存のマクロを自動実行させることできますか?

Aベストアンサー

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
if Range(ある位置) <>"" then call 既存のマクロ名
End Sub

ある位置と既存のマクロ名を変更して使ってみてください。
あと このVBAは 操作するワークシートのほうに記述します。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q【Excel VBA】セルの値が変更されたらマクロを実行

こんにちは

B4の値を変更する度に、
標準モジュールにあるMacro1が実行されるようにするには、
どうしたら良いでしょうか。

Excel2013です。

Aベストアンサー

WorksheetのChangeイベントを書けばいいです。
【Worksheet Change】
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 And Target.Row = 4 Then
Call Module1.Macro1
End If
End Sub

【Module1】
Public Sub Macro1()
MsgBox "B4の値変更(元の値と変更がなくても走行する)"
End Sub

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qエクセル イベントマクロ Changeイベントを複数作りたい

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub

以下マクロの内容

End Sub

これでセルA1が変わるとイベントマクロが発生しますが
セルB1が変わると別のマクロが発生し
セルC1が変わるとまた別のマクロが発生し…とするには
どうすればよいのですか
単純に並べて書いたらだめみたいだったんですけど

Aベストアンサー

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$A$1"
 A1のマクロ文
Case "$B$1"
 B1のマクロ文
Case "$C$1"
 C1のマクロ文
・・・・
End Select
End Sub
こんな感じでは?

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング