プロが教える店舗&オフィスのセキュリティ対策術

VBSで名前定義に関するときの処理について質問です。
特定の名前定義(仮にaaa)の有無で別エクセルファイルに出力するプログラムなのですが
ない時のifの条件(★部分)が分からなくて困っています・・・
これかなと思ったのを書いてエラーが起きたのですが、このエラーは理解出来たので大丈夫です。

尚以下のソースは途中のものでエクセルのオブジェクト参照などは既にしており、そのあたりは記述しておりませんがご了承ください。
よろしくお願いします

'特定の名前定義があるか確認
Option Explicit

Dim n

For Each n In ex.ActiveWorkbook.Names
WScript.Echo n.Name '名前定義一覧確認

If (n.Name = "aaa") Then '名前定義が"aaa"ならば

WScript.Echo (.Name) & ": 名前定義aaaあり" 'デバッグ用

'処理をしたファイル名と名前定義の有無を「処理出力.xlsx」に出力する(Excelファイル)
'セルに名前定義"tm1ServerName"があるか確認
Set exBk = ex.Workbooks.Open (file) '「処理結果.xlsx」を開く

'セルの指定&入力
exBk.ActiveSheet.Range("A1").Value = "ファイル名"
exBk.ActiveSheet.Range("B1").Value = "名前定義の有無"

exBk.ActiveSheet.Cells(i,1).Value = (.Name)'ファイル名書き出し
exBk.ActiveSheet.Cells(i,2).Value = "ある" '結果表示
i = i + 1
exBk.Save '保存
exBk.Close '閉じる

End If
Next

'処理をしたファイル名と名前定義の有無を「処理結果.xlsx」に出力する(Excelファイル)
'セルに名前定義"aaa"がないか確認
If Not (★ = "aaa") Then 'aaaが一つもなければ

WScript.Echo (.Name) & ":aaaなし" 'デバッグ用

Set exBk = ex.Workbooks.Open (file) '「処理結果.xlsx」を開く
exBk.ActiveSheet.Range("A1").Value = "ファイル名" '見出し
exBk.ActiveSheet.Range("B1").Value = "名前定義の有無" '見出し

exBk.ActiveSheet.Cells(i,1).Value = (.Name)'ファイル名書き出し
exBk.ActiveSheet.Cells(i,2).Value = "ない" '結果表示
i = i + 1
exBk.Save '保存
exBk.Close '閉じる

End If

ex.Quit 'Excel終了

質問者からの補足コメント

  • 申し訳ございません。
    7行目のコメントの'処理をしたファイル名と名前定義の有無を「処理出力.xlsx」に出力する(Excelファイル)のついてですが
    正しくは'処理をしたファイル名と名前定義の有無を「処理結果.xlsx」に出力する(Excelファイル)
    です。紛らわしいことをして申し訳ございませんでした。

      補足日時:2017/12/03 05:40

A 回答 (4件)

VBSは苦手ですけど。



Option Explicit

Dim n,ch '★変更

ch = True '★追加

For Each n In ex.ActiveWorkbook.Names
WScript.Echo n.Name '名前定義一覧確認

If (n.Name = "aaa") Then '名前定義が"aaa"ならば

ch = False '★追加

WScript.Echo (.Name) & ": 名前定義aaaあり" 'デバッグ用

'処理をしたファイル名と名前定義の有無を「処理出力.xlsx」に出力する(Excelファイル)
'セルに名前定義"tm1ServerName"があるか確認
Set exBk = ex.Workbooks.Open (file) '「処理結果.xlsx」を開く

'セルの指定&入力
exBk.ActiveSheet.Range("A1").Value = "ファイル名"
exBk.ActiveSheet.Range("B1").Value = "名前定義の有無"

exBk.ActiveSheet.Cells(i,1).Value = (.Name)'ファイル名書き出し
exBk.ActiveSheet.Cells(i,2).Value = "ある" '結果表示
i = i + 1
exBk.Save '保存
exBk.Close '閉じる

End If
Next

>If Not (★ = "aaa") Then 'aaaが一つもなければ

If ch Then '★変更

' 以下略

---------

ブール型 (Boolean) にあたる変数を用いてみるとか?
    • good
    • 0

と言う事は、



i = 2 '★多分2行目から書き出すようになっていると予測(既に記載済み?)

'★まずは書き込むブックを開いておく
'処理をしたファイル名と名前定義の有無を「処理出力.xlsx」に出力する(Excelファイル)
'セルに名前定義"tm1ServerName"があるか確認
Set exBk = ex.Workbooks.Open (file) '「処理結果.xlsx」を開く
Set exWS = '★ActiveSheetではなくWorksheets(~)と明確にする

