OneNoteをVBAでいじる - 本文を書き換える - サブルーチン
まず、共通のサブルーチンを標準モジュールに貼り付けてください。
OneNoteには、「書き換え用ページ」を作成し、何かの本文を入力してください。
何かを入れないと、書き換える場所が判断できず、エラーとなります。
下図のようなページにしてください。

Public Sub UpdatePage2(ByVal id As String, ByVal Body As String)
Dim oneNote As oneNote.Application2
Dim outXML As String
Dim lBuf As Long
Dim cdataStartPos As Long
Dim cdataEndPos As Long
Dim headder As String
Dim footer As String
If id = "" Then
Exit Sub
End If
Set oneNote = New oneNote.Application2
oneNote.GetPageContent id, outXML, piAll, xsCurrent
'本文の開始位置を取得
cdataStartPos = InStr(outXML, "<one:Outline")
'本文内のCDATAセクション位置を取得
cdataStartPos = InStr(cdataStartPos + 1, outXML, "<![CDATA[")
cdataEndPos = cdataStartPos + 1
Do
'本文内のCDATAセクションの終わりの位置を取得
lBuf = InStr(cdataEndPos + 1, outXML, "]]>")
If lBuf > 0 Then
cdataEndPos = lBuf
Else
Exit Do
End If
Loop
'本文以前のxmlをheadderとして取得
headder = Left(outXML, cdataStartPos + 8)
'本文以後のxmlをfooterとして取得
footer = Right(outXML, Len(outXML) - cdataEndPos + 1)
'headderと書き換える本文とfooterで、今のページを更新
oneNote.UpdatePageContent headder & Body & footer
End Sub
OneNoteをVBAでいじる - ページxmlの独自解析
下に抽出したxmlを掲載します。
[ノートシール]
自分は良く、タイトルにノートシールを貼ります。見た目ですね・・・。

