アレルギー対策、自宅でできる効果的な方法とは?

メタトレーダー4のDDEサーバー経由でエクセル2007にリアルタイム為替レートの情報を表示させたいのですが上手くいきません。
メタトレーダー4のオプションで「DDEサーバーを有効にする」をチェックし、エクセル2007のオプションで「DDEを使用する他のアプリケーションを無視する」のチェックを外した上で、MT4を起動、エクセル2007で、「='MT4' | BID ! EURUSD」と入力するのですが、フリーズして上手く機能しません。
またopenofficeではエラーになって表示されません。
MT4上ではリアルタイムに為替が表示されています。
何が原因と考えられますでしょうか?

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

A 回答 (4件)

どうもExcel2007はDDEとの相性が悪いようですね。


下記のサイトを見つけました。ご参考まで。

http://support.microsoft.com/kb/930479/ja
    • good
    • 0
この回答へのお礼

上記サイトについて色々と試しましたがやはりダメでした。
ググって私と似たケースが1つだけあったのですが、仰る通りExcel2007とDDEは相性が悪いようです。
アドバイス頂いた方法他色々やってみましたが解決しそうにはないです。
ただ(多分)Excel2007では出来ないことが分かっただけでも収穫です。
openofficeでもエラーになるのが気になるところですが、他のExcelバージョンを入手して試行を続けたいと思います。

親身に解決方法を探って頂きとても助かりました。
本当にありがとうございました。

お礼日時:2012/11/17 08:42

エクセル2007のオプションで「DDEを使用する他のアプリケーションを無視する」のチェックを外した、それは何のためですか?


文字通り読めば、余計な処理に見えますが。。。
    • good
    • 0
この回答へのお礼

DDEリンクを含むファイルが開けない事象について、解決策をググったところ、そういった処置を施すケースが幾つかあったためです。
ただチェックをオンにしても外しても結局はフリーズしてしまいます。
数式はMT4を何も囲まないと数式エラーで記入できず、「'」で囲むとフリーズになるため、囲む方が正解であると思うんですが。
バージョンや内部のアルゴリズム的問題であるとどうしようもないですね。

お礼日時:2012/11/17 06:58

どのブローカー(業者)ですか?

    • good
    • 0
この回答へのお礼

すみません、どこの業者かは忘れたのですが、
サーバー名にFXCMという文字列が入っています。
ちなみにデモ口座です。

お礼日時:2012/11/17 00:44

まず、入力した式が間違ってます。

正しくは、次の通りです。コピペしてリトライ!
=MT4|BID!EURUSD
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます。
数式をコピペしてリトライしたところエクセルから、
「入力した数式は正しくありません」とのダイアログが表示されました。
数式ミスの可能性を考えググった結果、質問文のような数式になったのですがやはりダメですね。

お礼日時:2012/11/16 23:22

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

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

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

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

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

QEXCELのwebクエリが反映されない。

