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

Quick Test Professional(QTP)を使用して社内サーバー(Webブラウザ)より複数ExcelファイルをDLするコードをVBScriptを使用して作成しています。
ただVBScriptもQTP上で多少制限があり、完全に同じではないようです(申し訳ございません、当方もQTP及びVBScriptを始めたばかりのため把握ができていない状況です)。
QTPから記録機能を使用している箇所もあります。
そのような状況でDLしたファイルが希望したものではなく、行き詰まっております。
お知恵を拝借いたしたくお願いいたします。

※「Download Data.xlsx」というExcelファイルにDLしたいファイルの情報やログインユーザー情報などを記載し、そこから取得しています。
一部下記リンク先を参考にさせていただきました。
http://q.hatena.ne.jp/1297409549/

Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2

Set obj = CreateObject("Excel.Application")
obj.Visible = True
obj.Workbooks.Open "C:\Users\XXXXX\Desktop\Download Data.xlsx"

With obj.Workbooks("Download Data.xlsx").Worksheets("Sheet1")
.Activate
uName = .Cells(2, 1).Value 'ユーザーID
pWord = .Cells(2, 2).Value 'パスワード
MaxRow = .UsedRange.Rows.Count

For i = 2 To MaxRow
getURL1 = .Cells(i, 3).Value 'DLしたいExcelファイルのURL
getPath = .Cells(i, 4).Value 'DLしたファイルを格納するデスクトップ上のフォルダ
getFL = .Cells(i, 5).Value 'DLしたいExcelファイルの名前
getURL2 = .Cells(i, 6).Value 'DLしたいExcelファイルの上位階層のURL

SystemUtil.Run "C:\Program Files\Internet Explorer\iexplore.exe", getURL2, "", "" 'ieの起動
Browser("XXXXXX").Page("XXXXXX").WebEdit("username").Set uName
Browser("XXXXXX").Page("XXXXXX").WebEdit("password").Set pWord
Browser("XXXXXX").Page("XXXXXX").WebButton("ログイン").Click

sSource = getURL1 '※コメントアウトにしている紆余曲折があるため意味のない置き換えをしています…
dName = getFL '※コメントアウトにしている紆余曲折があるため意味のない置き換えをしています…

'指定したデスクトップ上のフォルダに保存
Set ws = CreateObject("WScript.Shell") '特殊フォルダ名の取得
desktopDir = ws.SpecialFolders("Desktop") 'デスクトップの実体
sDest = desktopDir & "\" & getPath & "\" & dName 'コピー先
Set oHTTP = CreateObject("Msxml2.XMLHTTP")
oHTTP.Open "GET", sSource, False
oHTTP.Send
Set Stream = CreateObject("Adodb.Stream")
Stream.Type = adTypeBinary
Stream.Open
Stream.Write oHTTP.responseBody
Stream.Savetofile sDest, adSaveCreateOverWrite

Browser("XXXXXX").CloseAllTabs

Set Stream = Nothing
Set oHTTP = Nothing
Set ws = Nothing

Next

obj.Quit
Set obj = Nothing
End With

動作はエラーもなく完了し、Excelファイルも保存できましたが、そのファイルはオリジナルよりサイズが小さく、拡張子が違うとエラーが出て開くことができません。
参考とさせていただいたリンク先は画像ファイルをDLするもので、ExcelファイルをDLする場合実際は「『開く』『保存』『キャンセル』」を選択するメッセージが立ち上がり、ieのURLアドレスバーはExcelファイルのものが入力されていますが、画面はログイン画面のままです。
恐らくそのログイン画面をExcelで保存しているものと思われます。
指定したExcelファイルのアドレスからそのファイルを取得したいのですが、どのように改修すればいいのかわかりません。
このままのコードを修正してできるのであればその方法を、もし「『開く』『保存』『キャンセル』」の選択メッセージから保存を選びDLするしかないのであればその方法及び格納フォルダ指定の方法をご教示いただきたく、よろしくお願いいたします(QTPの記録でその格納先指定が上手くできなかったため上記のようなVBScriptを使用して作成しております)。

