くらしTEPCOの使用量をEXCELに一括ダウンロードして張り付けるマクロを作ってみた
東京電力と契約していると、毎月・毎日・毎30分の使用量と料金(料金は月単位だけど)がCSVでダウンロードできます。
Webでグラフが見えたり、1年前とか・他の家庭の平均とかとグラフで比較できたりして結構便利です。
でも、細かい不満もあって自分でデータを加工したいなぁと
CSVでダウンロードできるのですがちょっと使いづらいのでまとめてダウンロードしてEXCELに貼り付けるツールを作ってみました。
※ダウンロードといってもCSVをファイルで保存するのではなく、直接EXCELに貼り付けます。
- くらしTEPCOってなに?使用量ってなんだ?
- Web画面も結構便利なんですけど、ちょっと不満が
- ということでEXCELマクロで一括ダウンロードするツール作ろう
- 仕様
- で、ソース
- ソースの解説
- グラフにしたりもうちょとUIかんがえたバージョン
くらしTEPCOってなに?使用量ってなんだ?
東京電力と契約をしていると、くらしTEPCOWebという会員ページにアクセスできるようになります。
※私の場合は電気の契約とは別に会員登録が必要でした。
ログインIDとパスワードを通知してもらい(SMSとかはがき)ログインできるようになります。
www.kurashi.tepco.co.jp
昔はでんき家計簿という名前でしたが、電力自由化に伴い新たにくらしTEPCOWebとなったようです。
料金プランや契約内容の確認や変更、電気の使用量の状況が見れます。
使用量というのはざっくりいうとどれくらい電気を使ったのかって事ですね。これがWebでわかります。
電力自由化に伴い各家庭にスマートメーターが順次設置されていますが、このスマートメーターが30分毎に検針値を送っています。
このおかげで30分毎に電気の使用量がわかるというわけです。
昔は月に一回検針員がメーターを読むだけだったのが30分毎にわかるので、自分がどんな使い方しているのかいつ電気たくさん使ってるのかが
昔よりもわかりやすくなったということですね。
Web画面も結構便利なんですけど、ちょっと不満が
こんな不満があります。
画面で見れる範囲が2年分まで(CSVでダウンロードも?)
まぁ、2年以内に東京電力以外に変わる可能性大なんですけどね。
でも2年以上たつと消えちゃうし、別電力に変えると見れなくなっちゃう可能性大だし。
やはりデータを取っておきたいですよねー。
画面で見れる範囲しかCSVでダウンロードできない
つまり
・月毎の電力量(と料金)は年単位で12か月分
・日毎の電力量は1か月分(30日とか31日分)
・30分毎の電力量は1日分(48コマ分)
なのです。
月毎はまだいいとして、日毎で一年分とか、30分毎で1週間分(や1か月分)とかダウンロードしたいときなんども
日付選択して、ダウンロードボタンを繰り返すのは苦痛です。
ということでEXCELマクロで一括ダウンロードするツール作ろう
前提(OSやOffice)
Windows 10 64bit
Microsoft Office 2016 32bit版
参考にしたサイト
こんなことして大丈夫?
よく、解析して情報抜き取る(スクレイピング)はダメとかありますよね。
一応規約とかを確認する
www.kurashi.tepco.co.jp
大丈夫そうです。さすがTEPCO、太っ腹
まぁ、ネットワーク妨害となるような大量のダウンロードは避けたほうがいいとは思いますが。
仕様
Public Sub TepcoDownload(StartDate As Date, EndDate As Date, DLtype As Integer)
関数名
TepcoDownload
引数
StartDate 開始日、Date型
StartDate 終了日、Date型
DLtype ダウンロードタイプ 0:月単位(年指定)1:日単位(月指定)、2:30分毎(日指定)
その他設定
くらしTEPCOWebのログインIDとパスワードはUserNameとPasswordというグローバル変数でConst指定している。
必要に応じてシートから読み取ってセットするとかのロジックが必要。
もちろんソースにそのまま書いてもよい
制約というか妥協
・シートのクリアや書式設定とかはしてないので別途設定する必要あり。
地点番号とか数値とみなされて0で始まったりすると0がなくなったり右寄せになったりするのでセルの書式を文字列にしとく必要あり。
具体的にはあらかじめA列~H列を文字列として書式設定しておけばいいかな。
・カレントシートへ書き込むだけなので、必要に応じてシートの選択が必要。
・CSVのちぎり方もすごく手抜き。カンマは必ず区切りとみなす。ダブルクォーテーションも必ず文字列くくりとみなす。
で、ソース
標準モジュールで以下貼り付け
Option Explicit Public UserName As String Public PassWord As String 'くらしTEPCOのページから30分値を取得する(まとめて) '参考 http://s-kawakami.hatenablog.jp/entry/2017/05/21/032253 'DLtype 0:月単位(年指定)1:日単位(月指定)、2:30分毎(日指定) Public Sub TepcoDownload(StartDate As Date, EndDate As Date, DLtype As Integer) Dim session As Object Dim d As Date 'ループカウンタ Dim downloadURL As String 'ダウンロードURL(組み立て) Dim lineData As Variant Dim i As Integer Dim wRow As Long Set session = CreateObject("MSXML2.ServerXMLHTTP") '認証 '一度トップページにアクセス ' session.Open "GET", "https://www.kurashi.tepco.co.jp/kpf-login", False ' session.Send 'ログイン POST session.Open "POST", "https://www.kurashi.tepco.co.jp/kpf-login", False session.setRequestHeader "Referer", "https://www.kurashi.tepco.co.jp/kpf-login" session.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" session.Send "ACCOUNTUID=" & UserName & "&PASSWORD=" & PassWord & "&HIDEURL=/pf/ja/pc/mypage/home/index.page?&LOGIN=EUAS_LOGIN" If session.Status <> 200 Then MsgBox "認証でエラーが発生しました:" & session.Status, vbCritical + vbSystemModal Exit Sub End If 'CSV 取得前に使用量ページのアクセスが必要らしい session.Open "GET", "https://www.kurashi.tepco.co.jp/pf/ja/pc/mypage/learn/comparison.page", False session.Send wRow = 1 d = StartDate Do downloadURL = "https://www.kurashi.tepco.co.jp/pf/ja/pc/mypage/learn/comparison.page?ReqID=CsvDL&year=" & Year(d) Select Case DLtype Case 1 '日毎の場合は月単位でダウンロード downloadURL = downloadURL & "&month=" & Month(d) Case 2 '30分の場合は日単位でダウンロード downloadURL = downloadURL & "&month=" & Month(d) & "&day=" & Day(d) End Select 'ファイルのダウンロード session.Open "GET", downloadURL, False 'キャッシュ対策 session.setRequestHeader "Pragma", "no-cache" session.setRequestHeader "Cache-Control", "no-cache" session.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" session.Send Select Case session.Status Case 200 'CSVデータを取り込み行ごとに分割する lineData = Split(StrConv(session.responseBody, vbUnicode), vbCrLf) '契約外の期間はデータが一行もない? If UBound(lineData) > 0 Then If wRow = 1 Then Call setCSVline(wRow, lineData(0)) wRow = wRow + 1 End If For i = 1 To UBound(lineData) - 1 Call setCSVline(wRow, lineData(i)) wRow = wRow + 1 Next End If Case Else MsgBox "エラーが発生しました:" & session.Status, vbCritical + vbSystemModal Exit Sub End Select Select Case DLtype Case 0 d = DateSerial(Year(d) + 1, 1, 1) Case 1 d = DateSerial(Year(d), Month(d) + 1, 1) Case 2 d = DateSerial(Year(d), Month(d), Day(d) + 1) End Select If d > EndDate Then Exit Do Loop MsgBox "ダウンロードしました" Set session = Nothing End Sub 'CSV一行を分割してセルにセットする(手抜き) 'カンマで分割、ダブルクォーテーションは文字の前後にしか入っていない前提 Private Sub setCSVline(wRows As Long, csvString) Dim s Dim i As Integer Dim wCol As Integer Dim cellStr As String s = Split(csvString, ",") wCol = 1 cellStr = "" For i = 0 To UBound(s) '前の列にカンマがあった場合前の文字列と合わせる cellStr = cellStr + s(i) If Left(cellStr, 1) = """" And Right(cellStr, 1) <> """" Then '先頭がダブルクォートで最後が違う場合、データにダブルクオートが入っているとみなす cellStr = cellStr + "," Else Cells(wRows, wCol) = Replace(cellStr, """", "") cellStr = "" wCol = wCol + 1 End If Next End Sub
ソースの解説
そのうち気が向いたらする。
きっと誰も見てないと思うが