libreoffice のマクロを使う

SBI 証券で少しだけ資産運用しています。

一時は 500 万円ほどありましたが、ロシアのウクライナ侵攻で危ないと思い一度すべてを現金化しました。
その後少しずつまた投資を再開しましたが、今でもいろいろと危ないので、現在の合計金額は 180 万円ほどです。

で、SBI 証券の自分のページなどで取引履歴を見たりするのですが、これまで一体いくら利益が出たのかあるいは損したのかを確認するのはちょっと難しいと思います。

取引履歴を csv でダウンロードしても利益が出たかどうかは記載されておらず、ただ売買の金額だけが示されているだけなのです。

ただ、口座管理の My 資産というところから「実現損益」で確認すれば、どれくらいの利益が出たかを確認することができます。しかし、この結果を csv でダウンロードすることはできません。

例えば以下のような情報です。

このデータを csv 化したものが欲しいのですが、そのサービスはまだ提供されていないようです。

そこで、このデータをコピペして libreoffice に貼り付け、それを処理することにしました。

上のデータをコピペして、一度テキストエディタにペーストして、さらにそれをコピーした後に libreoffice に貼り付けると、

これをきちんと整形するためのマクロを作成します。

まず、sheetを追加します。
「Sheet2」にデータが書き込まれます。

以下のようなマクロを作成。


Sub Main

	Dim oDoc As Object
	Dim lastRow As Integer
		
	lastRow = ExampleGetLastCellPosition	
	for i = 0 to lastRow -1 
		gyo = int(i/10)
		retu = i - gyo * 10
		If isNumeric( ThisComponent.Sheets(0).getCellByPosition(0,i).String) then
			ThisComponent.Sheets(1).getCellByPosition(retu, gyo).value = ThisComponent.Sheets(0).getCellByPosition(0,i).string
		Else
			ThisComponent.Sheets(1).getCellByPosition(retu, gyo).string = ThisComponent.Sheets(0).getCellByPosition(0,i).string
		EndIf	
	next i
End Sub

' A列の最終行
Function ExampleGetLastCellPosition() As Integer

       Dim objSheet As Object
       Dim objRange As Object
       Dim objCursor As Object
       
       objSheet = ThisComponent.Sheets(0)
       objRange = objSheet.getCellRangeByName("A1")
       objCursor = objSheet.createCursorByRange(objRange)
       objCursor.gotoEndOfUsedArea(True)
       ExampleGetLastCellPosition = objCursor.Rows.Count
End Function

実は、10数年前に初めて作った大きなプログラムがエクセルのマクロでした。
その時はエクセル・VBAは最高と思っていましたが、今では問題外と思っています。

他の言語に比べてとてもわかりにくいと思います。

上のマクロを実行しますが、日付は文字列のままなので、それを正規表現で日付に変換します。

この正規表現が動くためには、セルの書式設定で第1列を日付にしておく必要があります。

そうすると以下のようになります。

今年の利益は 66 万円ほどあるようですが、売却した株のいくつかは1-2年前に購入したものなので、それほどの利益が出ているわけではありません。