Excel VBA質問箱 IV

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

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


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

【42546】Calcurateイベントについて あおがえる 06/9/14(木) 17:27 質問[未読]
【42548】Re:Calcurateイベントについて りん 06/9/14(木) 18:25 回答[未読]
【42551】Re:Calcurateイベントについて kobasan 06/9/14(木) 19:20 発言[未読]
【42552】Re:Calcurateイベントについて りん 06/9/14(木) 20:04 回答[未読]
【42553】Re:Calcurateイベントについて kobasan 06/9/14(木) 21:26 発言[未読]
【42579】Re:Calcurateイベントについて あおがえる 06/9/15(金) 14:29 お礼[未読]
【42948】Re:Calcurateイベントについて りん 06/9/26(火) 20:59 回答[未読]
【42967】Re:Calcurateイベントについて あおがえる 06/9/28(木) 10:57 質問[未読]
【42975】Re:Calcurateイベントについて りん@昼休憩 06/9/28(木) 12:56 回答[未読]
【43048】Re:Calcurateイベントについて あおがえる 06/9/30(土) 10:43 お礼[未読]
【42549】Re:Calcurateイベントについて カド 06/9/14(木) 18:50 回答[未読]
【42587】Re:Calcurateイベントについて あおがえる 06/9/15(金) 19:43 お礼[未読]

【42546】Calcurateイベントについて
質問  あおがえる  - 06/9/14(木) 17:27 -

引用なし
パスワード
   特定のセル(例えばA1)の計算値が変わったときのみマクロを実行させたいので下記のプロシージャを作ってみましたがコンパイルエラーがでて動作しません。
Worksheet_Calcurateイベントを使って動作させなければならないのです。
多分(ByVal Target As Range)が間違っているのではないかと思いますがどう訂正していいのか分かりません。
よろしくお願いします。

シートモジュール

Private Sub Worksheet_Calculate(ByVal Target As Range)
If Target.Address(0, 0) = "A1" Then
  マクロ1
End If
End Sub

【42548】Re:Calcurateイベントについて
回答  りん E-MAIL  - 06/9/14(木) 18:25 -

引用なし
パスワード
   あおがえる さん、こんばんわ。

>特定のセル(例えばA1)の計算値が変わったときのみマクロを実行させたいので下記のプロシージャを作ってみましたがコンパイルエラーがでて動作しません。

WorksheetのCalcurateイベントは、どこそこのセルの(計算)値が変わったらとかそういう引数はありません。

例えば、CalcurateイベントでA1セルの内容を追いかけて、変わったタイミングをチェックするとか。

↓シートモジュールに全部記述
Dim adat As Variant ’A1の内容を覚えておくグローバル変数
Private Sub Worksheet_Calculate()
  With Application.ActiveSheet.Range("A1")
   If adat <> .Value Then
     TEST
     adat = .Value '入替
   End If
  End With
End Sub
Sub TEST()
  MsgBox adat, vbInformation
End Sub
こんな感じです。

【42549】Re:Calcurateイベントについて
回答  カド  - 06/9/14(木) 18:50 -

引用なし
パスワード
   ▼あおがえる さん こんにちは

検索したらヒットしたのですが、例えばこんなことでしょうか?

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

  MsgBox ""

End Sub

【42551】Re:Calcurateイベントについて
発言  kobasan  - 06/9/14(木) 19:20 -

引用なし
パスワード
   こんばんわ。

興味があったので、試したところ、これだと、A1の計算値に関係のない行を削除したときも、メッセージが発生しますね。

【42552】Re:Calcurateイベントについて
回答  りん E-MAIL  - 06/9/14(木) 20:04 -

引用なし
パスワード
   kobasan さん、こんばんわ。

>興味があったので、試したところ、これだと、A1の計算値に関係のない行を削除したときも、メッセージが発生しますね。

A1の内容が変わらないとメッセージが発生しないはずですけど。
ただし、初期値の設定をしていないので、計算1回目は必ずメッセージが出てしまいます。

