LINE Payの履歴をエクセルのデータにしてみよう2
前回はLINE Payの支払い履歴をエクセルに取り込んでみました。
残りの処理も記述していきますよ。
ポイント利用時の処理
前回はポイント獲得時の処理を作りました。ほとんどコピペで同様に処理すればポイント利用時の処理もできそうですよね。
16:35 LINEウォレット LINEギフト:商品購入で1032ポイント利用しました
という文字列になっているので、ほとんど同じ処理で対応できそうですよね。
前回は「ポイント獲得」でジャッジしていましたが、これだと例えば「ポイント獲得」を含むキャンペーンやサービスなどでポイントを獲得した場合、処理がバグってしまう可能性を秘めています。
そこで、今回は「ポイント利用し」までの文字列で判定することにしましょう。
If InStr(rowdata(i), "ポイント利用し") > 0 Then
PointNum = Empty
For m = 1 To Len(rowdata(i)) - InStr(rowdata(i), "ポイント利用し")
NumSet = Mid(rowdata(i), InStr(rowdata(i), "ポイント利用し") - m, 1)
If IsNumeric(NumSet) = True Then
PointNum = Mid(rowdata(i), InStr(rowdata(i), "ポイント利用し") - m, 1) & PointNum
Else: GoTo continue_PointR:
End If
Next m
continue_PointR:
Sheets("log").Activate
Past = 1
Do While IsDate(Left(Cells(n - Past, 1).Value, 10)) = False
Past = Past + 1
Loop
RecDate = Left(Cells(n - Past, 1).Value, 10) '日付GET
Sheets("LINEPAY").Activate
LineSubject = Mid(linelog(n), InStr(linelog(n), "LINEウォレット") + 16, InStr(linelog(n), "ポイント利用し") - InStr(linelog(n), "LINEウォレット") - 17 - Len(Format(PointNum, "###0")))
Cells(RowCount, 1).Value = "LINEPAY"
Cells(RowCount, 2).Value = RecDate
Cells(RowCount, 3).Value = Replace(Replace(LineSubject, " ", " "), " ", " ")
Cells(RowCount, 4).Value = PointNum
Cells(RowCount, 5).Value = "出金"
RowCount = RowCount + 1
End If
これでどうでしょう。
LINEPAY 2020/2/11 LINEギフト:商品購入 1,032 出金
出力完璧ですね。
余談ですが、半角スペースが結構邪魔だったので、Replace(Replace(LineSubject, " ", " "), " ", " ")で数を減らしています。
LINE Pay関連の処理
さて、続けて処理を作っていきます。このままコピペして作っても良いのですが、今後はLine Pay以外の電子マネーにも対応していきたいところです。
というわけでそろそろ無駄なSplitの処理は削りたいと思います。分割したはいいけど、なんの判定もしてないし。
サンプルとなるデータはコレです。
08:42 LINEウォレット "LINE Pay お支払い 428 円
キーワードが「LINE Pay」だけだと、様々なケースで誤作動してしまうので、まずは「LINEウォレット」と「LINE Pay」のAND条件でスクリーニングしましょう。
If InStr(linelog(n), "LINEウォレット") * InStr(linelog(n), "LINE Pay ") > 0 Then
この数式は、InStr()を使うことで、検索語が存在する場合には0超の自然数を返し、存在しない場合には0を返します。つまり、これらを乗算することで、AND条件を判定することができるのですね。
額面の取得
額面部分は「 円」の前の額面を拾えば問題ないでしょう。1文字ずつ前の数字を拾っていきます。
For m = 1 To InStr(linelog(n), " 円")
NumSet = Mid(linelog(n), InStr(linelog(n), " 円") - m, 1)
If IsNumeric(NumSet) Or InStr(NumSet, ",") <> 0 = True Then
PointNum = Mid(linelog(n), InStr(linelog(n), " 円") - m, 1) & PointNum
Else: GoTo continue_PayOut:
End If
Next m
continue_PayOut:
入出金の区別
これで一応動作するのですが、
08:41 LINEウォレット "LINE Pay チャージ 1,000 円
の場合は、入出の区分が「入金」になるよう細工しなければなりません。同じく、「LINE Pay 獲得」というポイントバックのときも「入金」になるので、一旦「出金」を入力した後、「入金」になるケースだけで上書きするようにしておきましょう。
また、この判定のついでにLineSubjectも取得しておきましょう。
Cells(RowCount, 5).Value = "出金"
If InStr(linelog(n), "LINE Pay 獲得") <> 0 Then
LineSubject = Mid(linelog(n), InStr(linelog(n), "LINEウォレット"), InStr(linelog(n), " P") - InStr(linelog(n), "LINE Pay 獲得") + 10 - Len(Format(PointNum, "###0")))
Cells(RowCount, 5).Value = "入金"
ElseIf InStr(linelog(n), "LINE Pay チャージ") <> 0 Then
LineSubject = Mid(linelog(n), InStr(linelog(n), "LINEウォレット"), InStr(linelog(n), " 円") - InStr(linelog(n), "LINE Pay チャージ") + 16 - Len(Format(PointNum, "###0")))
Cells(RowCount, 5).Value = "入金"
単位がPの場合の額面取得
とここまで作って気づいたのですが、「LINE Pay獲得」の際の単位は「P」なんですね。ポイントだから当然ですが・・・
正直もうポイントはしょぼいし無視していいんじゃないかな・・・
という疑念がよぎりましたが、作ることにします。
blog書いてなかったらきっと作ってないですね。
何故面倒くさがっているかというと、「 円」のときと同じように「 P」で処理しようとすると、常に「LINEPAY」をで検出してしまいます。この擬陽性を回避するために、「 P」の場合だけは
19:33 LINEウォレット "LINE Pay 獲得 333 P
この、「LINE Pay獲得」の2文字後ろから算定する方式に変える必要があるのですね。
If InStr(linelog(n), "LINE Pay 獲得") <> 0 Then 'ポイントのやつ
For m = 1 To Len(linelog(n)) - InStr(linelog(n), "LINE Pay 獲得") - 12
NumSet = Mid(linelog(n), InStr(linelog(n), "LINE Pay 獲得") + 11 + m, 1)
If IsNumeric(NumSet) Or InStr(NumSet, ",") <> 0 = True Then
PointNum = PointNum & Mid(linelog(n), InStr(linelog(n), "LINE Pay 獲得") + 11 + m, 1)
Else: GoTo continue_PayOut:
End If
Next m
End if
ここまで作って気が付いたのですが、「LINE Pay お支払い」「LINE Pay チャージ 」「LINE Pay 獲得」から後ろをそれぞれ同様に処理すれば同じルーチンで額面が取得できたのですね。
まあいいや。よくあること。
一個のプログラムに、統率の取れない処理があると、どうしても直したい気持ちになります。きちんと作ればメンテナンスはかなり楽になるでしょう。この気持ちは非常に大事です。新たなるスキルアップにつながります。Git hubやQiitaとかに出す奴ならもっと頑張るべきでしょう。
もちろん、無駄のない美しい処理にも憧れはあります。が、今回の目的は凝ったプログラムを作ることではありません。
必要な処理ができているのだから、悔しいですがここはひとまず完成としましょう。
何故なら、小さなことの積み重ねで直していくことも大事ですが、より大きなループのほうが、大きく影響する何かを発見する確率が高く、より大事なのです。
小さな完成を積み重ねて、次の仕事に移るのは、決して小さな課題をないがしろにしているわけではないのです。
より遠い旅のほうが人を成長させるのに似ていますね。
とうわけで、いくつかの課題の残ったこのスクリプトは一旦エディタを閉じて完成としましょう。その日までさよならスクリプトよ。