アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBScriptでのExcelブックのプロパティ参照について

先達のみなさまこんにちは。
VBScript(ExcelVBAではなく)を使って、Excelブック内のName
(Excelで、[挿入]-[名前]-[定義...]で表示される一覧)
を削除したいと思いコーディングしてみましたが、実行すると
ブックのBuiltInプロパティを参照しようとする箇所で
エラーとなってしまいます。
エラーメッセージは「オブジェクトでサポートされていない
プロパティまたはメソッドです。:'objName.BuiltIn'」と
表示しています。

次のようなコードです。
***
Option Explicit

Sub DelNames()

Dim objArgs
Dim objXls
Dim objBook
Dim objName
Dim I

Set objArgs = WScript.Arguments
Set objXls = CreateObject("Excel.Application")
Set objBook = objXls.ActiveWorkbook

For I = 0 to objArgs.Count - 1
' 引数内容確認
Wscript.Echo objArgs(I)
objXls.Workbooks.Open objArgs(I)
objXls.Visible = True
For Each objName in objXls.ActiveWorkbook.Names
If (objName.BuiltIn = True) Then
objName.Delete
End If
Next
Next

Set objXls = Nothing
Set objBook = Nothing
Set objName = Nothing

End Sub
***

これをlesson03.vbsとして保存し、これを呼び出すwsfファイルを作成しました。

***
<job id = "DelNamesDD">

<script language = "VBScript" src = ".\lesson03.vbs"></script>

<!-- Excel参照設定 -->
<reference guid="{00020813-0000-0000-C000-000000000046}"></reference>

<!-- メイン処理 -->
<script language = "VBScript">

Option Explicit
Call DelNames()

</script>

</job>
***
たとえばこれをDelName.wsfとして保存し、DelName.wsfにExcelファイル(*.xls)
をドラッグドロップして、「ビルトインではない」名前を削除させたい、と
考えたのです。
しかし、
If (objName.BuiltIn = True) Then
の部分で上記のエラーとなってしまい、解決方法がわかりませんでした。

解決方法を教えていただきたくよろしくお願いいたします。
利用しているExcelのバージョンは2003(SP3)、WSHのバージョンは5.6
です。OSはWindows XP SP3です。

お手数をおかけしますが、よろしくお願い申し上げます。

A 回答 (3件)

BuiltInプロパティは Nameオブジェクトにはないと思います


VBAのオブジェクトブラウザで確認しました

お示しのURLマクロが動作するのは 『On Error Resume Next』による副産物のようです
この命令は エラーがあっても停止するのではなく 次の命令を実行しなさい ですので …

プロパティがあるかどうかは 正規のレファレンスを確認する癖をつけましょう
VB(A)の場合 隠してあるプロパティもあるので それらの確認は VB(A)の中の オブジェクトブラウザで確認しましょう
起動は デフォルトなら F2キーです

上方に2つあるコンボボックスの下側に探したいプロパティ名やメソッド名などを入れて検索します
隠しプロパティなどの表示は オブジェクトブラウザ内で右クリックして
『非表示のメンバーを表示』をクリック

淡色表示で隠しプロパティ等の確認も出来ます
WEBにある情報はすべてが正しいわけではありませんのでよく吟味しましょう
    • good
    • 0
この回答へのお礼

redfox63さん、レスポンスありがとうございます。

確かに、オブジェクトブラウザで自分で確認してみることが大切ですね。基本をないがしろにしてredfox63さんはじめみなさんにお手数をおかけし申し訳ございませんでした。

on error resume nextが生きていたとは・・・。VBAでステップ実行してみたところ、その様子もはっきりわかりました。

実はこれよりも以前に、Styleを削除しようとして、StyleにはBuiltInがあったので、Nameにもあると思い込んでしまっていたこともありました。

今後は確認を重ねてコーディングを進めるように気をつけます。

redfox63さん、みなさんありがとうございました。

お礼日時:2010/09/16 22:54

> If (objName.BuiltIn = True) Then



何かの間違いでは?BuiltInというのは、CommandBar の中で、ユーザーが取り付けたものと、予め設定されているものとの違いに対して、そのプロパティを使うわけです。Name プロパティに区分けはありません。

>Set objXls = CreateObject("Excel.Application")
>Set objBook = objXls.ActiveWorkbook

ところで、これは間違っていませんか?objXls を生成しただけでは、ActiveWorkbook は存在しないはずです。

objXls.Workbooks.Open objArgs(I)
  ↓
Set objBook = objXls.Workbooks.Open(objArgs(I))
ということになるはずです。

ただ、そうはいっても、名前-登録のすべてが削除出来るか分かりません。
Names オブジェクトの親オブジェクトは、いくつか種類がありますから、必ずしも、Workbookになるとは限りません。

この回答への補足

レスポンスありがとうございます。

No.1さんへの補足にもありますように、参考にさせていただいたサイト様で

For Each s In ActiveWorkbook.Names
If Not s.BuiltIn Then
s.Delete

のように記述されていましたので(こちらはVBAですが)、これと同じことをVBScriptで実現したいと思ったものでした。

確かに、
>Set objBook = objXls.Workbooks.Open(objArgs(I))
>ということになるはずです。

ですね。ご指摘ありがとうございます。
この修正を行ってみましたが、実行結果はやはり同じエラーとなってしまいました。


お手数をおかけしすみません。ありがとうございました。

補足日時:2010/09/15 23:16
    • good
    • 0

補足要求。

「BuiltInプロパティがある」と何を見て思ったのか聞いてみたいなあ。(使った参考資料とか)このへん見ても無さそうなんだけど。http://msdn.microsoft.com/en-us/library/microsof …

この回答への補足

レスポンスありがとうございます。
あれ、ほんとですね。私が参考にしたのは次のサイトで見たVBAのサンプルです。

http://komitsudo.blog70.fc2.com/blog-entry-104.h …

この記事の中の「名前の一括削除マクロ」をExcel2003で試したところうまく削除できたので、ではVBScriptで書いてみよう、と思ったものでした。

すべての名前を削除してしまってもよいのですが、なんとなくビルトインのものまで削除するのは気が引けて、このような考慮ができるならやりたいと思っているものです。

よかったら、引き続きよろしくお願いいたします。

補足日時:2010/09/15 23:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!