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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

27157閲覧

VBScript「ステートメントがありません」エラーを解決したい

renrun_

総合スコア1

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2020/09/17 10:13

編集2020/09/17 10:14

前提・実現したいこと

WinActorの「スクリプト実行」アクティビティでVBScriptを記述し、
「特定の文字列を含む(起動中)URLのIEのオブジェクトを取得する」挙動を実現したいのですが、
以下のコンパイルエラーが発生してしまいます。
ステートメント

エラーメッセージ:「ステートメントがありません」

該当のソースコード

Function getObjIE(strPat) Dim KeyWord, ie, RE, Match, Matches 'Dim strPat As String Dim strTest 'As String Dim strAns 'As String Set ie = Nothing Set RE = CreateObject("VBScript.RegExp") On Error Resume Next For Each obj In CreateObject("Shell.Application").Windows strTest = Range(obj.LocationURL).Value strPat = Range("https://transit.yahoo.co.jp/search/result?from").Value With RE .Pattern = strPat .IgnoreCase = True .Global = True End With Set Matches = RE.Execute(strTest) If TypeName(obj.Document) = "HTMLDocument" Then For Each Match In Matches If RE.Test(Match.Value) Then Set ie = obj End If End If Next On Error GoTo 0 Set RE = Nothing If ie Is Nothing Then MsgBox "指定のieが見つかりませんでした。" Else Set getObjIE = ie End If End Function

■試した事
・余計なスペースやTabキーによる空白の削除
・””(ダブルクオーテーション)やカンマの使用が適切か確認

本日、初めてVBScriptを記述し、ネットから取得したコードをアレンジした全くの初心者です。
お力添えいただけますよう何卒宜しくお願い致します。

■補足情報(FW/ツールのバージョンなど)
ツール:WinActor Ver.7.1.0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

インデントが出鱈目なので、気づいていないでしょうが、nextend ifが逆で、さらにnextが1つ足りないです。

インデントをきちんとしましょう。

投稿2020/09/17 13:02

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

renrun_

2020/09/17 13:40

ご指摘いただきありがとうございます。 構文を以下のように修正してコンパイルエラーは解消することができました。 --ここから Function getObjIE(KeywordTitleOrUrl) Dim KeyWord, ie, RE, Match, Matches Dim strTest 'As String Set ie = Nothing Set RE = CreateObject("VBScript.RegExp") On Error Resume Next For Each obj In CreateObject("Shell.Application").Windows strTest = Range(obj.LocationURL).Value KeywordTitleOrUrl = Range("https://transit.yahoo.co.jp/search/").Value With RE .Pattern = KeywordTitleOrUrl .IgnoreCase = True .Global = True End With Set Matches = RE.Execute(strTest) If TypeName(obj.Document) = "HTMLDocument" Then For Each Match In Matches If RE.Test(Match.Value) Then Set ie = obj End If Next End If Next On Error GoTo 0 Set RE = Nothing If ie Is Nothing Then MsgBox "指定のieが見つかりませんでした。" Else Set getObjIE = ie End If End Function --ここまで
kuma_kuma_

2020/09/17 15:30

For Each obj In CreateObject("Shell.Application").Windows ここは この様にしたほうが良いですよ Dim sh Set sh = CreateObject("Shell.Application") For Each obj In sh.Windows
otn

2020/09/17 15:34

何故でしょう?
kuma_kuma_

2020/09/17 16:43

今回の場合CreateObjectで"Shell.Application"を作成します。 普通はSetで作成したオブジェクトを変数に設定します。 CreateObjectした変数は Set sh = Nothing で解放するのがベターです。 (一応変数に代入してあれば自動解放してくれるはずです) で今回の場合For Eachの中に組み込んでいるので 変数に登録されない状態の為、自動解放されるかが不明です その為CreateObjectの場合、変数にSet する事をお勧めした次第です。 後CreateObjectで失敗しているのか、その後の参照で失敗しているのかの切り分けができます。 CreateObject等オブジェクトを扱う際の書き方と思ってください。
otn

2020/09/17 23:03

一度変数に代入しないと解放されないと思うのは何故でしょう? そんなこと言うなら、sh.Windowsというオブジェクトも一度変数に代入するべきでは? 参照されなくなると(Forが終わると)解放されるのが普通の言語処理系の作りだと思いますが。
kuma_kuma_

2020/09/18 00:07