動作環境
OS win7
QTP 11
ie 8

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

  • ご回答ありがとうございます。
    すでにご覧になられているかもしれませんが、QTPに関しては下記リンクを参照していただければと思います。
    http://it.impressbm.co.jp/articles/-/6681
    ただ今回の場合QTPの記録で取得したコードで不具合を起こしているのではなく、恐らくVBScript部分で動かしている箇所でExcelファイルをDLするには何かが足りないとか何かが違うのではないかと思い、こちらのタイトルで質問させていただきました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/08/11 18:08
  • 敢えてQTPと出したのはその記録機能で取得したコードが含まれるためで、最初からある程度説明しておいた方がいいかと思ったのですが、混乱させてしまったのであれば申し訳ございません。
    そのQTPは職場で使用しているのですが、VBScript部分を作成できる詳しい者がおらず、窮地に陥りました。
    また今回の場合はExcelのファイルをDLしたいのですが(選択メッセージで選択するのであれば『保存』を選び、保存先フォルダを指定するのが希望です)、Download Data.xlsxはいろいろな人が設定に使用するのでそのファイルにマクロ設定は避けたく、また別のExcelファイルに…となってしまうので、できればExcel VBAを使用するのは避けたい状況です。
    VBScriptでは不可能ということであれば、再考いたしますが、今一度上記内容でご教示いただきたく、よろしくお願いいたします

      補足日時:2015/08/11 18:12
  • ご回答ありがとうございます。
    また私のレベルが未熟でコメント内容を理解できず申し訳ございません。
    Excel VBAを使用ということで、ExcelでAPIを記述したxlsmファイルを用意するものだと思い込んでしまっておりました。
    VBScriptで呼び出すのですね…失礼いたしました。
    早速試してみたのですが、やはり添付画像のようなダイアログが出てしまい、そこで動作が止まっている間にマクロは実行されて、その後ろのieで画面表示されているのはログイン画面なのでそちらをExcelファイルとして取得してしまいます。

    「VBScriptでExcelファイルをD」の補足画像3
    No.2の回答に寄せられた補足コメントです。 補足日時:2015/08/12 11:39
  • どうしてもログインしなければならず、そのため一旦別のページを開き、取得したいExcelファイルのURLを指定するとそのダイアログの後ろで読み込んでるような動作が見えるのですが、直接取得したいExcelファイルのURLを指定してログインすると読み込みそのものをしないで(画面表示完了として)このダイアログが表示されます。
    私のVBScriptスキルでは可否の判断ができないため、何度も訊いてしまって申し訳ございません。
    よろしくお願いいたします。

      補足日時:2015/08/12 11:41
  • ありがとうございます。

    >元のコードでも同様ですよね。
    >それは実際成功するのですか?

    成功というかExcelファイルは作成されるのですが、それはログイン画面をExcelで保存してるという状態で正確にはDLとは違う気がします。

    >IE オブジェクトからの操作をするか

    無人の時間帯に作動させるためQTP(UWSCの有償版のようなもの)を使用するので手動操作は含められません。
    そのためVBScriptでその操作ができないか質問させていただきました。

    >#2で書いたようなWin32 APIからの手法

    今回試させていただいたのがこちらの方法でした。
    32bitなのは確認してますが、上手く作動しませんでした。
    Excel2013なのが問題でしょうか。

    スキルがなく、ご面倒おかけして申し訳ございませんが、問題点等お気づきの箇所を教えていただけると助かります。
    よろしくお願いいたします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/08/12 21:03
  • >>Excelで保存してるという状態で正確にはDLとは違う気がします。
    >このような表現をされたら、どうしてよいのか分かりません。
    私はDLというのはサーバー上の指定したファイルをローカルに落とす(コピーして保存する)と思っているのですが、今回の動作はie上に表示されたサーバー上の指定したものとは別のファイルを指定したファイル名に変更して保存しているということで直接DLしたファイルにアクセスしてないのに何故?という感覚でしたので動作として違うと思ってしまいました。
    これも意図してないとはいえDLということになりますね…よく推敲せず投稿してしまい申し訳ございません。

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/08/13 12:06
  • >こちらが一つ書けば否定されて、再度、こちらが詳しく説明するという繰り返しでは、先に進めません。
    否定していると受け取られるのはこちらとしても心外です。
    動作環境でできることとできないことがあり、そのうち何を伝えなければならないのかはどういう処理をするかで変わります。
    それをお伝えしたり、動作確認をしてできなかった旨をお伝えしています。
    VBSの掲示板がなかったので今回こちらに投稿いたしましたが、他の質問掲示板等では、
    「私:ここまで作ったけどこれができなくて困ったとコードを載せる」→「回答者:ここをこれに変えて、とか、これを追加してという意見が出る」→「私:やってみる、でもできない」→「回答者:じゃあこれに、と別の案」という流れがあって、最終的に「動いた!」となるか、「やはりできない」→「それ以上は方法ない」と回答者が言ってくだされば、「諦める」というようにしていました。

      補足日時:2015/08/13 12:08
  • こちらでもそのような流れでいいものと判断しておりました。
    私はVBSの初心者と最初に記載していますし、文章の内容からプログラマーでもSEでもプログラミングに精通している人物でもないということは精通している方から見れば一目瞭然でしょう。
    そんな精通している方からすれば簡単な用語でも曖昧に書かれてしまえば初心者にはわからなかったり意味を取り違えられることがあるということもご判断いただけるのではないでしょうか。
    >>>IE オブジェクトからの操作をするか
    >この意味も理解していないようですね。ダウンロードのダイアログは、概ねJavaScript なのですが、それをIEオブジェクトから操作するという意味です。そのためには、Web解析をしなくてはならない、と書いても分からないかもしれませんね。
    以前のIEではExcelも画面表示できたと思います。

      補足日時:2015/08/13 12:10
  • 最近のIEでは必ずこのダイアログが出ますので、IEの仕様と思っています。
    そのためそれを回避してDLするかダイアログの操作をしてDLするVBSのコードが、プログラミングに精通している方ならご存知ではないかと思い、質問させていただきました。
    JavaScriptだと言われてもまずVBSで何ができるかもわからない私程度の者がVBSでJavaScriptを操作できるのかもわかりませんし、そこから勉強を始める時間はありません。
    そしてWeb解析までは今回の業務として行なうことはできません。
    VBAですが下記サイトに似たようなまとめが記載されておりました。
    http://www.ka-net.org/blog/?p=4855
    そのサイトでもお勧めしている2方法でできなかったので、自分レベルのVBSではできないもしくは自分の動作環境ではできないと諦めた方がよさそうですね。

      補足日時:2015/08/13 12:12

A 回答 (4件)

申し訳ないのですが、私の話は、ほとんど伝わっていないようです。



こちらが一つ書けば否定されて、再度、こちらが詳しく説明するという繰り返しでは、先に進めません。

一つのポイントをクリアして、次に進むのであっても、未だ、最初の段階さえクリアしていないのでは、次には進みません。

>Excelで保存してるという状態で正確にはDLとは違う気がします。
このような表現をされたら、どうしてよいのか分かりません。

>>IE オブジェクトからの操作をするか
この意味も理解していないようですね。ダウンロードのダイアログは、概ねJavaScript なのですが、それをIEオブジェクトから操作するという意味です。そのためには、Web解析をしなくてはならない、と書いても分からないかもしれませんね。

以上ですが、私から、お教えできることは、これ以上ないのです。
もう一度、話をまとめて、質問を仕切り直ししたほうが良いかもしれません。無駄に、お時間を取らせてすみせんでした。
この回答への補足あり
    • good
    • 0
この回答へのお礼

こちらこそありがとうございました。

お礼日時:2015/08/13 12:12

こんにちは。



>早速試してみたのですが、やはり添付画像のようなダイアログが出てしまい、そこで動作が止まっている間にマクロは実行されて、その後ろのieで画面表示されているのはログイン画面なのでそちらをExcelファイルとして取得してしまいます。

ということは、ダウンロードは失敗しているという意味でしょうか。

>直接取得したいExcelファイルのURLを指定してログインすると読み込みそのものをしないで(画面表示完了として)このダイアログが表示されます。

これは、元のコードでも同様ですよね。それで、マニュアルであろうとも、それは実際成功するのですか?

私が同じ場面に直面した時は、2つの方法を考えますが、
 IE オブジェクトからの操作をするか、
 もう一つは、#2で書いたようなWin32 APIからの手法です。

ふつうは、前者で済んでしまうのですが、Web解析をしなくてはなりません。それは、個別の内容になりますから、公開しない限りは、自分で開発しなけれはならないと思います。なれていないと、なかなか、一筋縄ではいかないような気がします。

後者の方は、Excel オートメーションで、Win32 APIを呼び出して、SendMessageあたりで、処理してしまう、ということです。ただ、ここら辺りのことになると、分からないなら、USCW などの、Windows マクロで済ませたほうが早いような気がします。中身は、Win32 APIと同じですけれどね。
この回答への補足あり
    • good
    • 0

こんにちは。



>QTPに関しては下記リンクを参照していただければと思います。
残念ながら、私には、総論的な話を読んでも、それ自体はわかりませんし、この部分は直接に触れるつもりはありません。

再度、自分の#1のレスも含めて、読みなおしてみました。

>もし「『開く』『保存』『キャンセル』」の選択メッセージから保存を選びDLするしかないのであればその方法

>今回の場合はExcelのファイルをDLしたいのですが(選択メッセージで選択するのであれば『保存』を選び、保存先フォルダを指定するのが希望です)

全面的に、コードを変えないとできません。今回たまたま、ここのカテゴリの別の質問で、「Webページ中の javascript をVBAから実行するには」という質問がありましたが、こちらでは、概略的な部分でしかアドバイスができません。試行錯誤は避けられないと思います。今のような、直接ダウンロードというようには行きません。また、IEの execWB で行うという方法もありますが、現状でみる限りは、必要があるとも思えません。

