質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

VBSCRIPTで引数を指定して動作

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,161

matrix99999

score 15

前提・実現したいこと

VBSCRIPTで引数を指定して動作させたいと思います。
引数は、フォルダ名とファイル名です。

実行
>wscript excel2.vbs d:\test\excelvbs    d:\test\excelvbs\result\test.xlsx

エラーメッセージ
構文エラー 800A03EA VBScriptコンパイルエラーです。

該当のソースコード

Option Explicit
' 統合したファイルの保存名
Dim margedBookPath
margedBookPath = = VFile01
' 対象ファイルが保存されているパス
Dim targetPath
targetPath = VPath01

引数を入れない場合

Option Explicit
' 統合したファイルの保存名
Dim margedBookPath
margedBookPath = "D:\test\excelvbs\result\test.xlsx"
' 対象ファイルが保存されているパス
Dim targetPath
targetPath = "D:\test\excelvbs"

ではうまく動作します。

ここに問題に対して試したことを記載してください。
1 引数の設定でsetを外してもダメでした。
VFile01 = Wscript.Arguments(0)
VPath01 = Wscript.Arguments(1)


>wscript "excel2.vbs d:\test\excelvbs"    "d:\test\excelvbs\result\test.xlsx"
でも同様でした。set VFile01 = Wscript.Arguments(0)
set VPath01 = Wscript.Arguments(1)

引数の記載に関してご教示お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

実行したコードはどう言うものですか?推測すると、

Option Explicit
Dim VFile01, VPath01
VFile01 = Wscript.Arguments(0)
VPath01 = Wscript.Arguments(1) 
' 統合したファイルの保存名
Dim margedBookPath
margedBookPath = = VFile01
' 対象ファイルが保存されているパス
Dim targetPath
targetPath = VPath01


ですか?
そうであれば、margedBookPath = = VFile01のところに、イコールが2つあるのが原因です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/05 11:59 編集

    回答ありがとうございます。
    ご指摘のところ失念していました。
    下記コードで動作させましたが。
    Set targetFolder = fso.GetFolder(targetPath)でパスが見つかりませんとでます。
    wscript excel3.vbs "d:\test\excelvbs" "d:\test\excelvbs\result\test.xlsx" にて実行

    コード:
    Option Explicit
    Dim VFile01, VPath01

    VFile01 = Wscript.Arguments(0)
    VPath01 = Wscript.Arguments(1)


    Dim margedBookPath
    margedBookPath = VFile01


    Dim targetPath
    targetPath = VPath01

    Dim targetExtension
    targetExtension = "xlsx"

    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim targetFolder
    Set targetFolder = fso.GetFolder(targetPath)

    Dim xlApp
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True

    Dim margedBook
    Set margedBook = xlApp.Workbooks.Add

    Dim initialSheetsCount
    initialSheetsCount = margedBook.Worksheets.Count

    Dim targetBook

    Dim f
    For Each f In targetFolder.Files
    Dim targetSheet
    Dim copiedSheet


    If fso.GetExtensionName(f.Name) = targetExtension Then
    Set targetBook = xlApp.Workbooks.Open(f.Path, 0, True)
    Set targetSheet = targetBook.Worksheets(1)
    Call targetSheet.Copy(, margedBook.Worksheets(margedBook.Worksheets.Count))


    Set copiedSheet = margedBook.Worksheets(margedBook.Worksheets.Count)
    copiedSheet.Name = fso.GetBaseName(targetBook.Name)

    Set targetSheet = Nothing
    call targetBook.Close(False)
    Set targetBook = Nothing
    End If
    Next

    xlApp.DisplayAlerts = False


    Dim i
    For i = 1 To initialSheetsCount
    margedBook.Worksheets(1).Delete
    Next

    Call margedBook.SaveAs(margedBookPath)
    Call margedBook.Close(False)

    xlApp.DisplayAlerts = True
    xlApp.Quit
    Set xlApp = Nothing

    ご教示いただければと思います。

    キャンセル

  • 2019/01/05 12:08

    GetFolderに対して、対してディレクトリ名じゃなくてファイル名を与えているからですね。
    かなり混乱している様子なので、いちど落ち着いて考えるのがいいと思います。

    キャンセル

  • 2019/01/05 12:13

    ありがとうございます。
    無事動作しました。

    キャンセル

+1

■発生しているエラーについて

margedBookPath = = VFile01のイコール2連続が原因ですね。
※otnさんの回答と同様です

■【set】の利用について
setステートメントはオブジェクトへの参照を変数に代入する際に利用しますので、
今回のケースに当てはめると以下の使い分けになります。

・setが必要な場合
引数オブジェクトを代入するとき。
Set args = Wscript.Arguments

・setが不要
直接、引数オブジェクトの値を代入するとき。
args1 = Wscript.Arguments(0)

■引数について

引数の個数で分岐することで、引数設定ミスの実行時エラーを回避できます。
※すでに実装していたら申し訳ございません。

dim args 
Set args = Wscript.Arguments

const CST_File01 = "d:\test\excelvbs"
const CST_Pate01 = "d:\test\excelvbs\result\test.xlsx"

if args.Count = 0 then
  ' 引数設定しなかった場合
  VFile01 = CST_File01
  VPath01 = CST_Pate01 

elseif args.Count = 1 then
  ' 引数1つの場合
  VFile01 = args (0)
  VPath01 = CST_Pate01 

elseif args.Count >= 2 then
  ' 引数2つの場合
  VFile01 = args (0)
  VPath01 = args (1) 

end if

以上

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/09 23:27

    ありがとうございます。
    無事動作しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る