'セルの指定&入力
exWS.Range("A1").Value = "ファイル名"
exWS.Range("B1").Value = "名前定義の有無"


For Each n In ex.ActiveWorkbook.Names '★自BookならThisWorkbook それ以外ならBook名を明確に指定
WScript.Echo n.Name '名前定義一覧確認

If (n.Name = "aaa") Then '名前定義が"aaa"ならば

WScript.Echo (.Name) & ": 名前定義aaaあり" 'デバッグ用

exWS.Cells(i,1).Value = (.Name)'ファイル名書き出し '★ .Name とは With文を使われている?
exWS.Cells(i,2).Value = "ある" '結果表示
i = i + 1

End If
Next

exWS.Cells(i,1).Value = (.Name)'ファイル名書き出し '★ .Name とは With文を使われている?
exWS.Cells(i,2).Value = "ない" '結果表示
i = i + 1

'★多分この辺に ex.ActiveWorkbook のループの終わりがある?

exBk.Save '保存
exBk.Close '閉じる

ex.Quit 'Excel終了
    • good
    • 0
この回答へのお礼

めぐみんさん>無事実行することができました!
本当にありがとうございましたっ!

お礼日時:2017/12/04 18:20

No.2です。



>Set exWS = '★ActiveSheetではなくWorksheets(~)と明確にする

Set exWS = '★ActiveSheetではなくexBK.Worksheets(~)と明確にする

でしたね。
    • good
    • 0
この回答へのお礼

>めぐみんさん
多数の回答にありがとうございます!
i=2は既に記載しておりました。省略せずにエクセルオブジェクト参照以外のことも記述しておくべきだしたね・・・怠わって申し訳ないですorz
(.Name)についてですが、そちらは参考にさせて頂いたURLがあるのですがそこにて、そのような書き方をしていたのでそちらを真似させていただきました!

For文の中にElseの方を書いたパターンは既に試してはみたのですが、その場合だと名前定義がない時がFor文の中に入りませんでした。
それで自分は、ない時はFor文の条件式に当てはまらないから、その中に入らないのかと自思っているのですが、どうでしょうか・・・?
(For文直後に『Wscript.Echo ()』を書いて名前定義がないファイルが読み込まれてないのを確認済み)

Falseを追加して比較したりex.WorkSheet()と明確にしたりと思いつかなかったのでとても参考になりました・・・!
確かに同じブック内で処理するのに閉じて開くを繰り返すのは変ですね・・・その辺りも含めて今後もっと精進していこうと思います。
自分の説明下手で分かりづらい所が度々あって申し訳ございませんでした・・・
お忙しい中、本当にありがとうございました!

お礼日時:2017/12/03 20:37

No.1です。



補足については、No.1の回答に関わります?
と言うよりループ内でブックを開いて閉じるを繰り返すのも変ですよね?

で、こんな感じに変えてみました。

Option Explicit

Dim n,i

i = 2 '★多分2行目から書き出すようになっていると予測(既に記載済み?)

'★まずは書き込むブックを開いておく
'処理をしたファイル名と名前定義の有無を「処理出力.xlsx」に出力する(Excelファイル)
'セルに名前定義"tm1ServerName"があるか確認
Set exBk = ex.Workbooks.Open (file) '「処理結果.xlsx」を開く
Set exWS = '★ActiveSheetではなくWorksheets(~)と明確にする

'セルの指定&入力
exWS.Range("A1").Value = "ファイル名"
exWS.Range("B1").Value = "名前定義の有無"


For Each n In ex.ActiveWorkbook.Names '★自BookならThisWorkbook それ以外ならBook名を明確に指定
WScript.Echo n.Name '名前定義一覧確認

If (n.Name = "aaa") Then '名前定義が"aaa"ならば

WScript.Echo (.Name) & ": 名前定義aaaあり" 'デバッグ用

exWS.Cells(i,1).Value = (.Name)'ファイル名書き出し '★ .Name とは With文を使われている?
exWS.Cells(i,2).Value = "ある" '結果表示
i = i + 1

Else '★該当しない時

exWS.Cells(i,1).Value = (.Name)'ファイル名書き出し '★ .Name とは With文を使われている?
exWS.Cells(i,2).Value = "ない" '結果表示
i = i + 1

End If
Next

exBk.Save '保存
exBk.Close '閉じる

ex.Quit 'Excel終了

--------------

でも、(.Name) で何が書き込めるのか?が私にはわかりませんでしたが。
    • good
    • 0

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