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

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

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

More than 1 year has passed since last update.



OneNote 2010 まではそのままでも特に気にならなかったが、OneNote 2016 のスタイルが個人的に見にくかったため、それらを一括変更するために以下のマクロを作成した。

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



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

imihito_Sandbox/M_ChangeOneNoteFont.bas at master · imihito/imihito_Sandbox


'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
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
Excel・PowerPoint の VBA、Windows PowerShell がメインの人です。 Word・Outlook の VBA も多少は読めます。 データベース関連や、管理用途の PowerShell は経験なし。 PowerShell の延長で、C# も雰囲気は読める感じです。


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