[ 掲示板に戻る ]

過去ログ閲覧モード

ファイルのアップロード方法、ウィンドウIDを取得出来ない / ししずむ
とある会員サイトで、CSVファイルから情報を取得して、画像ファイルを登録(アップロード)しようとしています。
<form>の中にある要素の<input type = "file"></input>をクリックすると、
「アップロードするファイルの選択」というダイアログが出てきます。

@ダイアログ上部のディレクトリを表示している欄に、画像を保存しているディレクトリを入力。

Aファイル名の欄に、CSVファイルに掲載している画像名を貼り付けて、「開く」をクリック。

B次の画像を登録

という作業を実現したいと思っています。

----------記述してみたソース------------

IE.document.forms[0].elements[2].click() //<form>の中にある要素の<input type = "file"></input>をクリック、ダイアログを立ち上げる。

Up_ID = getid("アップロードするファイルの選択") //ダイアログのウィンドウIDを取得。

SCKEY(Up_ID, VK_TAB, VK_TAB,VK_TAB,VK_TAB,VK_TAB,VK_SPACE) //ディレクトリ情報を入力する欄にカーソルを移動。

SENDSTR(Up_ID,Pic_Dir) //画像アップロード元ディレクトリ情報を貼り付け。

SCKEY(Up_ID,VK_RETURN) //画像アップロード元ディレクトリに移動。

SCKEY(Up_ID,VK_SHIFT,VK_TAB,VK_TAB) //ファイル名を入力する欄にカーソルを移動。

SENDSTR(Up_ID,画像ファイル名) //CSVファイルから読み込んだファイル名を入力。

SCKEY(Up_ID,VK_RETURN) //「開く」をクリックして画像をアップロード。

----------記述してみたソース------------

上記のソース内容を記述してみましたが、動きませんでした。
ダイアログのウィンドウIDが取得できていないようです。

sleep()で待ち時間等を設定しましたが、動きませんでした。

GetId()の記述の仕方はあっていると思うのですが、どうしてウィンドウIDが取得できないのか分かりません。

このような場合、どのようなソースを記述すれば良いのでしょうか?ご教授よろしくお願いいたします。

使用ソフト:UWSC5.2.2.0
OS:Windows7
Internet Explorer:ヴァージョン11

No.2933 2016/09/26(Mon) 18:42:50

Re: ファイルのアップロード方法、ウィンドウIDを取得出来ない / stuncloud
> どうしてウィンドウIDが取得できないのか分かりません。
IE.document.forms[0].elements[2].click() してファイル選択ダイアログが表示された時点でスクリプトがブロックされてるからですね
getid()が動作するのはダイアログが閉じられた後になります
ファイル選択ダイアログに対する処理を関数化して、あとはinput要素をclick()する直前にその関数をthreadで呼ぶことで対処可能です

thread SetFileDlg()
IE.document.forms[0].elements[2].click()

procedure SetFileDlg()
 id = getid("アップロードするファイルの選択")
 // ファイル選択ダイアログに対する処理
fend

No.2945 2016/09/27(Tue) 10:58:54

Re: ファイルのアップロード方法、ウィンドウIDを取得出来ない / ししずむ
ご丁寧にありがとうございます!
その様なやり方は全く知りませんでした。

 IE.document.forms[0].elements[2].focus()
 SCKEY(IE_ID,VK_SPACE)
 sleep(0.3)
 UP_ID = GetID("アップロードするファイルの選択")
上記の様に、一旦focus()させてからスペースキーを送ることで、
ダイアログがアクティブになり、操作出来るようになりました。

教えていただいた方法も今後の作業で必要になってくるので、
試してみて身につけたいと思います。

ありがとうございました!!

No.2969 2016/09/28(Wed) 23:48:53
メッセージボックスが表示されるまで待つ / テス
UWSCで秀丸マクロを実行後、クリップボードに張り付けるものを作成したい考えています。

hide_id = GETID("秀丸")
SCKEY(hide_id, VK_CTRL, VK_A)
SCKEY(hide_id, VK_CTRL, VK_V)
SCKEY(hide_id, VK_ALT, VK_M ,VK_X)

id1 = GETID("マクロ実行", "#32770", -1)
SCKEY(id1, VK_TAB)
SCKEY(id1, VK_RETURN)
SLEEP(10)
SCKEY(hide_id, VK_CTRL, VK_A)
SCKEY(hide_id, VK_CTRL, VK_C)

上記で動く事は動くのですが、SLEEP(10)とは限りません。
そこでふと思ったのですが、秀丸マクロで「マクロ完了」とメッセージが出る条件で
全選択⇒コピー といった事は可能でしょうか

No.2952 2016/09/27(Tue) 23:16:40

Re: メッセージボックスが表示されるまで待つ / 俄プログラマー
Repeat Until 文を使用
No.2955 2016/09/28(Wed) 00:39:33

Re: メッセージボックスが表示されるまで待つ / テス
ご返信ありがとうございます。

Repeat Until 文でループさせる場合、どのような条件式になるでしょうか

No.2956 2016/09/28(Wed) 02:34:33

Re: メッセージボックスが表示されるまで待つ / satocha
秀丸エディタを持っていない(有料ですからね)のですが、思いつく方法を書いてみます
>秀丸マクロで「マクロ完了」とメッセージが出る
というのがどういう状況を言っているのかわからないので、場合分けして答えます
場合1=マクロ終了後に「"マクロ実行"」ダイアログが閉じる場合
  while status(id1,st_isid)
   sleep(0.1)
  wend
場合2=別のマクロ終了ポップアップが出てくる場合
  この新ダイアログがgetid("マクロ終了")で補足できるとして
  repeat
   end_id=getid("マクロ終了")
   //ここでポップアップを閉じる処理(ありそうなのがclkitem(end_id,"OK",clk_btn))が必要かも
  until status(end_id,st_isid)
場合3=マクロ実行ダイヤログが残ったままで終了ポップアップも出ず、エディタのメッセージエリアに「マクロ終了」という文字列が出力される場合。エディタ本体でなくマクロ実行ダイヤログにメッセージが出るなら下のhide_idをid1におきかえてください
  repeat
   allstr=""
   for str in getitem(hide_id,itm_acctxt,-1)
    allstr=allstr+str
   next
   for str in getitem(hide_id,itm_statusbar,-1)
    allstr=allstr+str
   next
  until pos( "マクロ終了", allstr ) 

ただ、これUWSCを使わず全部秀丸のマクロでできたりしないのでしょいうか

No.2957 2016/09/28(Wed) 05:08:37

Re: メッセージボックスが表示されるまで待つ / 俄プログラマー
>Repeat Until 文でループさせる場合、どのような条件式になるでしょうか

「秀丸マクロで「マクロ完了」とメッセージが出る条件で」
とご自身で書かれている筈ですが?
Repeat Until 文、GETID 文
ヘルプで使い方の例があります。参考にして練習してみてください。

PS
スレの乱立、お名前の変更は避けましょう。
答える側の事も考えて下さいね。

No.2963 2016/09/28(Wed) 12:20:51

Re: メッセージボックスが表示されるまで待つ / テス
ご返信ありがとうございます。

>ただ、これUWSCを使わず全部秀丸のマクロでできたりしないのでしょいうか
確かにその通りでした。
秀丸マクロでクリップボードにコピーすれば済む話でした。

repeat〜untilの文例ありがとうございます。
マクロ終了のメッセージが出た場合の条件式を自力で作成する事が出来ず、
質問を重ねてしまい申し訳ありません。
大変勉強になりました。

No.2966 2016/09/28(Wed) 15:23:00
同タイミングでの2つのPopupWin / tiny
はじめまして。大変お世話になっております。

下記のようなPopupWinを含む1つのスクリプトをランチメニューから同時に起動して2つのIEに対して別々に処理したいのですが、うまくいきません。
PopupWinするタイミングはそれぞれのIEでランダムなのですがほぼ同じになる時があり、その時にPopupWinした2つのウィンドウを区別できないのかうまくクリックできません。
親IEからPopupWinしたウィンドウのみをクリックすることは可能でしょうか?
よろしくお願い致します。

Thread PopupWin()
IESetData(IE,True,"","alt=決定")
BusyWait(IE)

Procedure PopupWin()
ID = getid("Web ページからのメッセージ","#32770",-1)
clkitem(ID,"OK")
Sleep(1)
Fend

No.2926 2016/09/26(Mon) 12:10:38

Re: 同タイミングでの2つのPopupWin / stuncloud
同時にダイアログが出た場合は、双方のスクリプトが同じダイアログからgetidでIDを取得しているのではないかと考えられます
そのため片方のスクリプトではクリックに成功し、もう片方はクリック対象を失って失敗している…と仮定した場合以下で回避できるのではないかと思います

Procedure PopupWin()
 ID = getid("Web ページからのメッセージ","#32770",-1)
 if ! clkitem(ID,"OK") then
  PopupWin()
 endif
Fend

クリックに失敗したらもう一度ダイアログを待機します
こうすれば残ったダイアログも見つけられるのでクリックさせられます

この方法で上手く行けば、どちらのIEが出したダイアログかは考慮する必要がないので楽ですね
ただし懸念点がないわけではなく、双方のスクリプトのclkitemが成功したことになってしまう場合にこれでは上手く処理できないんですね
タイミングによってはそういうこともあり得るかもしれないです

あとそもそも仮定が間違っている可能性もあります
とりあえずお試しください

No.2929 2016/09/26(Mon) 14:56:20

Re: 同タイミングでの2つのPopupWin / tiny
アドバイスありがとうございました。
アドバイス頂いた通りやってみたのですが、うまくいきませんでした。

>同時にダイアログが出た場合は、双方のスクリプトが同じダイアログからgetidでIDを取得しているのではないかと考えられます
>そのため片方のスクリプトではクリックに成功し、もう片方はクリック対象を失って失敗している…と仮定した場合


仰られているこの仮定はその通りだと思います。
実際例えばIE1,IE2の出すダイアログをdlg1,dlg2として、dlg2のクリックを失敗し開いている状態で次のdlg1が開かれるとIE1はdlg2をクリックしている様な現象が見られます。

引き続き良いアイデアがありましたらよろしくお願い致します。

No.2942 2016/09/27(Tue) 10:03:53

Re: 同タイミングでの2つのPopupWin / しろまさ
IEのプロセスが別ならGetAllWinからPIDで判断できるのでは?(タブ型だとダメ)
No.2943 2016/09/27(Tue) 10:37:30

Re: 同タイミングでの2つのPopupWin / stuncloud
あーだめでしたか、やはり両方でOKが押せたことになっちゃってるのかな?
であればもう双方のスクリプトで2回づつクリックを試みるとかでいい気がします

Procedure PopupWin()
 for i = 1 to 2
  ID = getid("Web ページからのメッセージ","#32770")
  clkitem(ID,"OK")
  while status(ID, ST_VISIBLE)
   sleep(0.1)
  wend
 next
Fend

getid空振り時に無限待ちしないように第三引数の-1は外しました
あとはOKをクリックしてからダイアログが消えるまでの間に同じダイアログをgetidしないように待つ処理も入れてみました (意味ないかもですが、不要そうなら消して大丈夫です)
計4回処理を試みるのでどっかしらでふたつのダイアログに引っかかるんじゃないかと思います
getidの無限待ちを止めたので thread PopupWin() はなるべくダイアログが出る直前に呼んでください

No.2944 2016/09/27(Tue) 10:47:49

Re: 同タイミングでの2つのPopupWin / tiny
アドバイス通りやりましたが、やはりうまくいかない時があります。
タイミングによっては、
COM_Error:Access violatin at adress 0068A6B1 in module 'uwsc.exe'.Read of address 00000000
のようなエラーが出て止まります。
調べたところ、実際にはクリックできてないがクリックできたと判定して次の処理に進んでしまうためエラーしている様です。
タイミングの問題ということで、sleepを場所、長さを変えて挿入したり、ループ回数を変えたり等してみましたがだめでした。
何かあと一息のような気がしますので、引き続きよろしくお願い致します。

No.2951 2016/09/27(Tue) 23:13:53

Re: 同タイミングでの2つのPopupWin / 俄プログラマー
TRYを使ってみるとか?
No.2954 2016/09/28(Wed) 00:38:28

Re: 同タイミングでの2つのPopupWin / stuncloud
こちらで検証用ページを作って試した限りでは問題なく動作しています
必要な情報が足りずこれ以上はもうアドバイスのしようもありません
(実際のサイトが見れれば話は別なんですが)
あとはもう、そもそもダイアログ出させなくするとかいった乱暴な手段しか思い浮かばない

> やはりうまくいかない時があります。
うまくいく場合もあるってことですよね
どういった場合にうまくいかないかを調べてそれに対処していくしかないでしょう
> 何かあと一息のような気がしますので
とのことなのでがんばってください

No.2961 2016/09/28(Wed) 09:50:37

Re: 同タイミングでの2つのPopupWin / tiny
わざわざ検証までして頂きありがとうございます。
もう少し原因を調べてさらに試行錯誤したいと思います。
本当にありがとうございました。

No.2964 2016/09/28(Wed) 12:22:07
テキストデータ全体をメッセージ表示 / シン
質問です
すでに開いている秀丸のテキストデータすべてをクリップボードに張り付け、メッセージに反映するにはどうすればいいでしょうか

No.2936 2016/09/27(Tue) 01:39:33

Re: テキストデータ全体をメッセージ表示 / しゅん
秀丸に対してSCKEY等で全選択・コピーを指示し、GETSTRでクリップボードから内容を取得、MSGBOXで表示すれば良いと思います。
No.2959 2016/09/28(Wed) 08:53:23
com_error / あんず
いつもお世話になっております。

過去ログからの質問です。

ie = GETACTIVEOLEOBJ("InternetExplorer.Application")

msgbox("HTMLソースを取得したい部分を選択してからOKを押してください")

selection = ie.document.getSelection()
if selection.rangeCount then
 range = selection.getRangeAt(0)
 content = range.cloneContents()
 elem = ie.document.createElement("div")
 elem.appendChild(content)
 // クリップボードへコピー
 sendstr(0, elem.innerHTML)
else
 msgbox("未選択です")
exitexit
endif

上記はwebサイトで文字選択した箇所をソースコードでクリップボードに張り付くものです。
ただし私の環境だと1行目「ie = GETACTIVEOLEOBJ("InternetExplorer.Application")」
でcom_errorが出てしまいます。
エラー無く走らせるにはどのように修正すればよろしいでしょうか
何卒よろしくお願いします。

No.2934 2016/09/26(Mon) 18:45:20

Re: com_error / トリビア
単純にIEが起動してないだけではないでしょうか。
No.2935 2016/09/26(Mon) 19:23:08

Re: com_error / しろまさ
この辺かな?
http://www.uwsc.info/faq.html#N30

No.2939 2016/09/27(Tue) 08:16:35
クリップボードの中身を変数に置き換え / 初心者
秀丸に文字列が記載されています。
その内容全てを変数や定数に置き換える事は可能でしょうか。

hide_id = GETID("秀丸")
html = fget(hide_id, F_ALLTEXT)

上記ではエラー出ました。

何卒よろしくお願いします

No.2931 2016/09/26(Mon) 15:37:29

Re: クリップボードの中身を変数に置き換え / 初心者
ごめんなさい タイトルに不備がありました

クリップボードの中身を変数に置き換え ×

秀丸の中身を変数に置き換え

No.2932 2016/09/26(Mon) 15:38:35
テキスト内容をIEのabout:blankに反映 / ラム酒
過去ログでの質問です。

----------------------------------------------
テキストファイルにHTMLソースが記載されています。
これをHTMLファイルに書き換え、ブラウザ上の値(ソースではない)を全てクリップボードにコピーしたいと考えています。

上記の動作をhtmlファイルを新たに作らずに配列のようなもので処理する事は可能なのでしょうか。


No.2763 2016/08/16(Tue) 16:55:37


☆ Re: HTMLソースを配列で処理 / stuncloud

htmlfileでいいのでは
IEをabout:blankで開いてdocument.writeしてもいいと思います

以下はhtmlfileの例です

fid = fopen("HTMLの書かれたテキストファイル.txt", F_READ)
html = fget(fid, F_ALLTEXT)
fclose(fid)

document = createoleobj("htmlfile")
document.write(html)

msgbox(document.body.innerText)
----------------------------------------------

「IEをabout:blankで開いてdocument.writeしてもいいと思います」
こちらの方法を取りたいのですが、どのように記載すればよろしいでしょうか。

No.2927 2016/09/26(Mon) 13:24:27

Re: テキスト内容をIEのabout:blankに反映 / stuncloud
htmlfileの場合ととくになにも変わりません、変数htmlは上記の引用と同様にファイルを全行読み出したものです

ie.navigate("about:blank")
BusyWait()
ie.document.write(html)

No.2928 2016/09/26(Mon) 14:32:45

Re: テキスト内容をIEのabout:blankに反映 / ラム酒
ありがとうございます。
うまくいきました