また、保存先フォルダを変えるというのは、少なくとも、プログラム上のIEから、触らないほうがよいと思います。かなりセンシティブな問題が発生しかねませんから。むろん、事前には可能です。

それに、
 sSource = getURL1
この部分が無駄になってしまいます。

>恐らくVBScript部分で動かしている箇所でExcelファイルをDLするには何かが足りないとか何かが違う

それは、質問のコードを試したわけではありませんが、もし気になるなら、その都度、コードの途中で、ファイル状態をチェックしてみないと分かりません。

試しに、3つの違ったコードを書いてみました。その内、2つを紹介します。(もう一つは、SFCminiを使ったものです)
使用するデータは、公開された公共のデータですから、著作権には該当しません。

'//(1)
'三田線の駅
Const strURL ="http://www.mlit.go.jp/common/001094832.xlsx"
Dim myFOLDER
Dim objADO
Dim dstDLFolder
Dim WSHShell
Dim WSH_Folder
Set WSHShell = CreateObject("WScript.Shell")
Set WSH_Folder = WSHShell.SpecialFolders
myFOLDER =WSH_Folder.Item("Desktop")
i = InStrRev(strURL, "/")
buf = Mid(strURL, i + 1)
If InStr(dstDLFolder, ".") = 0 Then
dstDLFolder = myFOLDER & "\" & buf
Else
dstDLFolder = myFOLDER
End If
On Error Resume Next
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
Call objHTTP.Open("GET", strUrl, False )
objHttp.Send
If objHttp.status = 200 then
Set objADO = CreateObject("ADODB.Stream")
objADO.Open
objADO.Type = 1 ' バイナリ
objADO.Write objHTTP.responseBody
objADO.SaveToFile dstDLFolder, 2
objADO.Close
Else
WScript.Echo "Error: " & Err.Description
Wscript.Quit
End if

'//

'(2)Excelを利用した方法
'都庁 入札サンプル
Const strURL ="http://www.njss.info/v6/files/organization_offer …
Dim myFOLDER
Dim i
Dim buf
Dim dstDLFolder
Dim command
Dim WSHShell
Dim WSH_Folder
Set WSHShell = CreateObject("WScript.Shell")
Set WSH_Folder = WSHShell.SpecialFolders
myFOLDER =WSH_Folder.Item("Desktop")
i = InStrRev(strURL, "/")
buf = Mid(strURL, i + 1)
If InStr(dstDLFolder, ".") = 0 Then
dstDLFolder = myFOLDER & "\"& buf
Else
dstDLFolder = myFOLDER
End If
command = "CALL(""urlmon"", ""URLDownloadToFileA"", ""JJCCJJ"", 0, """& strURL &""", """& dstDLFolder &""", 0, 0)"
With CreateObject("Excel.Application")
.ExecuteExcel4Macro(command)
End With

'---
>そのファイルにマクロ設定は避けたく
>Excel VBAを使用するのは避けたい
Excelで利用しても、何の遜色もありません。むしろ、こちらに軍配が上がります。今回は、メインの問題には外れますが、試してみる価値はあるように思いました。理由は、他からの介入の度合いが低いからです。「マクロの設定」というのは、何を意味しているのか分かりませんが、Excelを使いながら、上記のように、VBA(アプリ用の言語)の利用はダメというのは、誤解なのか、それとも変則的なルールなのでしょうか。ただ、あまり厳密に排除していくと、結果的には、Excelそのものが使えなくなってしまいます。その辺りは、臨機応変に考えたらいかがかと思います。
この回答への補足あり
    • good
    • 0

こんにちは。



なかなか、レスがつきませんね。
つかない理由は、2点です。

一つは、QTP というのは分からないということです。
もうひとつは、内容的に変則的だからです。Excelがあるなら、Excel VBAで処理してしまえばよいと思います。

仮に、Excel オートメーションで使ったとしても、ダウンロードに、Win32API のURLDownloadToFileを使えば簡単に済むはずです。もし、そういうスタイルに支障があれば、また話は変わってくるのですが、Adodb.Streamでダウンロードで行うというのは、何か、せっかくのExcel の機能をフルに使っていないような気がします。

インターネットで、Excel オートメーションだけで、Win32 APIを使うのは、

command = "CALL(""urlmon"", ""URLDownloadToFileA"", ""JJCCJJ"", 0, """& url &""", """& sFileName &""", 0, 0)"

With CreateObject("Excel.Application")
  .ExecuteExcel4Macro(command)
End With

とするようです。(以下のサイトも伝聞のようですが……)

https://omuraisu777.wordpress.com/2009/05/23/vbs …

ややこしいので、許されるなら、SFC mini をインストールして、呼び出したほうがよいかもしれませんね。
この回答への補足あり
    • good
    • 0

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