Excel VBA質問箱 IV

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

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


8986 / 13646 ツリー ←次へ | 前へ→

【29786】先日教えてもらったコードであらたな疑問が浮かび上がりました。 川崎 05/10/13(木) 17:59 質問[未読]
【29788】Re:先日教えてもらったコードであらたな... kobasan 05/10/13(木) 18:21 発言[未読]
【29789】Re:先日教えてもらったコードであらたな... 川崎 05/10/13(木) 18:49 質問[未読]
【29793】Re:先日教えてもらったコードであらたな... kobasan 05/10/13(木) 19:28 発言[未読]
【29827】Re:先日教えてもらったコードであらたな... 川崎 05/10/14(金) 13:59 質問[未読]
【29984】Re:先日教えてもらったコードであらたな疑... 川崎 05/10/17(月) 18:37 回答[未読]

【29786】先日教えてもらったコードであらたな疑問...
質問  川崎  - 05/10/13(木) 17:59 -

引用なし
パスワード
   下記のコードを通信で受け取った情報が変化した時に
実行するプログラムの書き方を教えてもらえないでしょうか?
ユーザー側で書き直した時は大丈夫なのですが、
通信でセル内が変わったときは実行しないようです。
よろしくお願いします。

Dim Dt1 As Double, Dt2 As Double 'グローバルで宣言(ずっと保持するため)
  Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(False, False) = "C6" Then
      Dt2 = Target.Value '入力された値
      If Dt1 > 0 Then
        With Application
          .EnableEvents = False
          Target.Value = Dt2 - Dt1
          .EnableEvents = True
        End With
      End If
      '
      Dt1 = Dt2
    End If
  End Sub

【29788】Re:先日教えてもらったコードであらたな...
発言  kobasan  - 05/10/13(木) 18:21 -

引用なし
パスワード
   ▼川崎 さん:
>下記のコードを通信で受け取った情報が変化した時に
>実行するプログラムの書き方を教えてもらえないでしょうか?
>ユーザー側で書き直した時は大丈夫なのですが、
>通信でセル内が変わったときは実行しないようです。
>よろしくお願いします。
>
>Dim Dt1 As Double, Dt2 As Double 'グローバルで宣言(ずっと保持するため)
>  Private Sub Worksheet_Change(ByVal Target As Range)
>    If Target.Address(False, False) = "C6" Then
>      Dt2 = Target.Value '入力された値
>      If Dt1 > 0 Then
>        With Application
>          .EnableEvents = False
>          Target.Value = Dt2 - Dt1
>          .EnableEvents = True
>        End With
>      End If
>      '
>      Dt1 = Dt2
>    End If
>  End Sub


▼川崎 さん 今晩は。

前のスレッドの質問の位置が急に変わったのでとまどっていますが
これは、続きの質問ですから、前の位置の方がいいと思います。

一応、前の質問での対策です。
「外部リンク」が「通信」ということばに変わっているのが微妙ですが。

>すみません、下記のりんさんに教えてもらったコードですが外部リンクで情報をかきなおした時、コードが実行されないのですが?どこを書き直せばよいのでしょうか?
>どなたかご教授お願い済ます。
>Dim Dt1 As Double, Dt2 As Double 'グローバルで宣言(ずっと保持するため)
>  Private Sub Worksheet_Change(ByVal Target As Range)
>    If Target.Address(False, False) = "C6" Then
>      Dt2 = Target.Value '入力された値
>      If Dt1 > 0 Then
>        With Application
>          .EnableEvents = False
>          Target.Value = Dt2 - Dt1
>          .EnableEvents = True

このイベント処理はリンクや関数の変化には対応しないと言うことだと思います。

たぶんC6にリンクを設定しているのだと思いますが、
この辺の細部までは分かりませんが、

対策としてはリンク元がBook2のSheet1のA1だとすると、
リンク元のSheet1シートモジュールに

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address(False, False) = "A1" Then
    Dt2 = Target.Value '入力された値
    If Dt1 > 0 Then
      With Application
        .EnableEvents = False
        Workbooks("book1").Sheets("Sheet1").Range("C6").Value = Dt2 - Dt1
        .EnableEvents = True
      End With
    End If
    '
    Dt1 = Dt2
  End If