↓というわけで、1回目はスルーするように改良

Dim adat As Variant 'A1の内容を覚えておくグローバル変数
Dim NN As Integer    'adatに値をいれたかどうか覚えておく変数
Private Sub Worksheet_Calculate()
  With Application.ActiveSheet.Range("A1")
   If adat <> .Value And NN = 1 Then
     TEST
   End If
   adat = .Value '入替
   NN = 1 '入れ替えフラグ
  End With
End Sub
Sub TEST()
  MsgBox adat, vbInformation
End Sub

カドさんのつけた回答(数式のセル範囲参照)の方がスマートですけどね。

【42553】Re:Calcurateイベントについて
発言  kobasan  - 06/9/14(木) 21:26 -

引用なし
パスワード
   りん さん、みみなさん こんばんわ。

>ただし、初期値の設定をしていないので、計算1回目は必ずメッセージが出てしまいます。

そうですね。最初の行削除のみでした。横から失礼しました。勉強になりました。

【42579】Re:Calcurateイベントについて
お礼  あおがえる  - 06/9/15(金) 14:29 -

引用なし
パスワード
   皆様早速のレスありがとうございました。
大変参考になりました。
皆様のご好意にさらに甘えるようで申し訳ないのですが、例えば下記のコードで(A1)のセルの計算値が変わったときにはTEST、(A2)のセルの計算値が変わったときにはTEST1、(A3)のセルの計算値が変わったときにはTEST2のマクロを実行するようにするにはどうしたらいいでしょうか?
自分でも考えてコードを書いてみるのですがなにせVBAは超入門などの本でやっとほんの少し理解している程度で、いろいろやってもうまくいきません。
どうかよろしくお願いいたします

Dim adat As Variant 'A1の内容を覚えておくグローバル変数
Dim NN As Integer    'adatに値をいれたかどうか覚えておく変数
Private Sub Worksheet_Calculate()
  With Application.ActiveSheet.Range("A1")
   If adat <> .Value And NN = 1 Then
     TEST
   End If
   adat = .Value '入替
   NN = 1 '入れ替えフラグ
  End With
End Sub
Sub TEST()
  MsgBox adat, vbInformation
End Sub

【42587】Re:Calcurateイベントについて
お礼  あおがえる  - 06/9/15(金) 19:43 -

引用なし
パスワード
   有り難うございました。
大変参考になりました、これからもよろしくお願いいたします。

【42948】Re:Calcurateイベントについて
回答  りん E-MAIL  - 06/9/26(火) 20:59 -

引用なし
パスワード
   あおがえる さん、こんばんわ。

>皆様のご好意にさらに甘えるようで申し訳ないのですが、例えば下記のコードで(A1)のセルの計算値が変わったときにはTEST、(A2)のセルの計算値が変わったときにはTEST1、(A3)のセルの計算値が変わったときにはTEST2のマクロを実行するようにするにはどうしたらいいでしょうか?

adatを配列にして、複数のセルに対応しました。

ブックをオープンしたときに、最初の値を配列に入れるようにすればエラーも少なくなると思うので少々変更。

全部Thisworkbookに書いてください。

Dim adat(1 To 3) As Variant 'Aの内容をずっと覚えておく為の配列
Private Sub Workbook_Open()
  Dim II As Integer
  With Application.Thisworkbook.Worksheets("Sheet1") 'シート限定
   For II = 1 To 3
     adat(II) = .Cells(II, 1).Value
   Next
  End With
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  If Sh.Name = "Sheet1" Then 'シート限定
   Dim II As Integer
   With Sh
     If adat(1) <> .Range("A1").Value Then TEST1
     If adat(2) <> .Range("A2").Value Then TEST2
     If adat(3) <> .Range("A3").Value Then TEST3
     '入替
     For II = 1 To 3
      adat(II) = .Cells(II, 1).Value
     Next
   End With
  End If