こんな感じでノートシールは設定しています。
そして、xml内を確認すると、3行目に
のタグがあります。このタグ内のtypeがノートシールの番号、nameが自分が設定した名称だと推測できます。
[自分の入力した情報]
<![CDATA[ から ]]>内に入っています。これはxmlのCDATAセクションです。
[本文]
本文という言い方が正しいか不明ですが、
ですから本文をVBAで書き換えるためには、
<?xml version="1.0"?>
<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2013/onenote" ID="{123E4EFF-5678-901C-2345-67B89012345F}{6}{E78901234567890123456789012345678901234567890}" name="*添付ファイル" dateTime="2017-08-10T07:12:01.000Z" lastModifiedTime="2017-08-13T05:22:22.000Z" pageLevel="1" isCurrentlyViewed="true" selected="partial" lang="ja">
<one:TagDef index="0" type="2" symbol="107" fontColor="automatic" highlightColor="none" name="Mail"/>
<one:QuickStyleDef index="0" name="PageTitle" fontColor="automatic" highlightColor="automatic" font="游ゴシック" fontSize="20.0" spaceBefore="0.0" spaceAfter="0.0"/>
<one:QuickStyleDef index="1" name="p" fontColor="automatic" highlightColor="automatic" font="游ゴシック" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/>
<one:PageSettings RTL="false" color="automatic">
<one:PageSize>
<one:Automatic/>
</one:PageSize>
<one:RuleLines visible="false"/>
</one:PageSettings>
<one:Title showDate="false" showTime="false" selected="partial" lang="ja">
<one:OE author="User U" authorInitials="UU" authorResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxx="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" lastModifiedBy="User U" lastModifiedByInitials="UU" lastModifiedByResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxxx"/></resolutionId>" creationTime="2017-08-13T05:17:12.000Z" lastModifiedTime="2017-08-13T05:17:12.000Z" objectID="{xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}{xx}{B0}" alignment="left" quickStyleIndex="0" selected="partial">
<one:Tag index="0" completed="true" disabled="false" creationDate="2017-08-13T05:16:33.000Z" completionDate="2017-08-13T05:16:33.000Z"/>
<one:T selected="all">
<![CDATA[
<span lang=en-US>
*
</span>
<span lang=ja>
添付ファイル
</span>
]]>
</one:T>
</one:OE>
</one:Title>
<one:Outline author="User U" authorInitials="UU" lastModifiedBy="User U" lastModifiedByInitials="UU" lastModifiedTime="2017-08-13T05:16:46.000Z" objectID="{xxxxxxxxxxxxxxxxxx-xxxx-xxxxxxxxxxxxx}{xx}{B0}">
<one:Position x="36.0" y="68.4000015258789" z="0"/>
<one:Size width="105.75" height="101.6111755371094"/>
<one:Indents>
<one:Indent level="0" indent="1.05364627395842E-30"/>
</one:Indents>
<one:OEChildren>
<one:OE authorResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" lastModifiedByResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" creationTime="2017-08-10T07:12:42.000Z" lastModifiedTime="2017-08-10T07:12:44.000Z" objectID="{xxxxxxxxxxxxxxxxxx-xxxx-xxxxxxxxxxxxx}{14}{B0}" alignment="left" quickStyleIndex="1">
<one:T>
<![CDATA[これはテスト]]>
</one:T>
</one:OE>
<one:OE authorResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" lastModifiedByResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" creationTime="2017-03-09T00:18:44.000Z" lastModifiedTime="2017-08-13T05:16:41.000Z" objectID="{xxxxxxxxxxxxxxxxxx-xxxx-xxxxxxxxxxxxx}{23}{B0}" alignment="left">
<one:InsertedFile pathCache="C:\Users\user\AppData\Local\Microsoft\OneNote\16.0\cache\00001AL8.bin" pathSource="C:\Temp\OneNoteAttachments\エクセル1.xlsx" preferredName="エクセル1.xlsx"/>
</one:OE>
<one:OE authorResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" lastModifiedByResolutionID="<resolutionId provider="Windows Live" hash="xxxxxxxxxxxxxxxxxxxxxxxx=="><localId cid="xxxxxxxxxxxxxxxx"/></resolutionId>" creationTime="2017-03-08T04:52:45.000Z" lastModifiedTime="2017-08-10T07:12:33.000Z" objectID="{xxxxxxxxxxxxxxxxxx-xxxx-xxxxxxxxxxxxx}{46}{B0}" alignment="left" quickStyleIndex="1" lang="en-US">
<one:T>
<![CDATA[2017/3/8]]>
</one:T>
</one:OE>
</one:OEChildren>
</one:Outline>
</one:Page>
OneNoteをVBAでいじる - ページxmlの独自解析 - ページ内容の抽出(xml形式)
これは、自分が独自で解析したものですので、正しくない場合があります。色々と探しているのですが、見つけ方が悪いのか、VBAでxml形式でページデータを取得した場合の、タグの意味が見つかりません。
下記のコードを実行すると、tempフォルダに 年_月_日_時_分.txt ファイルが作成されます。これは、OneNote内のページを表現しているxml形式のデータとなります。(多分)
Public Sub SavePageContents()
Dim oneNote As oneNote.Application2
Dim outXML As String
Dim objFso As Object
Dim objFile As Object
Dim szBuf As String
Dim szFileName As String
Dim pageID As String
pageID = "GetPageIDで取得した、あなたのページID"
Set oneNote = New oneNote.Application2
oneNote.GetPageContent pageID, outXML, piAll, xsCurrent
szFileName = TempFolder & "\" & Format(Now(), "yyyy_mm_dd_hh_nn") & ".txt"
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile(szFileName, FOR_APPENDING, True, UNICODE)
objFile.WriteLine outXML
objFile.Close
Set objFile = Nothing
Set objFso = Nothing
End Sub
OneNoteをVBAでいじる - ページの添付ファイル情報を取得する
まずは、標準モジュールの先頭に下記のコードを貼り付けてください。
Public Type AttachedFileInfoType
pathCache As String
preferredName As String
End Typeユーザ定義型で、添付ファイル情報を取得します。
pathCacheは、実ファイルが保存されている場所、preferredNameは、実ファイル名となります。
次に、標準モジュールに下記のコードを貼り付けてください。
Public Function GetAttachedFileInfo(ByVal pageID As String) As AttachedFileInfoType()
Dim result() As AttachedFileInfoType
Dim oneNote As oneNote.Application2
Dim doc As Object
Dim nodes As MSXML2.IXMLDOMNodeList
Dim node As MSXML2.IXMLDOMNode
Dim outXML As String
Dim count As Integer
If pageID = "" Then
Exit Function
End If
Set oneNote = New oneNote.Application2
oneNote.GetPageContent pageID, outXML, piAll, xsCurrent
Set doc = CreateObject("Msxml2.DOMDocument")
Call doc.loadXML(outXML)
Set nodes = doc.DocumentElement.SelectNodes("//one:InsertedFile")
count = -1
For Each node In nodes
count = count + 1
ReDim Preserve result(count) As AttachedFileInfoType
result(count).pathCache = node.Attributes.getNamedItem("pathCache").nodeValue
result(count).preferredName = node.Attributes.getNamedItem("preferredName").nodeValue
Next
GetAttachedFileInfo = result
End Functionこのファンクションをテストするコードを貼り付けてください
Public Sub gafiTest()
Dim result() As AttachedFileInfoType
Dim i As Integer
result = GetAttachedFileInfo(GetID("ページ名"))
For i = 0 To UBound(result)
Debug.Print i & ":実ファイル名[" & result(i).preferredName & "]は" & result(i).pathCache & "に保存されています"
Next
End Subこのルーチンを実行すると
0:実ファイル名[エクセル1.xlsx]はC:\Users\user\AppData\Local\Microsoft\OneNote\16.0\cache\0000153G.binに保存されています
1:実ファイル名[エクセル2.xlsm]はC:\Users\user\AppData\Local\Microsoft\OneNote\16.0\cache\00001540.binに保存されています
のように添付ファイル情報が出力されます。
OneNoteをVBAでいじる - ページのIDを取得する
下記のコードを標準モジュールに貼り付けてください。
Public Function GetPageID(ByVal noteBookName As String, ByVal pageName As String) As String
Dim oneNote As oneNote.Application2
Dim oneNotePagesXml As String
Dim nodes As MSXML2.IXMLDOMNodeList
Dim node As MSXML2.IXMLDOMNode
Dim doc As Object
Set oneNote = New oneNote.Application2
oneNote.GetHierarchy GetNoteBookID(noteBookName), hsPages, oneNotePagesXml
Set doc = CreateObject("Msxml2.DOMDocument")
doc.loadXML (oneNotePagesXml)
Set nodes = doc.DocumentElement.SelectNodes("//one:Page")
For Each node In nodes
If node.Attributes.getNamedItem("name").Text = pageName Then
If NotParentName(pageName) = False Then
GetPageID = node.Attributes.getNamedItem("ID").Text
Exit Function
End If
End If
Next
End Functionイミディエイトウィンドウで、
? GetPageID("あなたのノートブック名","その中のページ名") [Return]で
{12344EFF-4567-8901-2345-56B789012E1F}{1}{E1234567890123456789012345678901234567891234}
のような形式でIDが取得できます。


