Personal Knowlegde ManagementツールのObsidianが楽しくて、ここ数日はExcelをそっちのけで色々といじっています。
今回はObsidianを使っている中で、マクロを作成することでちょっと楽できるネタが有りましたのでご紹介。
テーブルにならない
今回のネタはタイトルにもある通り、ExcelのデータをコピペしてもObsidianでテーブル形式に整形してくれない点をマクロで解消しようと思います。
Obsidianとは
Obsidianとは「A second brain,for you, forever.」を謳う、Markdownメモ作成・管理ツールです。
この管理の側面がPersonal Knowlegde Managementツールとして面白いところだとは思うのですが、本題から外れますので割愛。
Markdown記法
ObsidianにはMarkdown記法を用いて文章記載していきます。
Markdownは文章に装飾文字を追加することで、ただのテキストファイルにも関わらず様々な見え方・機能を追加することが出来ます。
例えば、**太字** と記載すると 太字 で表示することが出来ます。
Markdownテーブル表記
Markdown記法の中にはテキストファイルなのに表形式表示するための記法があります。
このように記載すると、下図のように表形式で表示されます。
県名 | 人数 |
---|---|
大阪府 | 12 |
兵庫県 | 9 |
京都府 | 5 |
Excelからコピペ
この表形式、Excelの表をコピーして貼り付けたときにも表になったら便利だと思いません?
実際他のMarkdownエディタではExcelのデータをコピペすると自動で表形式に変換してくれるものがあります。
ところがObsidianではExcelコピペしても表形式にはなりません。
- Excelデータをそのままコピペ
- プレーンテキストとしてペースト
2つ目に関しては惜しいのですが、表形式にはなっていません。 これをExcelからコピペで表形式になるようなマクロを作成します。
都道府県 | 男-O型 |
---|---|
三重県 | 17 |
京都府 | 12 |
佐賀県 | 5 |
コード全文
'Microsoft Forms 2.0 Object Libraryを参照設定 Sub ExcelToObsidian() Dim vv取込範囲 As Range: Set vv取込範囲 = Selection If vv取込範囲.Count = 1 Then Exit Sub Dim myVar As Variant: myVar = vv取込範囲.Value Dim RowsCount As Long: RowsCount = UBound(myVar, 1) Dim ColsCount As Long: ColsCount = UBound(myVar, 2) Dim vvObsidianSendText As String Dim HAlignment As String Dim i As Long Dim n As Long 'テーブル形式の2行目、位置指定の設定 HAlignment = "|" For n = 1 To ColsCount Select Case vv取込範囲.Cells(1, n).HorizontalAlignment Case Is = xlLeft HAlignment = HAlignment & ":---|" Case xlCenter HAlignment = HAlignment & ":---:|" Case xlRight HAlignment = HAlignment & "---:|" Case Else HAlignment = HAlignment & "---|" End Select Next HAlignment = HAlignment & vbCrLf 'ヘッダー部分・本体部分の設定 For i = 1 To RowsCount For n = 1 To ColsCount If n = 1 Then vvObsidianSendText = vvObsidianSendText & "|" vvObsidianSendText = vvObsidianSendText & myVar(i, n) & "|" If n = ColsCount Then vvObsidianSendText = vvObsidianSendText & vbCrLf Next If i = 1 Then vvObsidianSendText = vvObsidianSendText & HAlignment Next ' SetClipboard With New DataObject .SetText vvObsidianSendText .PutInClipboard End With End Sub
上記コードを標準モジュールに記載して実行すると、選択範囲の値をMarkdownのテーブル形式に変換して、クリップボードにコピーします。
後はコピーされているデータをObsidianに貼り付ければ無事にテーブル形式で貼り付けることが出来ます。
セルを1つしか選択していない場合は処理をキャンセルしています。
コード内、「SetClipboard」とコメントのある箇所は下記サイトを参考いたしました。
処理内容
選択範囲の値を配列に取り込んだ後は、テキストに変換するために値を全部結合して1つの文章に変換しています。
- 選択範囲を配列に取り込む
- テーブル内の文章の配置位置を設定。選択範囲1行目の文章の配置位置をそのまま設定する
- セルの値を結合して1つ文章にする。結合する際にMarkdownのテーブル記法である『|』を後ろに追加している
- 処理している位置が1列目の場合、前に『|』を追加。最終列の場合は『vbcrlf』を後ろに追加。
上図のような範囲をコピーしてからマクロを実行すると、下図のようなテキストがコピーされます。
まとめ
表はExcelで作成してしまえば、簡単にMarkdown記法のテーブルが作成出来ますので手間が省けます。
Markdownが正式にExcelからのテーブル形式コピペに対応するまでこれで切り抜けます。
と思ったら、Obsidianのプラグインでそっくりそのままな機能を持ったやつがありますね。