No.2930 2016/09/26(Mon) 15:33:49
メールを受信したい(SSL) / まるぱ
いつもUWSCとここで回答されているご先輩の方々のブログには大変お世話になっています。

SSL対応のメールを受信するプログラムを作りたいのですが、
自力では到底できそうになくお力を借りたい次第です。

これまで調べて、dllを利用する方法を調べました。


●BASP21.dll、これはUWSCの使用例に掲載されていますが、残念ながらGmailなどのSSLが必要なメアドには対応していません。


●NonMailNet.dll、こちらは完全無料ではないために、検討を見送りました。


●TKMP.DLL、VB.NET C#.NET 用のメール送受信クラスライブラリ ということなのですが、
UWSCで利用できるのかどうか自分には判断できません。

C#.NETのdllはCOMではないなどの情報を何処かのページでよみました。
POWERSHELLを使えばできるのでしょうか?


DEF_DLL  POWERSHELL どちらも理解するのが難しく、他のプログラム言語は学習しておりません。


dllを使わなくても構いませんので、SSL対応のメール受信をする方法がございましたら
アドバイスいただけると助かります。


Windows上で稼働させて、定期的にメールを受信して、その内容次第でいろいろな処理をさせたいと思っています。

よろしくお願い致します

No.2895 2016/09/18(Sun) 20:47:52

Re: メールを受信したい(SSL) / しろまさ
この辺で。
http://serialty.blog117.fc2.com/blog-entry-10.html

No.2899 2016/09/19(Mon) 09:24:20

Re: メールを受信したい(SSL) / まるぱ
しろまささん、アドバイスありがとうございます。
よくブログを参考にさせていただくことがあります。

ご紹介いただいたページは「CDOによるメール送信」ですね。
これはすでに実現できております。Windowsに標準でついている機能でできますので理想的です。

でも受信についてはなかなかいい情報が見つからず、ここに書き込んだ次第です。

No.2902 2016/09/19(Mon) 16:56:48

Re: メールを受信したい(SSL) / しろまさ
あ、受信でしたね。失礼しました。
私も昔、諦めた記憶があります。また調べてみます(_ _)

BASP21 Pro FAQ smtps http://www.b21soft.co.jp/basp21/basp21pfaq.html#smtps
Proか。。

Winsockを使えば出来そうですね。
ざっと検索してみましたがダイレクトなコードは見つかりませんでした。
Winsock メール 受信 で検索して他言語のサンプルを書き直すしかないのかな。
ゴリゴリな DEF_DELL 使用のコードになりそうですけどね^^

No.2903 2016/09/19(Mon) 17:32:17

Re: メールを受信したい(SSL) / stuncloud
gmail限定ならAPIで
過去記事: http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=2105

No.2905 2016/09/20(Tue) 12:23:07