EXCELのwebクエリ機能を使ってリアルタイムの為替情報を表に反映させたく、以下のページをみながらやってみました。
参照:http://www.hello-pc.net/howto-excel/exc_rate/
ですが、表が反映されません。(https://gyazo.com/fab14a26e303fdde0f25fd74ae332055)
その際に図のようなエラー表示がされました。

どうすれば反映されるようになりますでしょうか?
ご助言いただければ幸いです。

Aベストアンサー

スクリプトエラーは、以前は、IEのオプションで修正できたのですが、今は、それをやっても無理のようです。もうここの書き込みは、顧みられることもないかもしれませんが、#2で書いたものが中途半端ですから、完成形を作っておきます。

http://nikkei225jp.com/fx/
(VBAコード内で文字化けする可能性がありますので、再度、登録しなおしてください strURL = http://nikkei225jp.com/fx/  "URL"をコーテーションマークで囲んでください。)

取得先は、『日経の為替チャート』(他も試みましたが、失敗しました。)
このマクロは、サーバーに負担を掛けるようなものではありませんが、ループして使うのは問題が残ると思います。なるべく、PC自体にも負担を掛けないためには、参照設定をしたほうがよいと思います。(その意味が分かる方のみに限ります)

なお、サイトが更新されれば、取得できなくなる可能性がありますから、このコードは、2016/5/25のタイム・スタンプということにしておきます。

'//
Sub OnTimeGetExRates()
  Dim objIE As Object ''As InternetExplorer 'Microsoft Internet Control:参照設定
  Dim ChgRates As Variant
  Dim Countries As Variant
  Dim strURL As String
  Dim i As Long, j As Long, k As Long
  Dim buf As Variant
  Dim arBuf(5) As Variant
  Dim Kinds As Variant
  Dim StCell As Range
  '20160525 
  '最初の書き出しセルの場所
  Set StCell = Range("A2")
  
  Set objIE = CreateObject("InternetExplorer.Application")
  'Set objIE = New InternetExplorer '事前バインディングの場合
  On Error GoTo ErrHandler
  ''**************
  ''取得先 at May 25,2016/ no guarantee after the future.
  strURL = "http://nikkei225jp.com/fx/"
  ''*************
  Countries = Array("ドル円", "ユーロ円", "ポンド円", "スイスフラン円", _
                 "豪ドル円", "ニュージーランド円", "ユーロドル", "ドルインデックス")
  ChgRates = Array("511", "514", "515", "513", "516", "517", "523", "501") '"V518" 不明
  Kinds = Array("V", "H", "L", "C", "Z", "T")
  
  objIE.Navigate2 strURL
  j = 1
  Do While objIE.Busy Or objIE.readyState <> 4: DoEvents: Loop
  With objIE.document
        For i = 1 To UBound(ChgRates) + 1
         On Error Resume Next
         buf = ""
         buf = .getElementByID("V" & ChgRates(i - 1)).InnerText
         For k = 0 To 5
          arBuf(k) = .getElementByID(Kinds(k) & ChgRates(i - 1)).InnerText
         Next k
         If StCell.Cells(i, 1).Value = "" Then
             StCell.Cells(i, 1).Value = Countries(i - 1)
         End If
         For k = 0 To 5
           StCell.Cells(i, k + 2).Value = arBuf(k)
         Next k
         On Error Resume Next
        Next i
    End With
ErrHandler:
If Err.Number <> 0 Then
     MsgBox Err.Number & " :" & Err.Description
End If
objIE.Quit
Set objIE = Nothing
Beep
End Sub

'//

スクリプトエラーは、以前は、IEのオプションで修正できたのですが、今は、それをやっても無理のようです。もうここの書き込みは、顧みられることもないかもしれませんが、#2で書いたものが中途半端ですから、完成形を作っておきます。

http://nikkei225jp.com/fx/
(VBAコード内で文字化けする可能性がありますので、再度、登録しなおしてください strURL = http://nikkei225jp.com/fx/  "URL"をコーテーションマークで囲んでください。)

取得先は、『日経の為替チャート』(他も試みましたが、失敗しました...続きを読む

Q為替データをエクセルにダウンロード出来るサイト

為替データをリアルタイムで取得して、エクセルに
ダウンロードして処理したいのですが、
そのような事の出来るサイトは無いでしょうか。

Aベストアンサー

システムに関しては全く無知です。

株価のリアルタイムダウンロードの質問は時々あり、次が参考になっているようです。為替も同じじゃないでしょうか?

Excelで株投資
http://www2s.biglobe.ne.jp/~iryo/kabu/index.html
このなかの、右下のほうで、
■ 解析ツール関連VBAの解説
┣[1]-1Webから株価データ取得マクロ(Yahoo)
 ┣[1]-2Webから株価データ取得マクロ(Infoseek)

参考URL:http://www2s.biglobe.ne.jp/~iryo/kabu/index.html

Q株価関連情報を取得できるAPIを知りたい

株価関連の、自分用のソフトウエアを作りたいと思っています。
そこで、株価関連情報を取得できるAPIを知りたいです。

速報性はあまり気にしません。20分ディレイとか、1日ディレイとかでもいいです。

自分なりに探してみたのですが、現時点で使えるAPIはほとんど無いように思いましたので、細かいことは言いません。
xmlとか、CSVとか、rssとか、それなりにシステム的に処理できる形で
何らかの株価関連情報を取得できるAPIをご存知でしたら、何でも良いので教えて下さい!!

Aベストアンサー

楽天RSS http://marketspeed.jp/feature/rss/index.html
岡三RSS http://www.okasan-online.co.jp/ont/function/okasan_rss/
↑この2つはリアルタイムに株価を取得するものです。

株価データダウンロードサイト http://k-db.com/site/default.aspx
↑これは日足相当のデーターをCSVでダウンロードできるサイトです。

あるいは、普通のWebサイトの情報を、自分でHTMLを解析して情報を取得したりします。これはいわゆるスクレイピングと呼ばれるやりかたです。

QPrivate Sub Worksheet_Calculate()のことでお聞きします

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の温度変化で
Application.Speech.Speak "温度接近", True
などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか
その場合、Private Sub Worksheet_Change(ByVal Target As Range)内の
Target.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?
それとも、もしかしたら標準モジュールに書くのでしょうか?

うまく説明できていませんが、どなたか教えてください

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の...続きを読む

Aベストアンサー

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用のマクロを持っているはずです。

>特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
>変化した時の処理はどこに書いたらいいのでしょうか?

ふつうは、どこでもよいので、
=Now()
という式を書いて、
Private Sub Worksheet_Calculate()
に、イベントを拾わせるわけです。
しかし、少し、工夫が必要で、時々、これが困った動きをします。

Calculate のイベントが、ワークブック全体に働いてしまい、どこのシートを使っても、Calculateイベントが動いてしまいます。この方針で話が本格的になった時に、この対処法は、あらためて紹介します。

>(Worksheet_Change)のTarget.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?

単に、モジュール変数を使って橋渡しするのか、それとも、同時で働くということなら、 Worksheet_Calculateのイベントでなくてもよいはずです。どのように使うのか、こちらではわかりかねます。本来、別の働きをするものです。もちろん、キーで入力した際は、Worksheet_Calculateのイベントは、起動します。

>Application.Speech.Speak "温度接近", True
>などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか

ActiveX コントロールで入ってきた値が、どのように加わっていくのかにもよりますが、セルの位置は、Worksheet_Changeイベントのようにセルの位置は感知しませんから、インプットの場所が動いていくのでしたら、マクロで最後尾を探さなくてはなりません。

>それとも、もしかしたら標準モジュールに書くのでしょうか?
同様のコマンドで、標準モジュールに書く方法もあります。とても古い方法で、オブジェクト・ウィンドウにも出てこないはずです。しかし、まだ、同様の働きはしますが、今は、シートモジュールが主流になっています。

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用の...続きを読む

QEXCEL VBAでApplication.waitを使わずに一時停止させたい

マクロの実行中に、その処理を、条件分岐によってある一定時間だけ止めて、また再開させるようなプログラムを作りたいと考えています。
Application.Waitを使えば、可能というとこまではわかったのですが、それだとマクロ停止中にEXCEL上での一切の操作(たとえばスクロール)ができなくなるので、マクロだけ停止させておいて、他の操作はできるようなやり方はありませんでしょうか?
ちなみに、当方の使用OSはXP、EXCELは2007です。VBAは、はじめて取り組む超初心者で、以下のコードもネットやこちらのサイトを探しまくって、ようやくここまでできました。
なお、本マクロで具体的にやりたいことは、楽天証券のRSSというアプリケーションから、EXCELの特定の列に、1行目から順番に、リアルタイムで株価が書き込まれていきます。その株価を監視して、ある一定以上になったら、音で知らせるということをやりたいのです。その際、株価が書き込まれていく間隔は、数秒~数分です。
長々と書きましたが、ご教授いただけると助かります。
<参考:現在のマクロ>
Sub Test()
Dim waitTime As Variant
Dim 繰り返し As Long
For 繰り返し = 1 To 10
If Cells(繰り返し, 1).Value >= 10000 Then
Shell "mplay32.exe /play /close C:\WINDOWS\Media\notify.wav"
ElseIf Cells(繰り返し, 1).Value = Empty Then
waitTime = Now + TimeValue("0:00:05")
Application.Wait waitTime
End If
Next 繰り返し
End Sub

マクロの実行中に、その処理を、条件分岐によってある一定時間だけ止めて、また再開させるようなプログラムを作りたいと考えています。
Application.Waitを使えば、可能というとこまではわかったのですが、それだとマクロ停止中にEXCEL上での一切の操作(たとえばスクロール)ができなくなるので、マクロだけ停止させておいて、他の操作はできるようなやり方はありませんでしょうか?
ちなみに、当方の使用OSはXP、EXCELは2007です。VBAは、はじめて取り組む超初心者で、以下のコードもネットやこちらのサイトを...続きを読む

Aベストアンサー

こんばんは。

Microsoft のサポートには、そのものズバリの内容がありますが、少し古い内容です。実際、以下のプロパティで、楽天RSSの前バージョン(約2年前)では私は成功していますが、現行ツールでは知りません。RSSは、バージョンがあがりました。

http://support.microsoft.com/support/excel/content/onevent/onevent.asp?SD=gn&LN=ja&gssnb=1#ondata

それから、外部ツールを使って、音を鳴らすのはあまり賛成しません。一応、書いておきますが、本来は、内部コマンドのBeep やパターンの色付けでよいと思います。

1番目の場合は、最初に、Auto_Open を実行してください。一旦、ファイルを閉じて、再び開いても自動的に設定されています。

なお、Microsoft サポートの注にも書かれていますが、DDEやOLEではない場合に、ハンドラーが取れないこともあります。その場合は、OnEntry や Change イベントを使用してください、と書かれています。つまり、1番のマクロは、データがインポートされたときにのみ、起動するマクロです。ともかく、最初のマクロだけでも試してみてください。まだ、そういう古い方式が可能なのか、こちらでも知りたいのです。

-----------------------------------------
'標準モジュール
'Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

'一旦、閉じて開くか、最初に実行してください。
Sub Auto_Open()
 '実際のシート名を入れてください。
 Worksheets("Sheet1").OnData = "Test1"
End Sub

Sub Test1()
  Dim i As Long
  Dim rt As Long
  Static j As Long
  Const sSOUND As String = "C:\WINDOWS\Media\notify.wav"

  i = Cells(Rows.Count, 1).End(xlUp).Row
  If i <> j Then
    If Cells(i, 1).End(xlUp).Value > 10000 Then
      rt = mciSendString("Play " & sSOUND, "", 0, 0)
      'Beep 'ビープ
      'Cells(Rows.Count, 1).End(xlUp).Interior.ColorIndex = 34 '色づけ
    End If
  End If
  j = i
End Sub

-------------------------------------

OnTime メソッドを使う場合は、LastTime を数秒の間の設定をしたほうがよいです。LastTime を入れないと、待機状態の後に、立て続けに、マクロの起動をしてしまい意味のないものになってしまいます。また、行数が単にインクリースしても、そこにデータがなければ、意味のないチェックになってしまいますから、必ず、実際に存在するデータに連動していなければなりません。また、データが増えなければ、チェックはしません。

以下の場合は、ワークシートの作業中とマクロのデータチェックがぶつかった場合は、作業のほうが必ず優先しますが、その待機状態は、数秒間しかありません。その時に無視したデータは、次のマクロで必ずフォローするように出来ています。なお、色づけとBeep という方式になっていますから、色づけが嫌いなら、コメントブロック(')を入れてください。

一列の最後尾に、文字「Q(大文字・小文字共通)」を入れれば、それで終了します。

------------------------------------------
'標準モジュール
'Option Explicit

Sub TimerMacro()
  Dim i As Long '行
  Dim n As Long
  Dim myTime As Date
Static j As Long
  '----------------------------------
  'チェックする値を以下に入れてください。
  Const MYLIMIT As Long = 10000
  '----------------------------------
  i = Cells(Rows.Count, 1).End(xlUp).Row
  '終了は、Q を入れる
  If StrComp(Cells(i, 1).Value, "Q", 1) = 0 Then
   MsgBox "終了しました。", 64
   Exit Sub
  End If
  If i > j And j > 0 Then
    For n = j To i
      '上限を超える場合
      If Cells(n, 1).Value > MYLIMIT Then
        Cells(n, 1).Interior.ColorIndex = 34 '水色
        Beep '音
      End If
    Next n
  ElseIf j = 0 Then
       If Cells(i, 1).Value > MYLIMIT Then
        Cells(i, 1).Interior.ColorIndex = 34 '水色
        Beep '音
        End If
  End If
  j = i
  myTime = Now + TimeSerial(0, 0, 5) '5秒
  Application.OnTime myTime, "TimerMacro", myTime + TimeSerial(0, 0, 2) '待機2秒
End Sub
----------------------------------------

こんばんは。

Microsoft のサポートには、そのものズバリの内容がありますが、少し古い内容です。実際、以下のプロパティで、楽天RSSの前バージョン(約2年前)では私は成功していますが、現行ツールでは知りません。RSSは、バージョンがあがりました。

http://support.microsoft.com/support/excel/content/onevent/onevent.asp?SD=gn&LN=ja&gssnb=1#ondata

それから、外部ツールを使って、音を鳴らすのはあまり賛成しません。一応、書いておきますが、本来は、内部コマンドのBeep やパターンの色付けで...続きを読む

QMT4からエクセルへデータを出力

4本値のデータがDDEサーバーを使って出力可能なことは知っているのですが
その他のデータたとえばストキャスティクスの現在値やクロスタイミングなどは出力可能でしょうか?

Aベストアンサー

質問に対する直接の回答になっておらず、ごめんなさい。

MT4の4本値をエクセルに落とせるのならば、そのエクセルシートで、関数を使ってストキャスを組めばよいではないでしょうか。

ストキャスの関数はそれほど難しくないですよ。

http://www.kyoei-bs.co.jp/home2/tech/tec05.html

参考URL:http://www.kyoei-bs.co.jp/home2/tech/tec05.html

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マクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Qエクセルで定期的(30分おき)にマクロを実行させる方法は?

エクセルにて刻一刻変る外部データ(株価)を表示させています。それを自動で30分置きにデータ蓄積させる方法はありませんか?

現在は自分で作ったキーボードマクロで 時計を見ながらボタンを押し、データを取り込ん出る始末です。

その簡単マクロに「30分置きに実行させる」と云う記述を付け足す程度で自動実行させる事は可能でしょうか? 
当方キーボードマクロでの自動書き込みしか出来ない素人ですが、少々複雑な物であっても頑張ってみるつもりですので、どなたかご教授下さい。

Aベストアンサー

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと、午前10時~午後6時まで30分間隔で Macro1 を実行します。
変更点は、

 ・ブッククローズをトラップした
 ・進捗状況をステータスバーに表示するようにした
 ・その他しょうもないこと

です。

このままコピペで使えると思いますが、試される場合は、MACRO1 はご自分の
用途に合わせて適切に修正して下さい。


Option Explicit

Dim mcolTask As Collection

Sub 実行予約()

  Dim i      As Date
  Dim strProcName As String
  Dim datBigin  As Date
  Dim datEnd   As Date
  Dim datInterval As Date
  Dim datTimeout As Date
  Dim blnJustTime As Boolean

  ' Setting-------------------------------------------------------

  datBigin = TimeValue("10:00:00")  ' 開始時刻
  datEnd = TimeValue("18:00:00")   ' 終了時刻
  datInterval = TimeValue("00:30:00") ' 実行間隔(少なくとも数秒以上で)
  datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
  blnJustTime = True         ' datInterval で丸めるか
  strProcName = "MACRO1"       ' 実行するマクロ名

  '---------------------------------------------------------------

  ' 既に実行予約されているか確認
  If mcolTask Is Nothing Then

    ' 日付シリアル値を加算
    datBigin = datBigin + Date
    datEnd = datEnd + Date
    ' 終了時刻が開始時刻より小さければ日をまたぐので補正
    If datEnd < datBigin Then datEnd = datEnd + 1
    ' 現在時刻が既に終了時刻を過ぎている場合
    If datEnd < Now() Then
      MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
      Exit Sub
    End If
    ' 現在時刻が開始時刻を過ぎていれば補正
    If datBigin < Now() Then
      ' 開始時刻を datInterval で指定された値で丸めるか
      If blnJustTime Then
        datBigin = Application.Floor(Now() + datInterval, datInterval)
      Else
        datBigin = Now() + datInterval
      End If
    End If

    ' 初期化
    Set mcolTask = New Collection

    ' メイン部分
    For i = datBigin To datEnd Step datInterval
      ' 後から取り消せるようにコレクションに退避
      mcolTask.Add CStr(i) & "," & strProcName
      ' Application.Ontime で実行予約を行う
      Application.OnTime EarliestTime:=i, _
                Procedure:=strProcName, _
                LatestTime:=i + datTimeout, _
                Schedule:=True
    Next i
  Else
    MsgBox "既に実行中です", vbInformation
  End If

End Sub

Sub 未実行予約強制解除()
 
  Dim i  As Long
  Dim vntS As Variant
 
  On Error Resume Next
  Application.StatusBar = "タスク破棄中... "
  For i = 1 To mcolTask.Count
    vntS = Split(mcolTask.Item(i), ",")
    Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
  Next i
  Application.StatusBar = ""
  Set mcolTask = Nothing

End Sub

' タスク管理用
Private Sub RemoveTask()
  
  On Error Resume Next
  mcolTask.Remove (1)
  Application.StatusBar = "待機中のタスク... " & mcolTask.Count
  DoEvents
  Beep
  If mcolTask.Count = 0 Then
    Application.StatusBar = ""
    Set mcolTask = Nothing
  End If

End Sub

Sub Auto_Close()

  Dim intRes As Integer
  If Not mcolTask Is Nothing Then
    intRes = MsgBox( _
        Prompt:="待機中のタスクが " & mcolTask.Count & " 件あります。" & vbLf _
           & "破棄して終了しますか?", _
        Buttons:=vbOKCancel + vbDefaultButton2 + vbExclamation, _
        Title:="問い合わせ")
    If intRes = vbOK Then
      Call 未実行予約強制解除
    Else
      ' ブッククローズをキャンセル
      Application.ExecuteExcel4Macro ("Halt(True)")
    End If
  End If

End Sub

' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()

  Dim lngRow As Long
  With ThisWorkbook.Sheets("Sheet1")
    lngRow = .Range("V65536").End(xlUp).Offset(1).Row
    .Cells(lngRow, "V").Resize(1, 3).Value = .Range("Q12:S12").Value
    .Cells(lngRow, "Y").Value = Now()
  End With

  ' ご自分のマクロの最後に次の一行を追加しておいて下さい
  Call RemoveTask

End Sub

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと...続きを読む

QExcelにおけるDDEデータのイベントプロシージャについて

DEEをつかって、Excelのセルにデータを出力しています。
そのセルのデータが変更された時に、自動でそのデータをコピーし別のシートにペーストしたいのですが、よろしければ助言をお願い致します。
イベントプロシージャの(worksheet_change)で試してみたのですが、任意でセルの値を変えないとプロシージャが動かず行き詰りました。
VBAも超初心者なのですが、よろしくお願い致します。

Aベストアンサー

こんにちは。Wendy02です。

返事が遅くなりました。あれから、折に触れて考えてみました。

以下のサイトにある方法が出来るのではないか、と思いました。(ドイツ語ですから、マクロだけをみてください)

http://www.herber.de/forum/archiv/24to28/t24099.htm

Auto_Open で、Activeなシートを、OnData で監視させます。(お分かりだと思いますが、全部、標準モジュールにおきます)そこに、DDEのデータが入ってくると、その設定された、マクロが動くという仕掛けです。(まだ、このメソッドは生きていると思います)

ActiveSheet.OnData = "Update" 


一応、OnDataのHelpを置いておきます。

# 機能 Ver5 マクロヘルプより

DDE または OLE でリンクされたデータが、Microsoft Excel に届いたときに実行されるプロシージャの名前を返します。ここで設定したプロシージャが実行されるのは、他のアプリケーションからデータが届いたときだけです。値の取得および設定ともに可能です。

こんにちは。Wendy02です。

返事が遅くなりました。あれから、折に触れて考えてみました。

以下のサイトにある方法が出来るのではないか、と思いました。(ドイツ語ですから、マクロだけをみてください)

http://www.herber.de/forum/archiv/24to28/t24099.htm

Auto_Open で、Activeなシートを、OnData で監視させます。(お分かりだと思いますが、全部、標準モジュールにおきます)そこに、DDEのデータが入ってくると、その設定された、マクロが動くという仕掛けです。(まだ、このメソッドは生きていると...続きを読む


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

人気Q&Aランキング

おすすめ情報