先週末にIVの時間推移のグラフの記事の中で、データ記録の自動化の対応中のようなことを書きましたがこれが思いのほか時間がかかりました。で、やっと骨格ができたので嬉しさもあり記事をアップします。
これまでの私のマクロに関する知識はといえば、「マクロの記録」で操作を記録し、記録したソースを少し修正する程度のスキルでした。そのスキルをベースにして、データ自動記録のマクロをつくるのは少々荷が重かったようです。
最初は、いつものように「マクロの記録」を使って処理を作ったのですが、この処理をベースに自動化をすると、不具合だらけになりました。
例えば次のような不具合がありました。
・シートを切り替えると動かない
・ならばシート名を指定して実行しても動かない
(メンテナンス性向上のため、セルに名前をつけてそれを使用するようにしてたんですが、それがうまくない)
・で、セルの名前でなく直接指定すると動くようになったものの、記録処理が走るとシートが切り替わってしまう
などなどの不具合でした。
ネットを検索すると、サンプルがいくつか出てくるのですが、難しくて理解できず、理解できないから使うことも出来ず…
そんなわけで、一念発起してVBAをある程度ちゃんと勉強してみました。
特に役に立ったのは次のサイトでした。
http://www.happy2-island.com/excelsmile/
↑概略をつかむのにとっても良いサイトでした
http://excelvba.pc-users.net/index.html
↑体系的に書かれています。リファレンスとしても良さそうです。
そして、その知識をもとにしてやっと動くところまでこぎつけました。
とっても嬉しいです(そういうわけで、ブログアップです)
処理のポイント
・ログ記録シートとグラフを分離(別々のシートにわけ、メンテナンス性を向上させた(つもり))
・処理の定期的な実行は、 Application.OnTime を使って実現した
・Application.CutCopyMode = False を使って、クリップボードのデータをクリアする処理を入れた
(入れてないと変なコピペがされたり処理が動かなかったりします)
・Application.ScreenUpdating で、画面更新を行わずに処理をするようにした
(これを入れると処理中に変なシート切り替わりがなくなります)
欠点なんですが
・手動のコピペなどの処理を実施中に、この処理が流れると、クリップボードがクリアされてコピペできなくなる
※他にもあるかもしれませんが、現在のところ顕在化していません
参考:今回作ったソースの骨格は以下の通り
※なにせ初心者が作ったソースですので、不具合あっても責任持てませんが… <(_ _)>
Option Explicit
Public mytime As Date
Sub LOG_取得時刻セット()
mytime = Now + TimeValue("00:05:00")
Application.OnTime mytime, "LOG_取得処理_親"
End Sub
Sub LOG_取得終了()
Application.OnTime mytime, "LOG_取得処理_親", , False
End Sub
Sub LOG_取得処理_親()
Application.Run "LOG_取得処理実施"
Call LOG_取得時刻セット
End Sub
Sub LOG_取得処理実施()
'
' LOG_取得処理実施 Macro
'
Application.ScreenUpdating = False
Application.CutCopyMode = False
Worksheets("ログ").Range("G:G").Insert
Worksheets("ログ").Range("F:F").Copy
Worksheets("ログ").Range("G:G").PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
これまでの私のマクロに関する知識はといえば、「マクロの記録」で操作を記録し、記録したソースを少し修正する程度のスキルでした。そのスキルをベースにして、データ自動記録のマクロをつくるのは少々荷が重かったようです。
最初は、いつものように「マクロの記録」を使って処理を作ったのですが、この処理をベースに自動化をすると、不具合だらけになりました。
例えば次のような不具合がありました。
・シートを切り替えると動かない
・ならばシート名を指定して実行しても動かない
(メンテナンス性向上のため、セルに名前をつけてそれを使用するようにしてたんですが、それがうまくない)
・で、セルの名前でなく直接指定すると動くようになったものの、記録処理が走るとシートが切り替わってしまう
などなどの不具合でした。
ネットを検索すると、サンプルがいくつか出てくるのですが、難しくて理解できず、理解できないから使うことも出来ず…
そんなわけで、一念発起してVBAをある程度ちゃんと勉強してみました。
特に役に立ったのは次のサイトでした。
http://www.happy2-island.com/excelsmile/
↑概略をつかむのにとっても良いサイトでした
http://excelvba.pc-users.net/index.html
↑体系的に書かれています。リファレンスとしても良さそうです。
そして、その知識をもとにしてやっと動くところまでこぎつけました。
とっても嬉しいです(そういうわけで、ブログアップです)
処理のポイント
・ログ記録シートとグラフを分離(別々のシートにわけ、メンテナンス性を向上させた(つもり))
・処理の定期的な実行は、 Application.OnTime を使って実現した
・Application.CutCopyMode = False を使って、クリップボードのデータをクリアする処理を入れた
(入れてないと変なコピペがされたり処理が動かなかったりします)
・Application.ScreenUpdating で、画面更新を行わずに処理をするようにした
(これを入れると処理中に変なシート切り替わりがなくなります)
欠点なんですが
・手動のコピペなどの処理を実施中に、この処理が流れると、クリップボードがクリアされてコピペできなくなる
※他にもあるかもしれませんが、現在のところ顕在化していません
参考:今回作ったソースの骨格は以下の通り
※なにせ初心者が作ったソースですので、不具合あっても責任持てませんが… <(_ _)>
Option Explicit
Public mytime As Date
Sub LOG_取得時刻セット()
mytime = Now + TimeValue("00:05:00")
Application.OnTime mytime, "LOG_取得処理_親"
End Sub
Sub LOG_取得終了()
Application.OnTime mytime, "LOG_取得処理_親", , False
End Sub
Sub LOG_取得処理_親()
Application.Run "LOG_取得処理実施"
Call LOG_取得時刻セット
End Sub
Sub LOG_取得処理実施()
'
' LOG_取得処理実施 Macro
'
Application.ScreenUpdating = False
Application.CutCopyMode = False
Worksheets("ログ").Range("G:G").Insert
Worksheets("ログ").Range("F:F").Copy
Worksheets("ログ").Range("G:G").PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
スポンサーサイト
この記事へのコメント
こんにちは。
ツールがどんどん充実していきますね。
投資ツール作成シリーズ大変楽しみにしております。
ご存知でしたら失礼ですが
こうゆうのはどうでしょうか?
Range("F1:F10").Copy
Range("G1:G10").PasteSpecial Paste:=xlValues
のところを
Range("G1:G10").Value = Range("F1:F10").Value
コピーではなく代入の形になりますし多少実行速度も速くなると思います。
この手の話題(オプションよりも?)好きなものでコメントさせて頂きました(笑
ツールがどんどん充実していきますね。
投資ツール作成シリーズ大変楽しみにしております。
ご存知でしたら失礼ですが
こうゆうのはどうでしょうか?
Range("F1:F10").Copy
Range("G1:G10").PasteSpecial Paste:=xlValues
のところを
Range("G1:G10").Value = Range("F1:F10").Value
コピーではなく代入の形になりますし多少実行速度も速くなると思います。
この手の話題(オプションよりも?)好きなものでコメントさせて頂きました(笑
2009/12/18(金) 22:00 | URL | ナイチョー #-[ 編集]
うん、自動記録色がでていますね(笑)
10個くらいなら変わりませんが
Range("F1:F10") Copy Destination:=Range("G1:G10")
の方が高速です。
10個くらいなら変わりませんが
Range("F1:F10") Copy Destination:=Range("G1:G10")
の方が高速です。
2009/12/18(金) 22:39 | URL | すみパパ #-[ 編集]
代入のやり方は知りませんでした。大変勉強になります。
処理の高速化もありますが、さらにこれを使うと、2つ目の
Application.CutCopyMode = False
を省略できるのもいいかと思いました。
で、さっそく実験。列全体を代入する式に変えてみたのですが…
Worksheets("ログ").Range("G:G").Value = Worksheets("ログ").Range("F:F").Value
こうすると処理が明らかに遅いんですよね。シートの列全体に代入の処理が走っているのかな??
範囲指定する方式は試していませんが、おそらく早いのでしょう。ただ、今後の構想でこのシートにいろんなログをぶち込んでしまおうと思っているので、範囲指定すると拡張性がいまいちになってしまいます。そういうわけで、しばらくは当初の処理を利用しようと思います。
処理の高速化もありますが、さらにこれを使うと、2つ目の
Application.CutCopyMode = False
を省略できるのもいいかと思いました。
で、さっそく実験。列全体を代入する式に変えてみたのですが…
Worksheets("ログ").Range("G:G").Value = Worksheets("ログ").Range("F:F").Value
こうすると処理が明らかに遅いんですよね。シートの列全体に代入の処理が走っているのかな??
範囲指定する方式は試していませんが、おそらく早いのでしょう。ただ、今後の構想でこのシートにいろんなログをぶち込んでしまおうと思っているので、範囲指定すると拡張性がいまいちになってしまいます。そういうわけで、しばらくは当初の処理を利用しようと思います。
2009/12/19(土) 01:23 | URL | てつや #nu4jnsKo[ 編集]
すみパパさん、コメントありがとうございます。
本文、ちょっと説明が不足してまして申し訳ございません。「ログ」のシートのF列には、式が入ってまして(ログ取得対象のセルを参照する式)、G列にF列の値をコピーしたいというのが処理要件でした。Copy Destination:=を使うと、式そのものがコピーされてしまうので、今回は利用しませんでした。
Copy Destination:=は、便利そうですね。これもちゃんとVBAを勉強したので知ることができましたが、従来のやり方でマクロを組んでいるとそういう知識もありませんでした。
本文、ちょっと説明が不足してまして申し訳ございません。「ログ」のシートのF列には、式が入ってまして(ログ取得対象のセルを参照する式)、G列にF列の値をコピーしたいというのが処理要件でした。Copy Destination:=を使うと、式そのものがコピーされてしまうので、今回は利用しませんでした。
Copy Destination:=は、便利そうですね。これもちゃんとVBAを勉強したので知ることができましたが、従来のやり方でマクロを組んでいるとそういう知識もありませんでした。
2009/12/19(土) 01:30 | URL | てつや #nu4jnsKo[ 編集]
何を隠そう…
ブログの記事にVBAのソースを貼り付けたのは、ナイチョーさんやすみパパさんのようなご指摘をいただきたかったわけでして…
そんな思惑が見事にあたり、早速ご教授いただき大変感謝しています。
ブログを書いている特典って、こういうところにもあるんですよね。過去にもいろんな方からたくさん助けていただきました(皆さん、ありがとうございました)。
まだまだご指摘などを募集しておりますので(笑)、よろしくお願いします。
ブログの記事にVBAのソースを貼り付けたのは、ナイチョーさんやすみパパさんのようなご指摘をいただきたかったわけでして…
そんな思惑が見事にあたり、早速ご教授いただき大変感謝しています。
ブログを書いている特典って、こういうところにもあるんですよね。過去にもいろんな方からたくさん助けていただきました(皆さん、ありがとうございました)。
まだまだご指摘などを募集しておりますので(笑)、よろしくお願いします。
2009/12/19(土) 01:47 | URL | てつや #nu4jnsKo[ 編集]
例えば行数を、値の入っているところまでとして、
Application.WorksheetFunction.Subtotal(,))
などで、取得すれば、拡張性に配慮した作りになります。
あとは、全部セルでやらないで、配列をうまく使うことですね。
私のツールはまもなく.3.0になります(笑)リーマンにとっては、メール機能がとても便利です。
Application.WorksheetFunction.Subtotal(,))
などで、取得すれば、拡張性に配慮した作りになります。
あとは、全部セルでやらないで、配列をうまく使うことですね。
私のツールはまもなく.3.0になります(笑)リーマンにとっては、メール機能がとても便利です。
2009/12/19(土) 08:33 | URL | すみパパ #-[ 編集]
すみパパさん、コメントありがとうございます。
Subtotalや配列についても勉強してみようと思います。
最近は、やりたい機能を実現→知識が増える→やりたいことが増えていく、といった好循環(?)になっているのですが、なにせ知識が乏しいので一気には難しいので徐々にやっていこうと思います。
メール機能はとってもおもしろそうですね。すみパパさんツールの進化した機能もまた紹介してください。
Subtotalや配列についても勉強してみようと思います。
最近は、やりたい機能を実現→知識が増える→やりたいことが増えていく、といった好循環(?)になっているのですが、なにせ知識が乏しいので一気には難しいので徐々にやっていこうと思います。
メール機能はとってもおもしろそうですね。すみパパさんツールの進化した機能もまた紹介してください。
2009/12/19(土) 09:46 | URL | てつや #nu4jnsKo[ 編集]
このコメントは管理人のみ閲覧できます
2013/12/01(日) 17:26 | | #[ 編集]
★ご依頼☆自動売買プログラミングセミナー/FX/株/225/ご参加依頼≪無料≫ゴゴジャン中井
突然のご連絡失礼いたします。、
初めまして。投資情報サイトfx-on.comを運営していまゴゴジャンの中井と申します。
・名刺画像
http://fx-on.com/up/[namecard]gogojun_nakai.png
このたび管理人様に、岡三オンライン証券が協賛します【RSSで作る「自動売買」セミナー】に是非ご参加いただきたくご連絡いたしました。
当日は多くの開発者様や私も会場におりますので、ざっくばらんにお話などもできましたら幸いです。
どうかご検討のほどよろしくお願い申し上げます。
↓↓↓
~~~~~~~~~
【RSSで作る「自動売買」セミナー】
◇会場 ゴゴジャン セミナースタジオ
・東京都文京区本郷3-6-6 本郷OGIビル6F
◇講師:三澤 勇一(ブログ『神の数式研究所』管理人)
◇開催日時 5月20日(土)
・開場 / 12:30
・ご挨拶(岡三オンライン) / 13:00
・セミナー開催 / 13:15
・懇親会 / 15:15
・閉会 / 20:30
◇定員 25名
◆詳細・参加申込みはコチラから♪
↓↓↓
http://fx-on.com/asp/seminar_okasan/
~~~~~~~~~
その他疑問点などありましたらお気軽にお問い合わせください。
どうぞご検討のほどよろしくお願い申し上げます。
担当:中井
ゴゴジャン
03-5844-6090
080-6529-7673
nakaigogojan@gmail.com
突然のご連絡失礼いたします。、
初めまして。投資情報サイトfx-on.comを運営していまゴゴジャンの中井と申します。
・名刺画像
http://fx-on.com/up/[namecard]gogojun_nakai.png
このたび管理人様に、岡三オンライン証券が協賛します【RSSで作る「自動売買」セミナー】に是非ご参加いただきたくご連絡いたしました。
当日は多くの開発者様や私も会場におりますので、ざっくばらんにお話などもできましたら幸いです。
どうかご検討のほどよろしくお願い申し上げます。
↓↓↓
~~~~~~~~~
【RSSで作る「自動売買」セミナー】
◇会場 ゴゴジャン セミナースタジオ
・東京都文京区本郷3-6-6 本郷OGIビル6F
◇講師:三澤 勇一(ブログ『神の数式研究所』管理人)
◇開催日時 5月20日(土)
・開場 / 12:30
・ご挨拶(岡三オンライン) / 13:00
・セミナー開催 / 13:15
・懇親会 / 15:15
・閉会 / 20:30
◇定員 25名
◆詳細・参加申込みはコチラから♪
↓↓↓
http://fx-on.com/asp/seminar_okasan/
~~~~~~~~~
その他疑問点などありましたらお気軽にお問い合わせください。
どうぞご検討のほどよろしくお願い申し上げます。
担当:中井
ゴゴジャン
03-5844-6090
080-6529-7673
nakaigogojan@gmail.com
2017/05/09(火) 21:22 | URL | 中井 剛(fx-on.com運営者) #-[ 編集]
この記事のトラックバックURL
http://nikkei225indexoption.blog86.fc2.com/tb.php/802-95aebdfe
この記事にトラックバックする(FC2ブログユーザー)
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック