渓のライフマネジメント日記

日々の活動と雑感をゆるゆると記録するところです。みんなHAPPYになっちゃえ。

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とかに出す奴ならもっと頑張るべきでしょう。

もちろん、無駄のない美しい処理にも憧れはあります。が、今回の目的は凝ったプログラムを作ることではありません。

 

必要な処理ができているのだから、悔しいですがここはひとまず完成としましょう。 

 

 

何故なら、小さなことの積み重ねで直していくことも大事ですが、より大きなループのほうが、大きく影響する何かを発見する確率が高く、より大事なのです。

小さな完成を積み重ねて、次の仕事に移るのは、決して小さな課題をないがしろにしているわけではないのです。 

 

より遠い旅のほうが人を成長させるのに似ていますね。

 

とうわけで、いくつかの課題の残ったこのスクリプトは一旦エディタを閉じて完成としましょう。その日までさよならスクリプトよ。

 

 twitter.com