End Sub
'//////ダミーの分岐先
Sub TEST1()
  MsgBox adat(1), vbInformation, "A1"
End Sub
Sub TEST2()
  MsgBox adat(2), vbInformation, "A2"
End Sub
Sub TEST3()
  MsgBox adat(3), vbInformation, "A3"
End Sub

もう解決済かもしれませんが。
さっき気づきました、すみません。

【42967】Re:Calcurateイベントについて
質問  あおがえる  - 06/9/28(木) 10:57 -

引用なし
パスワード
   りんさんこんにちは。
回答有り難うございました。自分でもガンバって考えていたのでしたが何せコードの読解力が乏しいものでコードを試行錯誤で書き換えてみたのですが全然うまくいきませんでした。りんさんのコードの丸写しでなんとか希望通りに作動しました。
そこでさらに大甘えするので心苦しいのですが対象セルA1,A2,A3をB2,B4,B6,B8にしたりC3,C6,C9,C12にしたりするにはどう書き換えればいいでしょうか?
単純に
If adat(1) <> .Range("A1").Value Then TEST1
のA1を書き換えるだけではだめらしいのですがどう書き換えればいいのかお教え下さい。
おお甘えして申し訳ないのですがなにとぞお願いします。

【42975】Re:Calcurateイベントについて
回答  りん@昼休憩  - 06/9/28(木) 12:56 -

引用なし
パスワード
   あおがえる さん、こんにちわ。

>そこでさらに大甘えするので心苦しいのですが対象セルA1,A2,A3をB2,B4,B6,B8にしたりC3,C6,C9,C12にしたりするにはどう書き換えればいいでしょうか?

またちょこっと処理方法を変えたので、全部Thisworkbookに書いてください。

Dim Rp(1 To 4) As String  '比較するセルアドレス
Dim adat(1 To 4) As Variant 'セルの内容を覚えておく為の配列
Dim wsn As String      'チェック対象シートの名前
Private Sub Workbook_Open()
  Dim II As Integer
  '情報()
  Rp(1) = "B2": Rp(2) = "B4"
  Rp(3) = "B6": Rp(4) = "B8"
  wsn = "Sheet1" 'シート限定
  '1回目のデータをセット
  With Application.ThisWorkbook.Worksheets(wsn)
   For II = 1 To 4
     adat(II) = .Range(Rp(II)).Value
   Next
  End With
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  If Sh.Name = wsn Then 'シート限定
   Dim II As Integer
   With Sh
     For II = 1 To 4
      If adat(II) <> .Range(Rp(II)).Value Then
        Select Case II
          Case 1: Call TEST1(.Range(Rp(II)).Value)
          Case 2: Call TEST2(.Range(Rp(II)).Value)
          Case 3: Call TEST3(.Range(Rp(II)).Value)
          Case 4: Call TEST4(.Range(Rp(II)).Value)
        End Select
        '新しい値をセット
        adat(II) = .Range(Rp(II)).Value
      End If
     Next
   End With
  End If
End Sub
'//////分岐先1
Sub TEST1(cdat As Variant)
  MsgBox adat(1) & " => " & cdat, vbInformation, Rp(1)
End Sub
'//////分岐先2
Sub TEST2(cdat As Variant)
  MsgBox adat(2) & " => " & cdat, vbInformation, Rp(2)
End Sub
'//////分岐先3
Sub TEST3(cdat As Variant)
  MsgBox adat(3) & " => " & cdat, vbInformation, Rp(3)
End Sub
'//////分岐先4
Sub TEST4(cdat As Variant)
  MsgBox adat(4) & " => " & cdat, vbInformation, Rp(4)
End Sub

【43048】Re:Calcurateイベントについて
お礼  あおがえる  - 06/9/30(土) 10:43 -

引用なし
パスワード
   りんさん大変有り難うございました。
おかげさまで満足のいく結果を得ることが出来ました。
大変助かりました。
コードの意味は少ししか分かりませんがこれから頑張って勉強していきます。

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