Re: メールを受信したい(SSL) / まるぱ
しろまささんも、あきらめたのですか、、、それなら私には無理かも(^ ^;

散々探しても参考になりそうなコードはないですね。

BASP21 Proは、このようなニーズに気づいて作られた有料プログラムなのかもしれません。

以前とはちがって一般的なWindowsが7以降のバージョンになってきましたので
それらのOSに標準で入っていそうなdllとか使うのって無理なんでしょうか?

誰かTKMP.DLLをUWSCで使えるようにCOM化したdll作ってくれたらと思うこのごろです。

ゴリゴリなDEF_DELL使って書いた関数なら、使いやすいかもしれませんね。


stuncloudさん、情報ありがとうございます。
Gmail、google apiでできるというのは私も最近知りました。
でもおっしゃるとおりgmailなんで、汎用性が、、、

海外のを探したとしても、日本語処理が問題になりますね。

No.2907 2016/09/20(Tue) 22:02:36

Re: メールを受信したい(SSL) / stuncloud
Officeが、というかOutlookがインストールされているならそれを使うという手も?
とりあえずこんな感じで受信済みのメールは見れました

// 予めOutlookで必要なメールを受信できるように設定しておく
Outlook = createoleobj("Outlook.Application")
NameSpace = Outlook.GetNamespace("MAPI")
Folder = NameSpace.Folders("xxxxxxx@gmail.com").Folders("受信トレイ") // gmailの「受信トレイ」

with Folder.Items(1) // 添字は1から
 print .Subject
 print .ReceivedTime
 print .Body
endwith

送受信をさせたい場合は
NameSpace.SendAndReceive(TRUE) // 引数: 進捗ダイアログの有無、FALSEだと非表示
でできるみたいです

https://msdn.microsoft.com/ja-jp/library/office/ff866895.aspx
Outlookはなんかわかりづらいな…

No.2909 2016/09/21(Wed) 11:29:50

Re: メールを受信したい(SSL) / しゅん@平凡な職業プログラマー
TKMP.dllをPowerShell経由で使ってみました。
ご参考まで。
http://d.hatena.ne.jp/junjun777/20160921/powershell_mail_recv_ssl

↓TextBlock内はPowerShellスクリプト。戻り値・引数はそれで良いかと思います。

No.2910 2016/09/21(Wed) 12:24:44

Re: メールを受信したい(SSL) / まるぱ
stuncloud さん、どんな風に動作するのか興味はあります.
Outlookで使うメアドは予め設定したものになるのですかねぇ?
ご紹介いただいたmsdnには「CreatObj」という言葉がありますね、まさにUWSCのCreateOLEObj!
こういう知っているような言葉があれば資料も理解できそう、、、な気がします(-^

しゅんさん、
とてもよくブログを参考にさせて頂いています。
多くが高レベルな内容なので、じっくり読んでも理解できないことが多いです、
さぞすごいプログラマーさんなんでしょうね。
!!!
ご紹介いただいたページ拝見したら、なんと!この質問のために書いていただきましたか!!
イヤイヤ、、、なんと言っていいのやら、、、、m(- -;)m アリガトウゴザイマス

さすがですね、サクッと書いてしまったようで。

TKMP.dll 、そのまま使えちゃったんですね、レジストリ登録なしに。スゴイ....

TextBlock文を使うのがなんとも不思議な感覚です。
この文の中って、そのままそのdllで使われている言語なんでしょうかね?

data = PowerShell(TextBlock) という形で実行で、戻り値は得られますね。

引数を渡したいときは
TextBlock文内の変数部分を置換すればいいのでしょうか
PowerShell(Replace(TextBlock,"変数A","値A")
のような感じですか?


これでしたかったことが実現できそうな予感がします。
この掲示板で皆さんにお聞きして本当によかったです。
しろまささん、stuncloudさん、しゅんさん、まことにありがとうございました!

No.2911 2016/09/21(Wed) 21:07:10

dllを使ってSSLメールの受信に成功 / まるぱ
しゅんさんからいただいたアドバイスがきっかけで、
PowerShellとTKMP.dllを使ってSSLのメールを受信するに成功しましたので報告いたします。


目的:

最も日付の新しいメールから順に件名を取得して、
件名の中にキーワードがあれば、そのメール本文を戻り値として得る


方法:

テキストブロック_SearchTKMPmailを変数に代入。

Respon = _SearchTKMPmail


変数中の%%server%%などをReplace文で使用する設定に置き換える。
Respon = Replace(Respon,"%%Title%%",ここにキーワードを入力")
Respon = Replace(Respon,"%%server%%","pop3.yahoo.co.jp")
他も同様に....

PowerShell実行
Data = TRIM(PowerShell(Respon))
Dataにメール本文が入ります。




以下テキストブロックの中身

TEXTBLOCK _SearchTKMPmail

Add-Type -Path TKMP.dll;
$server = "%%server%%";
$port = "%%port%%";
$userid = "%%userid%%";
$pass = "%%pass%%";

$Title = "%%Title%%";
$TargetNum = %%TargetNum%%;

$logon = New-Object TKMP.Net.BasicPopLogon($userid, $pass);
$pop = New-Object TKMP.Net.PopClient($logon, $server, $port);

#SSLを使用します
$pop.AuthenticationProtocol = [TKMP.Net.AuthenticationProtocols]::SSL;

#接続開始
if ($pop.Connect()) {

$Data = "";
$MailFound = $false;

# for ($i=1; $i -lt $pop.MailDatas.Length; $i++){
$j = $pop.MailDatas.Length -1
if ($j -gt -1){

$FoundNum = 0;
$CountNum = 0;
for ($i=$j; $i -gt 0; $i--){
#検索するのは最大10件まで
$CountNum += 1;
if ($CountNum -eq 10){break};

$Mail = $pop.MailDatas[$i];
if ($Mail.ReadHeader()){
# System.IO.Stream
$Header = $Mail.HeaderStream;

$reader = New-Object TKMP.Reader.MailReader($Header, $true);

$subject = $reader.HeaderCollection["Subject"];
$sender = $reader.HeaderCollection["from"];

# メール件名の中にキーワードがあるか探す
$SearchResult = $subject.IndexOf($Title);

if ($SearchResult -gt -1){
if ($Mail.ReadBody()){
$Body = $Mail.DataStream;
$reader = New-Object TKMP.Reader.MailReader($Body, $false);
$MailBody = $reader.MainText;
$FoundNum += 1;
if ($FoundNum -eq $TargetNum){
$MailFound = $true;
Write-Host $MailBody;
break;
}
}
}
}
}
if($MailFound -eq $false){Write-Host "メールがありません";}
} else {
Write-Host "メールがありません";
}

#切断
$pop.Close();

} else {
Write-Host "メールサーバーから応答がありません";
}
ENDTEXTBLOCK

No.2925 2016/09/25(Sun) 14:56:23
IF文について / アオ
初心者です。

クリック項目でラジオボタンとチェックボックスとセレクトボックスがランダムになっているので
IF文を使ってクリックしたいのですが、うまくいきません。
どこがちがうのかよくわかりません。宜しくお願い致します。


if IE.document.forms[0].elements[0].click()
else
IE.document.forms[0].elements[0].selectedIndex = 1
endif

No.2912 2016/09/22(Thu) 11:45:05

Re: IF文について / リキュール
以下でエレメントの情報取得が行えますので参考になると思います。

http://canal22.org/advance/ie/ie-document-forms-elements-propertie/

No.2916 2016/09/22(Thu) 21:39:01

Re: IF文について / アオ
リキュールさん、ご回答ありがとうございます。

エレメントの情報が知りたいのではありません。
私の説明不足ですみません。

単純にクリックをしたいだけなのですが、

例えば、以下のスクリプトではラジオボタンとセレクトボックス
がランダムでもクリックしてくれますが、チェックボックスはクリックしてくれません。

if IESetData(IE,True,"q1","1")=true then
else
IE.document.forms[0].elements[0].selectedIndex = 1
endif

このスクリプトではすべてクリックしてくれると思うですが、エラーになります。

if IE.document.forms[0].elements[0].click()=true then
else
IE.document.forms[0].elements[0].selectedIndex = 1
endif

説明が下手ですみません。
あまりよくわかってないので、出来ましたら、教えてもらえないでしょうか。
宜しくお願い致します。

No.2922 2016/09/23(Fri) 11:47:59

Re: IF文について / stuncloud
> このスクリプトではすべてクリックしてくれると思うですが、エラーになります。
せめてどんなエラーが出たか書きましょうよ

> if IE.document.forms[0].elements[0].click()=true then
click()はなにも返さないのでこの場合必ずelseに行きます
つまり、対象がinputだったとしても
> IE.document.forms[0].elements[0].selectedIndex = 1
をやろうとするので、selectedIndexがないからエラーになってるというオチですかね

対象がなんだかちゃんと調べたほうが良いでしょう
ifだと面倒なのでselectにしましたが、こんなんでいいのでは

select IE.document.forms[0].elements[0].tagName
 case "input"
  select IE.document.forms[0].elements[0].type
   case "radio", "checkbox"
    IE.document.forms[0].elements[0].checked = TRUE
  selend
 case "select"
  IE.document.forms[0].elements[0].selectedIndex = 1
selend

このコードは与えられた情報から予想で書いてるので、アオさんの期待した動作をしない可能性があります

No.2923 2016/09/23(Fri) 14:02:20

Re: IF文について / アオ
stuncloudさん、ご回答ありがとうございます、

すみません。エラーはCOMエラーです。
stuncloudさんのご推察の通りだと思います。

ずっとIF文で拘っていてなかなかできなかったですが、
stuncloudさんのおかげでやっと出来ました。

本当にありがとうございました。

No.2924 2016/09/23(Fri) 15:56:27
エクセルデータを一括で読み込む方法 / まさ

お世話になっております。
15万行のエクセルを変数に読み込ませるにあたり以下のように書いています。
この書き方だとものすごく時間がかかるため、一気に配列変数に入れられないかと
考えています。
どなたかお知恵を拝借いたしたく、アドバイスを頂けると大変助かります。


EXCEL = CREATEOLEOBJ("EXCEL.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="AAA.csv", readOnly :=False) 
Sleep(5)

for i = 1 to 150000

BBB[i] = EXCEL.RANGE("B" + i).value
CCC[i] = EXCEL.RANGE("C" + i).value
DDD[i] = EXCEL.RANGE("D" + i).value

next

EXCEL.ActiveWindow.Close(True)
Excel.quit

No.2913 2016/09/22(Thu) 18:59:18

Re: エクセルデータを一括で読み込む方法 / リキュール
変数に読み込ませるだけならエクセルをオープンする必要は無いと思います。

fid= FOPEN("AAA.csv",F_READ)
dim BBB[150000]
dim CCC[150000]
dim DDD[150000]
for i = 1 to 150000
BBB[i] = FGET(fid,i,2)
CCC[i] = FGET(fid,i,3)
DDD[i] = FGET(fid,i,4)
next
FCLOSE(fid)

No.2914 2016/09/22(Thu) 20:54:25

Re: エクセルデータを一括で読み込む方法 / Nagatani
Pro版でしたら下記の手もあります!
EXCEL = CREATEOLEOBJ("EXCEL.Application")

//遊び半分非表示処理
EXCEL.visible = False
Excel.WorkBooks.Open(FileName :="Book1.csv", readOnly :=False) 
XLACTIVATE(Excel, "Sheet1")

//配列に取り込み(数秒?)
 dd = XLGETDATA(Excel, "A1:C150000")

//取り込んだ内容を確認
 FOR LonI1 = 1 TO 40
  PRINT LonI1 + " A= " + DD[LonI1,1] +" B= " + DD[LonI1,2] + "C= " + DD[LonI1,3]
 NEXT

EXCEL.ActiveWindow.Close(True)
Excel.quit


15万行は確認してません!

No.2915 2016/09/22(Thu) 21:26:50

Re: エクセルデータを一括で読み込む方法 / 俄プログラマー
データの行列を入れ替え出来るなら

fid = FOPEN("aaa.csv",F_READ)
BBB = SPLIT(FGET(fid,1),",")
CCC = SPLIT(FGET(fid,2),",")
DDD = SPLIT(FGET(fid,3),",")
FCLOSE(fid)

No.2917 2016/09/22(Thu) 22:03:01

Re: エクセルデータを一括で読み込む方法 / まさ
リキュール様、Nagatani様、俄プログラマー様

誠にありがとうございます!
どれも早くなりました。

配列には入ったのですが、その後、キーワードを探すところで結局for文でまわして
時間がかかってします。

AAA[]配列からキーワードの配列番号を早く取り出す方法はないでしょうか。

for i = 1 to 150000
ifb AAA[i] = "TEST" then
XXXXX
endif
next

No.2918 2016/09/22(Thu) 22:25:50

Re: エクセルデータを一括で読み込む方法 / 俄プログラマー
HASHTBLを調べてみてください。
No.2919 2016/09/22(Thu) 23:00:41

Re: エクセルデータを一括で読み込む方法 / 俄プログラマー
連想配列で片付けましたが
配列を使わず検索する方法です。
一旦変数にファイルのデータを全て入れ
POSで検索したいキーの位置を探しその行のデータのみに絞ります。
ただし複数ヒットする場合、列2、3以降にもキーにヒットする場合を考慮してませんので
改行やカンマなど利用して工夫してください。(重複ありなしデータ内容のヒントが無いので)
3列16万行のデータでかかった時間は読み出しから表示まで1秒未満でした。
検証データの内容は単純に
1,1,1
2,2,2



160000,160000,160000
で検証しました。
(先の回答の行列は入れ替えしなくて良いです。)


key = "TEST"

fid = FOPEN("aaa.csv",F_READ)
value = FGET(fid,F_ALLTEXT)
FCLOSE(fid)

検索位置 = POS(key,value)
if 0 < 検索位置 then
text = copy(value,検索位置)//キー位置以降をコピー
改行位置 = POS("<#CR>",text)//改行までのデータに絞る為
print copy(text,1,改行位置)
else
print "ヒット無し"
endif

No.2920 2016/09/23(Fri) 02:31:50

Re: エクセルデータを一括で読み込む方法 / まさ
俄プログラマー様

早速のご回答ありがとうございます!!
格段に速くなりました!

No.2921 2016/09/23(Fri) 03:04:08
全832件 [ ページ : << 1 ... 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 84 >> ]