End Sub

を貼り付ける方法があります。
リンク先に考えていたBookのシートモジュールは削除してください。
これはリンクの代わりにVBAで処理しています。

質問に対して見当違いかもしれないけど。

【29789】Re:先日教えてもらったコードであらたな...
質問  川崎  - 05/10/13(木) 18:49 -

引用なし
パスワード
   返信ありがとうございます。
移動の件ですが、私が削除してしまいますと kobasanさんの
せっかくの助言も消去することになりませんか?
ちなみに外部リンクをしらべると
他のサイトにつながったリンクとあったので、意味が違うと
気付き通信と変えてみました。
当方がやりたいのはある数式を使った通信です。
他のアプリから情報をもらいます。おそらく最初に教えてもらった
コードでは数式自体は変化しないのでコードが実行されないのでは
と考えています。(情報は変化するのですが。)
教えてもらった
コードはありがたく実行してみますが、
この通信は定時にしか情報がきませんので
あっているかどうかわかりません。
独自に実行する方法はありませんか?それとも
定時まで待つしかないのでしょうか?

【29793】Re:先日教えてもらったコードであらたな...
発言  kobasan  - 05/10/13(木) 19:28 -

引用なし
パスワード
   ▼川崎 さん 今晩は。

>移動の件ですが、私が削除してしまいますと kobasanさんの
>せっかくの助言も消去することになりませんか?

最終スレッドのみ最終投稿者が削除できます。

【29786】の質問で
>ユーザー側で書き直した時は大丈夫なのですが、
>通信でセル内が変わったときは実行しないようです。
   ~~~~~~~~~~~~~~~~~~~~~
とあるので、Bookがもう一つオープンしていると考えました。

しかし、

>当方がやりたいのはある数式を使った通信です。
>他のアプリから情報をもらいます。おそらく最初に教えてもらった
>コードでは数式自体は変化しないのでコードが実行されないのでは
>と考えています。(情報は変化するのですが。)

とあるので、他のアプリがエクセルなのかそうでないのかわかりません。
その辺をはっきりさせた方がいいと思います。
私の力では、エクセルなら分かる部分もありますが、エクセル以外なら
他の方の答えを待った方がいいと思います。

>この通信は定時にしか情報がきませんので
>あっているかどうかわかりません。
>独自に実行する方法はありませんか?それとも
>定時まで待つしかないのでしょうか?

定時の通信となると、私のカバーできる範囲を超えています。
他の方を待ちたいと思います。

【29827】Re:先日教えてもらったコードであらたな...
質問  川崎  - 05/10/14(金) 13:59 -

引用なし
パスワード
   返信おくれました。
なんとなく、コードが実行できない理由がわかりました。

例のWorksheet_Changeといのは文字通り、セルの中身が
変わったとき実行されるようです。(たとえ、セルの中身が前の
文字列とまったく同じだとしても入力し直すと変わったと認識して実行するイベント)それに対して数式はValue(値)こそ変わりますが、
数式自体が入力しなおされるわけではないので、セルの中身が変更されたと
認識しないようです。この微妙な違いがわかりますかね?

>他のアプリがエクセルなのかそうでないのかわかりません。
もちろん他のアプリとはエクセルではありません。
まったく別のアプリから通信を送っているのです。

VB.NETだとタイマーコンポーネントを組み込んで1秒おきとかに実行して
動作こそ大変になりますが、なんとかできます。
VBAにはざっとしらべたところタイマーコンポーネントが
ないようなのですが?ありますか?
またValue(値)の変化を察知するようなイベントがあれば
容易になると思うのですが・・・・・

【29984】Re:先日教えてもらったコードであらたな...
回答  川崎  - 05/10/17(月) 18:37 -

引用なし
パスワード
   先日の疑問なんとか解決できましたのでお伝えします。
worksheet_changeでは動かないので
worksheet_calculateをつかって
上記のコードに少し手を加える形で動きました。

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