がらぱっぱ

自分用覚え書き中心(モバイル関係中心だったはずが)

くらしTEPCOの使用量をEXCELに一括ダウンロードして張り付けるマクロを作ってみた

東京電力と契約していると、毎月・毎日・毎30分の使用量と料金(料金は月単位だけど)がCSVでダウンロードできます。
Webでグラフが見えたり、1年前とか・他の家庭の平均とかとグラフで比較できたりして結構便利です。
でも、細かい不満もあって自分でデータを加工したいなぁと
CSVでダウンロードできるのですがちょっと使いづらいのでまとめてダウンロードしてEXCELに貼り付けるツールを作ってみました。
※ダウンロードといってもCSVをファイルで保存するのではなく、直接EXCELに貼り付けます。

くらし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か月分)とかダウンロードしたいときなんども
日付選択して、ダウンロードボタンを繰り返すのは苦痛です。

電力会社移ったらデータわからなくなっちゃうの?

変更前と変更後の比較とかもしたいじゃないですか。
CSVの形式多少違ってもEXCELならちょちょちょいとデータ加工できるし。

ということでEXCELマクロで一括ダウンロードするツール作ろう

前提(OSやOffice)

Windows 10 64bit
Microsoft Office 2016 32bit版

参考にしたサイト

s-kawakami.hatenablog.jp

こんなことして大丈夫?

よく、解析して情報抜き取る(スクレイピング)はダメとかありますよね。
一応規約とかを確認する
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指定している。
必要に応じてシートから読み取ってセットするとかのロジックが必要。
もちろんソースにそのまま書いてもよい

ざっくりとした動作

ダウンロードタイプに従って、指定した期間内の電力量のCSVをダウンロードし、EXCELのシートに貼り付ける。
期間内でまたがる複数のCSVデータをくっつけてシートに貼り付け。

制約というか妥協

・シートのクリアや書式設定とかはしてないので別途設定する必要あり。
 地点番号とか数値とみなされて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

ソースの解説

そのうち気が向いたらする。
きっと誰も見てないと思うが

グラフにしたりもうちょとUIかんがえたバージョン

ユーザ・パスワード、開始・終了、ダウンロードタイプ(プルダウン)をシートで設定して、ダウンロードボタン押すと
シートにCSV張り付けて、グラフ書くようなやつ、EXCELのブックで作ってる。
でも、公開できるのかな?