Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@nukie_53

VBA で OneNote のセクション内のページのフォントを変更する

More than 1 year has passed since last update.

はじめに

OneNoteでは、Ctrl+Alt+1で見出し1など、スタイルを設定するショートカットキーは存在するが、そのスタイルをユーザー側では(おそらく)変更できない。

OneNote 2010 まではそのままでも特に気にならなかったが、OneNote 2016 のスタイルが個人的に見にくかったため、それらを一括変更するために以下のマクロを作成した。
ページ単位だと数が多いと面倒だったため、セクション単位で変更するようにしている。

デスクトップ版 OneNote 自体があと6年もすればサポート完全終了なので、それ以降どうするのか、という話はあるけれど……。

コード

最前面にあるセクションから、子どものページを取得し、設定されているフォントを置き換えている(フォント指定はハードコード)。

コード中にも記載しているが、Microsoft OneNote 15.0 Object Libraryなどの参照設定が無いと動かない点に注意。

imihito_Sandbox/M_ChangeOneNoteFont.bas at master · imihito/imihito_Sandbox

'https://github.com/imihito/imihito_Sandbox/blob/master/OneNote/M_ChangeOneNoteFont.bas

'以下の参照設定は必須。
'OneNote = Microsoft OneNote 15.0 Object Library

Public Sub ChangeOneSectionFont()
    'OneNote 取得。
    Dim appOne As OneNote.Application
    Set appOne = VBA.CreateObject("OneNote.Application")

    '最前面のセクションの ID を取得。
        'appOne の型を明示しないと以下のエラーが発生する。
            'オートメーション エラーです。
            'ライブラリは登録されていません。
    Dim sectId As String
    sectId = appOne.Windows.CurrentWindow.CurrentSectionId

    'セクションのページを示した XML 文字列を取得。
    Dim hierarchyXml As String
    appOne.GetHierarchy sectId, OneNote.HierarchyScope.hsPages, hierarchyXml

    'XML DOM としてロード。
    Dim hierarchyXmlDoc As Object 'As MSXML2.DOMDocument
    Set hierarchyXmlDoc = newXmlDoc(hierarchyXml)

    'ページを取得し、それぞれのフォントを変更。
    Dim node As Object 'As MSXML2.IXMLDOMNode
    For Each node In hierarchyXmlDoc.getElementsByTagName("one:Page")
        ChangeOnePageFont appOne, node.Attributes.getNamedItem("ID").NodeValue
    Next node

End Sub


Public Sub ChangeOnePageFont( _
        inAppOne As OneNote.Application, _
        inPageId As String _
    )

    'ページの内容を取得。
    Dim contentsBuf As String
    inAppOne.GetPageContent inPageId, contentsBuf

    'XML DOM としてロード。
    Dim pageXml As Object 'As MSXML2.DOMDocument
    Set pageXml = newXmlDoc(contentsBuf)

    'スタイルのフォントを変更。
    Const BaseFont = "游ゴシック"
    Const NewFont = "Meiryo UI"

    'BaseFont が指定されているスタイルについてフォントを変更する。
    Dim node As Object 'As MSXML2.IXMLDOMNode
    For Each node In pageXml.SelectNodes("//one:QuickStyleDef[@font='" & BaseFont & "']")
        node.Attributes.getNamedItem("font").NodeValue = NewFont
    Next node


    '変更内容を書き戻し。
    inAppOne.UpdatePageContent pageXml.XML

End Sub

'MSXML2 = Microsoft XML, v3.0
Private Function newXmlDoc(inXmlString As String) As Object 'As MSXML2.DOMDocument
    Dim xmlDoc As Object 'As MSXML2.DOMDocument
    Set xmlDoc = VBA.CreateObject("MSXML2.DOMDocument")
    xmlDoc.LoadXML inXmlString
    Set newXmlDoc = xmlDoc
End Function
4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
nukie_53
Excel・PowerPoint の VBA、Windows PowerShell がメインの人です。 Word・Outlook の VBA も多少は読めます。 データベース関連や、管理用途の PowerShell は経験なし。 PowerShell の延長で、C# も雰囲気は読める感じです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?