クラス作ってFor Eachかけると毎回クラス自体が初期化して呼び出されるのよ で解放がされないで残った状態という経験があります。 (結果ループ分クラスが作成される) これも作り方の問題で解決できる部分もあるんだけれども 異言語間で使う方法がCreateObjectなわけで 本当にCreateObjectで作れるオブジェクトすべて解放されるのか? というとそんな事もないわけだ 例として先日Excelを外部から操作したときは明確に終了しないと残った状態になりました。 あの時は良くて、この時が良いと判断することができればそれでよいのですが それを考えるならCreateObjectで作ったオブジェクトはきちんと終了するとしたほうが わかりやすく手っ取り早いでしょ? ちなみにsh.Windowsは元がshだからshをきちんと終了すればWindowsの参照も終わります 私の場合Object型はすべてSet obj = Nothing も一応行います(極端な例ですが) 細かくなるとObjectはメモリー上のポインタが入っているだけなので メモリーで変数書き換えると解放されません。 オブジェクトの関数でオブジェクトを渡した場合にこの様な事が起きる可能性もあります。 長い間CreateObjectとか使う処理でいろんなプログラムをいろんな種類の言語で作ってきましたが 言語によっても動作が違います。 vb.netとかでライブラリを作るとわかるのですが(CreateObjectされる側)、 解放タイミングをとる事ができない言語も多いのです。 ただCreateObjectとかで他からの参照を行った場合(VBScriptだとSetで代入) Set obj = Nothing すればそのような問題に当たる事がありませんでした。 今のうちに習慣づけておけば余計なトラブルにも合わないという事で 変数に一度代入したほうが良いですよと助言したまでです。
renrun_

2020/09/18 00:46

貴重なご助言を詳しく教えてくださりありがとうございます。 ご助言を反映させていただきましたが、「オブジェクトがありません」エラーが発生してしまいます。 「オブジェクトは1回だけ作成し、繰り返し処理の最後で解放する」と解釈致しましたが、場所が違うのでしょうか。。。 --ここから Function getObjIE(KeywordTitleOrUrl) Dim KeyWord, ie, RE, Match, Matches Dim strTest 'As String Set ie = Nothing Set RE = CreateObject("VBScript.RegExp") On Error Resume Next Dim sh Set sh = CreateObject("Shell.Application") For Each obj In sh.Windows strTest = Range(obj.LocationURL).Value KeywordTitleOrUrl = Range("https://transit.yahoo.co.jp/search/").Value With RE .Pattern = KeywordTitleOrUrl .IgnoreCase = True .Global = True End With Set Matches = RE.Execute(strTest) If TypeName(obj.Document) = "HTMLDocument" Then For Each Match In Matches If RE.Test(Match.Value) Then Set ie = obj End If Next End If Set obj = Nothing ←ーーーー解放する Next On Error GoTo 0 Set RE = Nothing If ie Is Nothing Then MsgBox "指定のieが見つかりませんでした。" Else Set getObjIE = ie End If End Function
kuma_kuma_

2020/09/18 00:53

ごめんね、なんか荒らしたみたいになって。 最終的にはもう一つの方で回答は書きますので
renrun_

2020/09/18 02:32

とんでもないことです。質問にあたり、ここまで真摯にご対応いただけるものと思っておらず、感銘を受けました。本当にありがとうございます。
otn

2020/09/18 03:41

失礼しました。「オブジェクトは一旦変数に代入しないと参照がなくなっても解放されない」という主張かと誤解していました。 他の点は具体的じゃないのでなんとも。
otn

2020/09/18 03:46

> 「オブジェクトがありません」エラーが発生してしまいます。 どの行でしょうか? > 「オブジェクトは1回だけ作成し、繰り返し処理の最後で解放する」と解釈致しましたが、 いや、「for each の in の部分にCreateObjectは書かない」というアドバイスだと思います。 inの後に書いてもオブジェクトの生成は一度ですので。 あと、「解放する」のは明示的に書けないので、「オブジェクトを変数に代入した場合は、その変数に他の値を代入することでそのオブジェクトへの参照を無くす」ということで解放を期待します。
renrun_

2020/09/18 13:05

ご回答くださりありがとうございます。 VBAの関数を利用している事が原因と判明したため、まずはその問題への対処を試みようと思います。 > 「解放する」のは明示的に書けない →混乱をお招きしてすみません。コメントのつもりで記載しておりました。以後、気をつけます。 「Set obj = Nothing」が「解放」を指すと理解していたのですが、ここでは「Set ie = obj」しているため、「ieに他の値を入れれば参照を無効化できる」という事なのですね! 教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問