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

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

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

Re[3]: Excelのリボン表示状態を取得したい


(過去ログ 97 を表示中)

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

■57705 / inTopicNo.1)  Excelのリボン表示状態を取得したい
  
□投稿者/ うさぎ (3回)-(2011/03/09(Wed) 17:55:34)

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

2011/03/09(Wed) 18:10:41 編集(投稿者)
■57690 の続きとして、今度はリボンの表示状態を取得しようとしています。
LINQで取得した文字列の比較を行いましたが、VSのデバック上やDebug.WriteLine上は全く同じ文字列に
見えるのですがなぜか判定がNGになります。
特に特殊文字等は入っていないと思うのですが何かコードに不備があるのでしょうか?
どなたか教えていただけないでしょうか?

また、文字列を抽出するLINQのコードですが、もっと良いやり方があるとおもうのですが
こちらも合わせて教えていただけないでしょうか?

よろしくお願いします。

書いたコード

Dim mso As XNamespace = "http://schemas.microsoft.com/office/2009/07/customui"

Dim q = From x In XDocument.Load(filePath).Descendants(mso + "tab")
              Where x.@insertBeforeQ = "mso:TabInsert"

Dim tempVal As String = TryCast(q.@label, String)

If not tempVal Is Nothing AndAlso "操作" = tempVal Then 'ここで判定NGになります。
                                                      'CompareToで確認したところLinqで取得したほうが大きいです。
                                                      

   Dim r = From y In q.Descendants(mso + "group") 'ここのコードはもっとスマートにできると思うのですが・・・・

   tempVal = TryCast(r.@label, String)
   If Not tempVal Is Nothing AndAlso "新しいグループ"= tempVal Then

      Dim s = From z In r.Descendants(mso + "control")

      tempVal = TryCast(s.@visible, String)'文字列判定のIf文をコメントアウトすればここでVisibleの値が取れる
      If Not tempVal Is Nothing AndAlso CBool(visible) = tempVal Then 
          result = True
      End If

   End If

End If

参照先のXML(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="操作" insertBeforeQ="mso:TabInsert">
				<mso:group id="mso_c2.42DBAF3" label="新しいグループ" autoScale="true">
					<mso:control idQ="mso:Copy" visible="true"/>'ここまでの階層が正しく かつ アトリビュートが取得したいのですが
				</mso:group>
			</mso:tab>
		</mso:tabs>
	</mso:ribbon>
</mso:customUI></pre></pre></pre></pre>

引用返信 編集キー/
■57706 / inTopicNo.2)  Re[1]: Excelのリボン表示状態を取得したい
□投稿者/ 魔界の仮面弁士 (2127回)-(2011/03/09(Wed) 19:27:05)
手元に Office 2010 も VS2010 も無いので検証できませんが、
VB2008 では下記のコードで取得できました。

Dim tempVal As String = q.@label
If tempVal = "操作" Then


> VSのデバック上やDebug.WriteLine上は全く同じ文字列に
> 見えるのですがなぜか判定がNGになります。
何か余計な文字が含まれていませんか? たとえば
Dim A As String = System.Convert.ToString(System.Text.Encoding.Unicode.GetBytes(tempVal))
Dim B As String = System.Convert.ToString(System.Text.Encoding.Unicode.GetBytes("操作"))
のようにして比較してみては如何でしょう。



> 'ここのコードはもっとスマートにできると思うのですが・・・・

「スマート」の定義にもよりますが、If 文無しで書くならこんな感じ。

Sub Main()
  Dim doc As XDocument = GetDoc()

  Dim mso As XNamespace = "http://schemas.microsoft.com/office/2009/07/customui"

  Dim a As String
  a = doc.Descendants(mso + "tab") _
      .Where(Function(x) x.@label = "操作" AndAlso x.@insertBeforeQ = "mso:TabInserts") _
      .Descendants(mso + "group") _
      .Where(Function(x) x.@label = "新しいグループ") _
      .Elements(mso + "control") _
      .@visible

  MsgBox(a)
End Sub

Function GetDoc() As XDocument
  GetDoc = <?xml version="1.0"?>
           <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="操作" insertBeforeQ="mso:TabInsert">
                           <mso:group id="mso_c2.42DBAF3" label="新しいグループ" autoScale="true">
                               <mso:control idQ="mso:Copy" visible="true"/>
                           </mso:group>
                       </mso:tab>
                   </mso:tabs>
               </mso:ribbon>
           </mso:customUI>
End Function

引用返信 編集キー/
■57712 / inTopicNo.3)  Re[2]: Excelのリボン表示状態を取得したい
□投稿者/ うさぎ (4回)-(2011/03/10(Thu) 10:27:26)
No57706 (魔界の仮面弁士 さん) に返信
ご返信ありがとうございます。
> Dim A As String = System.Convert.ToString(System.Text.Encoding.Unicode.GetBytes(tempVal))
> Dim B As String = System.Convert.ToString(System.Text.Encoding.Unicode.GetBytes("操作"))
でやった所、正常に判定されました。
元コードで正常に取れないのは文字コードが影響しているのでしょうか?
引用返信 編集キー/
■57717 / inTopicNo.4)  Re[3]: Excelのリボン表示状態を取得したい
□投稿者/ 魔界の仮面弁士 (2129回)-(2011/03/10(Thu) 12:07:30)
No57712 (うさぎ さん) に返信
>>Dim A As String = System.Convert.ToString(System.Text.Encoding.Unicode.GetBytes(tempVal))
>>Dim B As String = System.Convert.ToString(System.Text.Encoding.Unicode.GetBytes("操作"))
> でやった所、正常に判定されました。
> 元コードで正常に取れないのは文字コードが影響しているのでしょうか?

tempVal も "操作" も String 型ですよね。String 型に文字コードの概念はありません。
(内部的には UTF-16 形式のバイナリですが、VB からはそれを意識する事は無いはず)

String(文字列)をファイル・Stream・バイト配列等に渡す場合や
その逆に、ファイル等の内容を String データとして読み取る際には
文字コードを意識せねばなりませんけれども。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -