C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Excelのクイックアクセス表示状態を取得したい


(過去ログ 97 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■57690 / inTopicNo.1)  Excelのクイックアクセス表示状態を取得したい
  
□投稿者/ うさぎ (1回)-(2011/03/09(Wed) 11:52:57)

分類:[VB.NET/VB2005 以降] 

おしえてください。
Office2010のExcelを使用してVB.net(VS2010)からクイックアクセスツールバーにどのようなアイテムが表示されているか
取得しようと考えています。
自分で調べたところによると設定ファイルが
C:\Documents and Settings\ユーザ名\Local Settings\Application Data\Microsoft\Office\Excel.officeUIに
記載されていることがわかりました。

中身自体はXMLで記載されているのでLinq to XMLで値を取得しようとしたのですが各種エレメントに":"が使用されているため
VSが{"':' 文字、16 進数値 0x3A を名前に含むことはできません。"}という例外を発生してしまいます。
どなたか解決方法はご存じではないでしょうか?


よろしくお願いします。

Excel.officeUIのサンプル

<mso:customUI xmlns:mso="http://schemas.microsoft.com/office/2009/07/customui">
	<mso:ribbon>
		<mso:qat>
			<mso:sharedControls>
				<mso:control idQ="mso:FileOpen" visible="false" insertBeforeQ="mso:FileNewDefault"/> ここのアトリビュートが取得したいのですが
				<mso:control idQ="mso:FileSave" visible="true" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:FileSendAsAttachment" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:FilePrintQuick" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:PrintPreviewAndPrint" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:Spelling" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:Undo" visible="true" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:Redo" visible="true" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:SortAscendingExcel" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:SortDescendingExcel" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:FileOpenRecentFile" visible="false" insertBeforeQ="mso:FileNewDefault"/>
				<mso:control idQ="mso:FileNewDefault" visible="true"/>
			</mso:sharedControls>
		</mso:qat>
		<mso:tabs>
			<mso:tab id="mso_c1.42DBAF3" label="操作&#8203;&#8203;" insertBeforeQ="mso:TabInsert">
				<mso:group id="mso_c2.42DBAF3" label="新しい&#8203;&#8203;グループ" autoScale="true">
					<mso:control idQ="mso:Copy" visible="true"/>
				</mso:group>
			</mso:tab>
		</mso:tabs>
	</mso:ribbon>
</mso:customUI>

引用返信 編集キー/
■57692 / inTopicNo.2)  Re[1]: Excelのクイックアクセス表示状態を取得したい
□投稿者/ shu (504回)-(2011/03/09(Wed) 12:14:41)
No57690 (うさぎ さん) に返信

ここに現れない読み込める文字(列)に一時的に置換してみてはどうでしょう?
引用返信 編集キー/
■57693 / inTopicNo.3)  Re[2]: Excelのクイックアクセス表示状態を取得したい
□投稿者/ マサヤ (278回)-(2011/03/09(Wed) 12:49:31)
2011/03/09(Wed) 13:07:01 編集(投稿者)
Linqはわかりませんが、下記のやり方でlistの中にidQのアトリビュートを格納できましたよ。
XmlDocument xDoc = new XmlDocument();
            XmlNode xNode = null;
            xDoc.Load(@"C:\Test.xml"); // ファイルの場所はC:\直下にしました
            xNode = xDoc.DocumentElement;
            List<string> list = new List<string>();
            foreach (XmlNode var in xDoc[@"mso:customUI"])
            {
                if (var.Name.Equals(@"mso:ribbon"))
                {
                    for (int i = 0; i < var.ChildNodes.Count; i++)
                    {
                        if (var.ChildNodes.Item(i).Name.Equals(@"mso:qat"))
                        {
                            for (int j = 0; j < var.ChildNodes.Item(i).ChildNodes.Count; j++)
                            {
                                if (var.ChildNodes.Item(i).ChildNodes.Item(j).Name.Equals(@"mso:sharedControls"))
                                {
                                    for (int k = 0; k < var.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Count; k++)
                                    {
                                        if (var.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Item(k).Name.Equals(@"mso:control"))
                                        {
                                            //idQ
                                            string test = var.ChildNodes.Item(i).ChildNodes.Item(j).ChildNodes.Item(k).Attributes["idQ"].Value;
                                            list.Add(test);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }               
            }

スミマセン。
VBでしたね。

引用返信 編集キー/
■57694 / inTopicNo.4)  Re[1]: Excelのクイックアクセス表示状態を取得したい
□投稿者/ 魔界の仮面弁士 (2125回)-(2011/03/09(Wed) 13:03:25)
No57690 (うさぎ さん) に返信
> 中身自体はXMLで記載されているのでLinq to XMLで値を取得しようとしたのですが各種エレメントに":"が使用されているため

それは要素名ではなく、名前空間の指定です。

たとえば
 Imports <xmlns:mso="http://schemas.microsoft.com/office/2009/07/customui">
を付与しておけば、
 Dim a = doc...<mso:ribbon>.<mso:qat>.<mso:sharedControls>.<mso:control>.@insertBeforeQ
と書けます。(変数 doc は XDocument 型)

「mso」の部分は XML 側とは別のプレフィックスにしても良いですし、
 Imports <xmlns="http://schemas.microsoft.com/office/2009/07/customui">
のように、既定の名前空間にすることもできます。この場合は
 Dim a = doc...<ribbon>.<qat>.<sharedControls>.<control>.@insertBeforeQ
ですね。

# 他の取得方法もあります。
引用返信 編集キー/
■57696 / inTopicNo.5)  Re[2]: Excelのクイックアクセス表示状態を取得したい
□投稿者/ 魔界の仮面弁士 (2126回)-(2011/03/09(Wed) 13:34:54)
2011/03/09(Wed) 13:49:00 編集(投稿者)

No57694 (魔界の仮面弁士) に追記
> # 他の取得方法もあります。

別解 その1。

Dim mso As XNamespace = "http://schemas.microsoft.com/office/2009/07/customui"
Dim q = From x In doc.Descendants(mso + "control") Where x.@idQ = "mso:FileOpen"
Dim a = q.@visible


別解 その2。

'Imports System.Xml
'Imports System.Xml.XPath

Dim man As New XmlNamespaceManager(doc.CreateReader().NameTable)
man.AddNamespace("mso", "http://schemas.microsoft.com/office/2009/07/customui")

Dim a = doc.XPathSelectElement("//mso:control[@idQ='mso:FileOpen']", man).@visible


別解 その3。linq ではないですけど。

Dim d As New XPathDocument(doc.CreateReader()) ' = New XPathDocument("C:\〜.xml")
Dim XPath = "//mso:control[@idQ='mso:FileOpen']/@visible"
Dim at = d.CreateNavigator().SelectSingleNode(XPath, man) '変数 man は上記その2を参照
Dim a As String = Nothing
If at IsNot Nothing Then
 a = at.Value
End If
引用返信 編集キー/
■57699 / inTopicNo.6)  Re[3]: Excelのクイックアクセス表示状態を取得したい
□投稿者/ うさぎ (2回)-(2011/03/09(Wed) 14:13:03)
No57696 (魔界の仮面弁士 さん) に返信

「別解 その1。」でやってみましたが動きました。
ありがとうございます。
XMLの名前空間がよくわからないので勉強したいと思います。

ご返信してくれた皆様ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -