Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

ExcelからコピペでObsidianにテーブルとして貼り付けるためのマクロ

Personal Knowlegde ManagementツールのObsidianが楽しくて、ここ数日はExcelをそっちのけで色々といじっています。

obsidian.md

今回はObsidianを使っている中で、マクロを作成することでちょっと楽できるネタが有りましたのでご紹介。



テーブルにならない

今回のネタはタイトルにもある通り、ExcelのデータをコピペしてもObsidianでテーブル形式に整形してくれない点をマクロで解消しようと思います。


Obsidianとは

Obsidianとは「A second brain,for you, forever.」を謳う、Markdownメモ作成・管理ツールです。

この管理の側面がPersonal Knowlegde Managementツールとして面白いところだとは思うのですが、本題から外れますので割愛。


Markdown記法

ObsidianにはMarkdown記法を用いて文章記載していきます。

www.markdown.jp

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」とコメントのある箇所は下記サイトを参考いたしました。

excel-ubara.com


処理内容

選択範囲の値を配列に取り込んだ後は、テキストに変換するために値を全部結合して1つの文章に変換しています。

  1. 選択範囲を配列に取り込む
  2. テーブル内の文章の配置位置を設定。選択範囲1行目の文章の配置位置をそのまま設定する
  3. セルの値を結合して1つ文章にする。結合する際にMarkdownテーブル記法である『|』を後ろに追加している
  4. 処理している位置が1列目の場合、前に『|』を追加。最終列の場合は『vbcrlf』を後ろに追加。


上図のような範囲をコピーしてからマクロを実行すると、下図のようなテキストがコピーされます。

まとめ

表はExcelで作成してしまえば、簡単にMarkdown記法のテーブルが作成出来ますので手間が省けます。

Markdownが正式にExcelからのテーブル形式コピペに対応するまでこれで切り抜けます。

と思ったら、Obsidianのプラグインでそっくりそのままな機能を持ったやつがありますね。

github.com