最近、Excel VBAをコツコツ書いています。
以前、プログラミングの教科書を読んで、何度も挑戦して挫折しました。
いま思い返すと「そりゃそうだよなあ」と。
だって必要性が感じられないのだもの。
先日、1年間に40万行ほどのデータを手に入れた。
その中に6000~7000カ所ほどのデータ欠損箇所があって、それを探し出し、欠損部分を補完する必要性に迫られた。最初手作業で1時間ほどやってみて、50カ所ほど補完したところで見事に挫折。これは無理、これを5年分もやるのは絶対無理だと。
で、VBAで小さなプログラムをいくつか作って処理してみた。
これまでに何度も挫折してきたお陰で、基本的な構文は頭に入っている。あとはネットで関数をいくつか調べるだけで何とかなる。手順をコードに落とし込んで行く。
実際、一つのプログラムを作るのに、テストを含めて2時間ほど掛かったけれど、手作業だったら何日もかかる作業が僅か10分ほどで終わる。MacがCPU負荷MAXでウンウン唸ってくれるお陰で楽をさせてもらえてる。
なんかプログラムって仕事をお願いするためのラブレターみたいなものなんだなと思えるようになったのさ。必要は発明の母って言うが、それは本当なのだとね。
Excel VBAで、セルの背景に色を付けてみた
ついでに、先ほどの1分足のデータに3分ごとにセルの背景に色を付けてみた。
作業上少し見やすくなると良いかなあと思って。
========================================
Sub 背景カラー()
Dim 行数, i As Long
行数 = ActiveSheet.Range("A1").End(xlDown).Row
For i = 2 To 行数
If Minute(Range("A" & i)) = 0 Then
Range("A" & i).Interior.ColorIndex = 34 '水色
End If
If (Minute(Range("A" & i)) Mod 3) = 0 Then
Range("A" & i).Interior.ColorIndex = 34 '水色
End If
Next i
End Sub
========================================
作業上少し見やすくなると良いかなあと思って。
========================================
Sub 背景カラー()
Dim 行数, i As Long
行数 = ActiveSheet.Range("A1").End(xlDown).Row
For i = 2 To 行数
If Minute(Range("A" & i)) = 0 Then
Range("A" & i).Interior.ColorIndex = 34 '水色
End If
If (Minute(Range("A" & i)) Mod 3) = 0 Then
Range("A" & i).Interior.ColorIndex = 34 '水色
End If
Next i
End Sub
========================================
為替の1分足データの抜けを探すVBAを作ってみた
Excelで為替のヒストリカルデータを眺めていたら、結構抜けがあることに気づいた。
1分足からほかのチャートにコンバートする際に問題になるだろう。
関数で色々挑戦してみたが、時刻のシリアル値を操作するのは誤差が出て難しかった。
で、必要に迫られてVBAで簡単なプログラムを作った。
目視で調べても良いんだけど、1年分で369564行あるわけで軽く死ねる。
これを何年か分も目視するなんて、無理だ。
で、ラクをしようといろいろと工夫してみた。
だが、VBAが全然わからず、if〜thenとfor next で簡単なものを作るだけで2時間も掛かってしまった。
それでも目視で調べるよりは断然速い……と思う。
時々数字がおかしいものが出るが、異常値だけはじき出せば用が足りるので、これで十分かと。
ソースデータは下記のような構成になっている。
Time Open High Low Close
2015/1/2 0:00 119.666 119.742 119.666 119.741
2015/1/2 0:01 119.741 119.741 119.695 119.7
==============================
Sub データ欠損調査()
Dim 行数, i As Long
Range("B2").Value = True 'trueにしないと欠損データ修復ロジックに影響するため
行数 = ActiveSheet.Range("A1").End(xlDown).Row
For i = 3 To 行数
If DateDiff("n", Range("A" & i), Range("A" & i - 1)) <> -1 Then
Range("B" & i) = Abs(DateDiff("n", Range("A" & i), Range("A" & i - 1)))
Else
Range("B" & i) = "true"
End If
Next i
MsgBox "データ欠損調査終了"
End Sub==============================
1分足からほかのチャートにコンバートする際に問題になるだろう。
関数で色々挑戦してみたが、時刻のシリアル値を操作するのは誤差が出て難しかった。
で、必要に迫られてVBAで簡単なプログラムを作った。
目視で調べても良いんだけど、1年分で369564行あるわけで軽く死ねる。
これを何年か分も目視するなんて、無理だ。
で、ラクをしようといろいろと工夫してみた。
だが、VBAが全然わからず、if〜thenとfor next で簡単なものを作るだけで2時間も掛かってしまった。
それでも目視で調べるよりは断然速い……と思う。
時々数字がおかしいものが出るが、異常値だけはじき出せば用が足りるので、これで十分かと。
ソースデータは下記のような構成になっている。
Time Open High Low Close
2015/1/2 0:00 119.666 119.742 119.666 119.741
2015/1/2 0:01 119.741 119.741 119.695 119.7
==============================
Sub データ欠損調査()
Dim 行数, i As Long
Range("B2").Value = True 'trueにしないと欠損データ修復ロジックに影響するため
行数 = ActiveSheet.Range("A1").End(xlDown).Row
For i = 3 To 行数
If DateDiff("n", Range("A" & i), Range("A" & i - 1)) <> -1 Then
Range("B" & i) = Abs(DateDiff("n", Range("A" & i), Range("A" & i - 1)))
Else
Range("B" & i) = "true"
End If
Next i
MsgBox "データ欠損調査終了"
End Sub==============================
登録:
投稿 (Atom)