UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

CLKITEM リストボックスの複数選択できない / あああ
初めまして。早速ですが質問させていただきます。

clkitem 関数において、リストボックスから複数選択をしたいと考えています。
ヘルプには
※ リストボックス: 複数選択の場合は タブにて アイテム名を繋げる
とありますので試してみましたが正常に処理されません。

選択したいアイテムを list_000 と list_001 とします。

clkitem(id, "list_000", CLK_LEFTCLK and CLK_LIST, True, 0)
-->list_000 が選択される。戻値 True

clkitem(id, "list_000 list_000", CLK_LEFTCLK and CLK_LIST, True, 0)
-->タブでつなぐ。選択されない。戻値 False

clkitem(id, "list_000" "list_000", CLK_LEFTCLK and CLK_LIST, True, 0)
-->実行不可:式がおかしい or 型が合ってない

以上のような状況です。どなたか意見をお持ちの方、よろしくお願いします。

uwsc 5.2.3
windows 7 64bit
制御対象ウィンドウ:64bitアプリケーション

No.3064 2016/10/26(Wed) 15:09:12

Re: CLKITEM リストボックスの複数選択できない / stuncloud
"list_000<#TAB>list_001"
ではどうですか

No.3065 2016/10/26(Wed) 16:15:59

Re: CLKITEM リストボックスの複数選択できない / stuncloud
あと、追加オプションを繋げるときは and じゃなくて or です
ちなみに CLK_LEFTCLK and CLK_LIST だと 0 になるので EMPTY 指定と同じになります(多分)
ついでに CLK_LEFTCLK or CLK_LIST だとうまくいかないようなので CLK_LIST だけにしましょう

No.3066 2016/10/26(Wed) 16:31:54

Re: CLKITEM リストボックスの複数選択できない / あああ
stuncloud 様

ご返信ありがとうございます!

種別指定が意図したものと全然違っていたのですね。
ただ、種別を CLK_LIST のみにし、
clkitem(id, "list_000", CLK_LIST)
としたところ list_000 の選択もできなくなることがわかりました。

そこで
clkitem(id, "list_000", CLK_LISTVIEW)
にすると指定が可能でしたので、私がリストボックスだと思っていたものが実はリストビューだった、ということなのでしょうか。

getitem(id, ITM_LIST, 2, 0, FALSE)
で当該リストを取得できていたので種別 CLK_LIST での clkitem ができるものと思い込んでいたのですが...

No.3070 2016/10/26(Wed) 22:00:25

Re: CLKITEM リストボックスの複数選択できない / stuncloud
> clkitem(id, "list_000", CLK_LISTVIEW)
> にすると指定が可能でしたので、私がリストボックスだと思っていたものが実はリストビューだった、ということなのでしょうか。

そうなのかもしれませんね
現物がないとこちらでは試せませんので、色々試行錯誤していただくしかないと思います
TAB区切りがだめそうなら kbd(VK_CTRL, DOWN) した状態でひとつひとつクリックしていくとか? (Ctrl+クリックの再現

> getitem(id, ITM_LIST, 2, 0, FALSE)
> で当該リストを取得できていたので種別 CLK_LIST での clkitem ができるものと思い込んでいたのですが...

この点は不思議ですね…?

ちなみにこちらでは slctbox(SLCT_LST, (略)) で出て来るリストボックスに対してTAB区切りがうまくいくことを確認しました

No.3074 2016/10/27(Thu) 13:52:53

Re: CLKITEM リストボックスの複数選択できない(解決) / あああ
stuncloud 様

検証ありがとうございます。
こちらでも slctbox によるリストと html によるリストで検証してみたところ複数選択ができました。
どうやら制御対象の問題だったようです、お騒がせいたしました。
拙いもので恥ずかしいですが、一応以下に検証時のコードを載せておきます。

listMultipleSelect.uws

// リストボックスのあるウィンドウにマウスオーバーすると、要素 000 と 001 が選択される
// Esc キーでスクリプト終了
thread checkMultipleSelect()
sleep(1)
slctbox(SLCT_LST, -1, "msg", "000", "001", "002")

procedure checkMultipleSelect()
i = 0
while !(GETKEYSTATE(VK_ESC))
id = getid(GET_FROMPOINT_WIN)
print "second: " + i + " :" + id
print clkitem(id, "000 001", CLK_LIST)
// print clkitem(id, "000<#TAB>001", CLK_LIST) でもよい
sleep(1)
i = i + 1
wend
fend


list.html

<FORM>
<select name="example" size=6 multiple>
<option value="000">000</option>
<option value="001">001</option>
<option value="002">002</option>
<option value="003">003</option>
<option value="004">004</option>
<option value="005">005</option>
</select>
</FORM>

list.html で作ったリストの選択は firefox,IE ではうまくいきましたが google chrome ではダメでした。
もうよくわかりませんね、別の方法を探すことにします。

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

No.3075 2016/10/27(Thu) 15:39:48
式の中で「 \ 」で、ディレクトリ下を参照させたい / きよ
いつも勉強させて頂いております。
・・・・\temp\abc.bmp を変数で指定したいのですが、\を入れると以降が文字列になってしまいます。
実際はimgは、INIかCSVから読み込みたいので、xxxx.UWSの中で「temp\abc.bmp」を作り出したいと思います。

img = "abc.bmp"
file = "temp\" + img ←\を入れた途端にそれ以降が文字列になってしまいます

xxxx.UWSの中で、 temp\abc.bmp ← これを作り出したいと思っています。

IFB "temp\" + img THEN でも
IFB CHKIMG("temp\" + img ) でも、「\」を入れると以降文字列になってしまいます。

「\」を式の中に入れるにはどのようにしたら良いのでしょうか?
宜しくお願い致します。

No.3057 2016/10/24(Mon) 22:09:24

Re: 式の中で「 \ 」で、ディレクトリ下を参照させたい / しろまさ
"abc.bmp" ← 文字列
img    ← 文字列を代入した変数
"temp\"  ← 文字列
"temp\" + img ← 文字列の結合
file    ← 結合した文字列を代入した変数

最初から文字列ですよ?

> IFB "temp\" + img THEN でも

この書き方は間違い。何をしたいのか解りません。
Ifは 0がFALSE それ以外がTRUEを取るのでTRUEになってるだけ。

> IFB CHKIMG("temp\" + img ) でも、「\」を入れると以降文字列になってしまいます。

画像名かパスを入れる欄なので文字列が入ってで正しいです。

>「\」を式の中に入れるにはどのようにしたら良いのでしょうか?

文字列として結合すれば良いだけですが、いまひとつ何を求めているのかが解りません。

No.3058 2016/10/25(Tue) 08:45:53

Re: 式の中で「 \ 」で、ディレクトリ下を参照させたい / しろまさ
上記記事編集パスワード間違えたので追記で修正書込み。

> IFB "temp\" + img THEN
こちらの環境だと SyntaxErrorになりますねこれ。

ファイルの存在確認をしたいのなら以下です。
  IFB FOpen("temp\" + img, F_EXISTS) THEN

No.3059 2016/10/25(Tue) 08:51:26

Re: 式の中で「 \ 」で、ディレクトリ下を参照させたい / しゅん
これ、単にエディタの表示がそうなっているだけ、というオチではないですよね、、、。
万一そうなら、気にしなければ良いだけですが、、、まさかね。

↓「バグなのでしょうか?」
バグではありません。私のような人間には大切な機能です。
ただ、UWSCのスクリプトを書くには適さないモードだっただけです。

No.3060 2016/10/25(Tue) 09:11:27

Re: 式の中で「 \ 」で、ディレクトリ下を参照させたい / きよ
しゅん様
しろまさ様

有り難うございます。
しゅん様の・・・「まさか」で、UDebug.exeで試したら、その「まさか」でした。
おそまつな「オチ」に引っかかっていました。
サクラエディタを信用しすぎていました...バグなのでしょうか?

どうもすみません、有り難うございました。

No.3061 2016/10/25(Tue) 10:25:56

Re: 式の中で「 \ 」で、ディレクトリ下を参照させたい / しろまさ
ぐはっ そこでしたか。。

サクラエディタ

設定 ⇒ タイプ別設定

エスケープ の
C言語風 から PL/SQL風 に変えると治りますよ。

昔書いたtips
http://siromasa.html.xdomain.jp/uwsc/u_term/31_SakuraEdita.html

No.3062 2016/10/25(Tue) 12:03:59

Re: 式の中で「 \ 」で、ディレクトリ下を参照させたい / きよ
しろまさ様

有り難うございます。
早速PL/SQL風にしましたら、なおりました。
サポートセンターみたいなレス有り難うございます。

No.3063 2016/10/25(Tue) 17:13:42
SETHOTKEYを利用した複数のプログラム / mogutan
いつもお世話になっております。"SETHOTKEY"を利用し"ESC"キーを押すと終了処理を行うプログラムをEXE化し、複数起動した場合2個目以降のプログラムでは思うように終了してくれません。これは仕様又は使い方の間違いでしょうか?宜しくお願い致します。
(Windows10Pro x64 UWSC Pro V5.2.2以降)
例↓

SETHOTKEY(VK_ESC,,"終了処理")

WHILE TRUE
  // ----- 処理1
WEND

PROCEDURE 終了処理()
 // ----- その他の処理
EXITEXIT
FEND

No.3046 2016/10/16(Sun) 10:44:12

Re: SETHOTKEYを利用した複数のプログラム / miles
SETHOTKEYの戻値を見てください。
1個目は成功、2個目以降は失敗していると思います。
多分、同じキーコードの重複設定はできないのでしょう。

No.3047 2016/10/16(Sun) 17:12:23

Re: SETHOTKEYを利用した複数のプログラム / mogutan
おっしゃる通り1つ目は"True"、2つ目以降は"False"が返って来ます。誰かがUWSCで組んだプログラムがたまたま動作していて、知らないで偶然にも同じキーを使用したプログラムを実行した場合はうまく動かない事が有るが、それは仕様なので仕方が無いと言う事なのですね。ご教示ありがとう御座いました。
No.3056 2016/10/19(Wed) 08:55:06
CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
CLASSENDCLASSでPROCEDUREした関数が呼び出しがうまくいきません。[tesuto.UWS]を起動すると下記のようなエラーが表示されます。[tesuto.UWS]のCOMMONPROC.data(tmp)を入力したりもしたのですがうまくいきません。何が間違っているのでしょうか?

[エラーコード]
COMMONPROC.data引数の数が合いません
4行目:COMMONPROC.data()


[共通化.UWS]
CLASS COMMONPROC

PROCEDURE data(tmp)
Excel = XLOPEN("C:\Users\aruke\Dropbox\abc.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
tmp=SLCTBOX(SLCT_BTN OR SLCT_STR,0,"会社一覧",tes)
fend

ENDCLASS


[tesuto.UWS]
// 共通クラスの呼び出し
CALL 共通化.UWS

COMMONPROC.data()

No.3049 2016/10/18(Tue) 09:06:21

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / しろまさ
tmp を参照引数にしたいなら
PROCEDURE data(var tmp)

実行側も変数を渡す必要あり。
Dim vTmp
COMMONPROC.data(vTmp)
msgbox(vTmp)

でもFunctionにして結果を受け取ったほうが楽な気がしますが。

ちなみにエラーは引数指定してるのに引数を与えないから出ています。
省略可能にしたい場合はこんな感じで。
PROCEDURE data(tmp = "")

Help(uwsc.chm)を読みましょう。

No.3050 2016/10/18(Tue) 09:30:16

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
しろまさ様、回答ありがとうございます。
PROCEDUREは、教えて頂いた通りにした所、期待通りの結果が得られました。
PROCEDUREとFUNCTIONの違いについて検索やHelp(uwsc.chm)で調べてはみたのですが、手続き型と関数の違いという事やresultが返すかどうかという事はわかりました。実際に自分でコードを書いてみてもいまいちPROCEDUREとFUNCTIONの違いが自分の中で使い分けができません。

>でもFunctionにして結果を受け取ったほうが楽な気がしますが。
楽になるとは、tesuto.UWSのコードのdimの宣言が必要なくなるという事でしょうか?
Functionにして結果を受け取るとは、下記のようなコードにするという事でしょうか?
質問ばかりで申し訳ございません。

Function data(var tmp)
Excel = XLOPEN("C:\Users\aruke\Dropbox\2-キーワードエクセル\エージェント会社\経理エージェント会社一覧.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
tmp=SLCTBOX(SLCT_BTN OR SLCT_STR,0,"エージェント会社",tes)
result =tmp
fend

No.3051 2016/10/18(Tue) 11:23:04

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / しろまさ
// 関数側
Function data()
Excel = XLOPEN("C:\Users\aruke\Dropbox\2-キーワードエクセル\エージェント会社\経理エージェント会社一覧.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
result =SLCTBOX(SLCT_BTN OR SLCT_STR,0,"エージェント会社",tes)
fend

// 実行側
Dim res = COMMONPROC.data()

戻りが2つ以上のときに参照引数を使うようにしてます。
例えばresultはboolを返して戻りは参照として
Ifb COMMONPROC.data(vTmp)
 ・・・
などを多用してます。見やすくコードを減らしたいので^^

No.3052 2016/10/18(Tue) 11:32:23

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / しろまさ
// resultを使った(適当な)例

dt1 = "平成28年9月29日"
dt2 = "2016/55/44"
msgbox( "例えばこのfmt関数は(" + dt1 + ")を変換すると(" + fmt(dt1) + ")が取り出せますが、<#CR>" _
+ "有り得ない日付(" + dt2 + ")を指定するとエラーが返るので、元の日付(" + fmt(dt2) + ")を返しています。")

Function fmt(dt, fm = "yyyy/MM/dd")
  Result = PowerShell("return [Datetime]::Parse(<#DBL>" + dt + "<#DBL>).ToString(<#DBL>" + fm + "<#DBL>)")
  If Pos("例外が発生", Result) > 0 Then Result = dt Else Result = Trim(Result)
FEnd

// Powershell関数が遅い場合はこちらを読んでね。
// http://siromasa.html.xdomain.jp/uwsc/u_term/PowerShell.html

No.3053 2016/10/18(Tue) 12:35:22

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
しろまさ様、何度も返信ありがとうございます。Functionのresultを使ってそのような事ができたんですね。まったく知りませんでした。教えて頂いたコードで無事できました。


>戻りが2つ以上のときに参照引数を使うようにしてます。
例えばresultはboolを返して戻りは参照として
Ifb COMMONPROC.data(vTmp)

上記の意味が今の自分のレベルでは分かりません。戻りが2つ以上のときに参照引数を使うとは、下記のコードだとExcelとtesとresultという認識で宜しいのでしょうか?

// 関数側
Function data()
Excel = XLOPEN("C:\Users\aruke\Dropbox\2-キーワードエクセル\エージェント会社\経理エージェント会社一覧.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
result =SLCTBOX(SLCT_BTN OR SLCT_STR,0,"エージェント会社",tes)
fend

>例えばresultはboolを返して戻りは参照として
boolの意味が分からなかったので調べたのですが、bool型は論理型とも呼ばれ、そのとり得る値としてtrueとfalseしかないと検索で分かりました。

No.3054 2016/10/18(Tue) 12:47:59

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
しろまさ様、下記のコード起動させて頂きました。今の自分では理解が完全にはできていないですが、じっくりコードを読ませて頂き勉強させて頂きます。Functionを使った引数の条件分岐を操れるようになるとUWSCでできる事が拡がりそうで楽しみです。ありがとうございました。

// resultを使った(適当な)例

dt1 = "平成28年9月29日"
dt2 = "2016/55/44"
msgbox( "例えばこのfmt関数は(" + dt1 + ")を変換すると(" + fmt(dt1) + ")が取り出せますが、<#CR>" _
+ "有り得ない日付(" + dt2 + ")を指定するとエラーが返るので、元の日付(" + fmt(dt2) + ")を返しています。")

Function fmt(dt, fm = "yyyy/MM/dd")
  Result = PowerShell("return [Datetime]::Parse(<#DBL>" + dt + "<#DBL>).ToString(<#DBL>" + fm + "<#DBL>)")
  If Pos("例外が発生", Result) > 0 Then Result = dt Else Result = Trim(Result)
FEnd

No.3055 2016/10/18(Tue) 13:02:17
UWSC Ver5.2.3 / umiumi
SENDSTR関数にて 一部パターンが設定できなかったのを修正
DEF_DLLの LongLong型にて 32bit以上の値が扱えなかったのを修正
CLICKITEM関数にて 一部のアプリにて指定アイテムが無い時に時間がかかるのを修正
CLICKITEM関数にて API/UIAインターフェースのみを指定する CLK_API/CLK_UIAを付けた
IE関数としてフレームを返す IEGETFRAME関数を付けた
CREATEOLEOBJ, CREATEOLEOBJ関数にて "MSEdge.Application" の指定を廃止にした
INPUT, MSGBOX, SLCTBOXにて 位置指定に -1を指定すると前回位置に表示するようにした
メイン画面の 閉じるボタンにて 終了動作だったのを タスクトレイ格納に変更した

No.3045 2016/10/16(Sun) 03:39:31

Re: UWSC Ver5.2.3 / stuncloud
> INPUT, MSGBOX, SLCTBOXにて 位置指定に -1を指定すると前回位置に表示するようにした
これはうれしい

No.3048 2016/10/17(Mon) 10:22:29
ファイル存在チェック / オカナガ
ファイル存在チェックで質問です。
Ver4.9cではFOPEN( ファイル名,F_EXISTS)でファイルの種類(*.txt)などをフォルダ名に付加し、ファイルの種類を限定した形で可能でしたが、Ver5.2.2ではできません。
仕様が変更されたのでしょうか。

No.3041 2016/10/14(Fri) 11:10:11

Re: ファイル存在チェック / しろまさ
> FOPEN Nagatani
> ・・・
> DATE:2014/5/23(Fri) 15:12 No.5391
>
> RE:FOPEN umiumi
> FOPEN関数にてワイルドカードは使えなくなりました。
> 代わりに GETDIR関数を利用してください。
> ifb GETDIR("C:\データ", "*.TXT")>0 then
> DATE:2014/5/24(Sat) 00:10


過去ログ検索でやっと見つけた。。

No.3042 2016/10/14(Fri) 16:42:51

Re: ファイル存在チェック / オカナガ
しろまき様ありがとうございます。
了解です。
過去ログ検索利用します。

No.3043 2016/10/14(Fri) 18:05:26
SLCT BOXのスクロールについて / みつ
SLCTBOXのSLCT_BTNを30個くらい作っていますが、22個くらいしか画面に表示しきれずに
スクロールバーが右側に出ていますが、マウスのスクロールを回しても反応しません。

毎回下にある項目をクリックする時に、スクロールバーをクリックしドラッグしながら
下にスクロールしなければいけないのですが、
マウスのスクロールボタンでスクロールさせることは可能でしょうか。

また、他に良い方法があればご教授お願いいたします。
よろしくお願いいたします。

No.3016 2016/10/09(Sun) 12:24:12

Re: SLCT BOXのスクロールについて / 俄プログラマー
ポップアップメニューに変えて整理してみては?
SLCTBOXの使用例にも載っています。

他にもF1〜F12で使っていないキーに割り当ててしまう
INPUTを使って数字入力で処理分けするなど方法は他にもあるかと思いますよ。

No.3017 2016/10/09(Sun) 12:29:26

Re: SLCT BOXのスクロールについて / みつ
俄プログラマー様

ご連絡ありがとうございます。
今回は、字を小さくすることで対応しました。

OPTION DEFAULTFONT = "MS ゴシック, 8.0"

No.3040 2016/10/14(Fri) 09:48:48
Windowsに作業中と認識させたい / ろじゃ
Windows10で更新プログラム適用後に自動で再起動するのを抑止する方法を考えています。
(proでしたらgpedit.mscで設定できるようですが、homeは使えないようで困っています)

現在の最新バージョンでは、アクティブ時間を指定すれば、その時間帯の再起動は防げるようですが
アクティブ時間外の場合は、PCを操作していなければ自動で再起動されてしまいます。
(その際、作業中のファイルなどは保存されません)

そこでUWSCのスクリプトで、席を外すときにMMVをループさせて、マウスを動かしている状態を維持するスクリプトを作ったのですが
うまくいかずに再起動されてしまいました。

Windowsに作業中と認識させることができる命令って何を使えばできるでしょうか?
ご存知でしたら教えてください。
よろしくお願いします。

No.3027 2016/10/13(Thu) 10:30:46

Re: Windowsに作業中と認識させたい / しろまさ
gpedit.msc、インストールできるみたいですよ(私は使ったことはありません)
http://www.billionwallet.com/goods/windows10/windows10_gpedit.html

No.3030 2016/10/13(Thu) 15:06:37

Re: Windowsに作業中と認識させたい / ろじゃ
情報ありがとうございます!
結構裏技っぽい感じですね。
やってみます。

UWSCで作るのはちょっと無理っぽいですかね?

No.3031 2016/10/13(Thu) 16:46:15

Re: Windowsに作業中と認識させたい / しろまさ
> UWSCで作るのはちょっと無理っぽいですかね?

作ろうと思ったこともないし、作りたいとも思いません。
Updateが終わったら早めに再起動しますし、
席を離れるなら制御などせずに、再起動したほうがPC為にも良いのでは?

主観ですのでお気になさらずに。
それと、Update時間はスケジュール出来るのはご存知ですよね?

No.3039 2016/10/14(Fri) 09:13:11
CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
EXCEL1 = CREATEOLEOBJ("Excel.Application")を開いていたらGETACTIVEOLEOBJで処理、そうでない場合はCREATEOLEOBJで処理というコードを書きたいのですが、条件式の書き方が分かりません。どういう風に書けば良いでしょうか?
下記がコードです。


if 条件式 then
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - Book2.xls [互換モード]")
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
else
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

endif

No.3021 2016/10/11(Tue) 11:10:08

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")
ifb id=1 then
上記を加えて試しても、サイト上でスクリプト起動するとエクセルファイルが2つ開いて、1つ目はデータの出力はされますが、なぜか2つ目のエクセルファイルも開いてしまいます。
エクセルファイルを開いている状態でスクリプト起動してもGETACTIVEOLEOBJでやっているのに、既存のエクセルに出力せず、path1のエクセルが新ウィンドウとして開いてしまいます。
既存エクセルとして判定してデータ出力する方法ないでしょうか?

cnt=1
path1="C:\Users\aruke\Desktop\Book2.xls"
id=GETID(GET_ACTIVE_WIN)
変数=STATUS( id,ST_TITLE)
IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application",変数)
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
//XLACTIVATE( Excel1, "Sheet2")

WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")


ifb id=1 then
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - Book2.xls [互換モード]")
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
else
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

No.3022 2016/10/11(Tue) 11:53:12

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / しろまさ
Try
  XL = GetActiveOleObj("Excel.Application")
Except
  XL = CreateOleObj("Excel.Application")
EndTry

GetでエラーしたらCreate。

No.3024 2016/10/11(Tue) 12:52:09

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / しろまさ
id=GETID(GET_ACTIVE_WIN)
してるから、

id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")
では id=2 になってるのでは?(uwsc id は使った回数の連番)

評価式は ifb id>0 が妥当かと。(これも変数を確認すれば済む話)

No.3025 2016/10/11(Tue) 13:10:25

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
しろまさ様、いつもありがとうございます。
下記のコードの意味が分かりません。ググってしてみると、実行時エラーが起きた時に実行されるとありますが、どうつかうのかがいまいち分かりません。

Try
  XL = GetActiveOleObj("Excel.Application")
Except
  XL = CreateOleObj("Excel.Application")
EndTry

GetでエラーしたらCreate。

No.3034 2016/10/13(Thu) 22:40:09

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
しろまさ様、id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")
では id=2 にたしかになってました。
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application",ida)のidaの変数にするとうまくいきましたが、これを直接タイトル入力だとなぜかうまくいきませんでした、このような感じです。EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - Book2.xls [互換モード]")


cnt=1
path1="C:\Users\aruke\Desktop\Book2.xls"
id=GETID(GET_ACTIVE_WIN)
変数=STATUS( id,ST_TITLE)
IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application",変数)

ida=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")


ifb ida>0 then
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application",ida)
WHILE IEGETDATA(IE1,"TAG=p",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=p",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
else


EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
WHILE IEGETDATA(IE1,"TAG=p",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=p",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

endif

No.3035 2016/10/13(Thu) 22:46:39

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / 俄プログラマー
>どうつかうのかがいまいち分かりません。

ヘルプファイルは見ない方ですか?
解りやすい例がありますよ。

No.3036 2016/10/14(Fri) 00:14:50

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / しろまさ
>どうつかうのかがいまいち分かりません。

使ってみれば解りますよ。

ポイントは、オブジェクトが存在しないときに Get を使うとエラーを起こすということです。
その挙動を利用して条件判断をすれば良いわけで・・後は自分で考えましょう!

No.3038 2016/10/14(Fri) 09:01:28
連続してサイトを2つ開いてスクレイピングについて / シスイ
下記のコードでやってみると1つ目のサイトのIEGETDATAの変数
data1とdata2は取得できますが、2つ目に開いたサイトのdata1とdata2は取得できません。
GETACTIVEOLEOBJでつかめていないからでしょうか?

path="C:\Users\aruke\Desktop\Book1.xls" //データ読込用
path1="C:\Users\aruke\Desktop\Book2.xls" //データ出力用
Y = 1
cnt = 1

//エクセルのファイルを開く
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :=path)
XLACTIVATE( Excel, "Sheet1")

SLEEP(2.0)
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)


for i = 1 to 3

tek = "B"+i
Excel.Range(tek).select
URL = EXCEL.selection.value


XLACTIVATE( EXCEL1, "Sheet"+Y)
Y=Y+1
//インターネットエクスプローラーを開く
Dim IE = CreateOleObj("InternetExplorer.Application");
IE.visible = TRUE;
IE.Navigate(URL);
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
WHILE IEGETDATA(IE,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA( IE,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA( IE,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

next

xlclose(EXCEL)

No.3018 2016/10/11(Tue) 04:56:28

Re: 連続してサイトを2つ開いてスクレイピングについて / しろまさ
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
この行、不要じゃないですか?

どうしても必要なら、第二引数でIEのタイトル指定するとか、
先にCreateしたIEは IE.Quit で消すとか。

Createを繰り返す場合はメモリ面からも先のIEを消したほうがよろしいかと。

No.3019 2016/10/11(Tue) 08:54:44

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
しろまさ様、IE.Quitでやってみましたがエクセルに出力が2つ目開いたサイトができません。
配列に入れて他の方法でやってみましたが下記のコードでもできないです。

path="C:\Users\aruke\Desktop\Book1.xls"
path1="C:\Users\aruke\Desktop\Book2.xls"
cnt = 1

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :=path)
XLACTIVATE( Excel, "Sheet1")
dat = XLGETDATA( Excel, "b1:b10")

//インターネットエクスプローラーを開く


Dim IE = CreateOleObj("InternetExplorer.Application");
IE.visible = TRUE;
IE.Navigate(dat[1,1]);
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
変数 = IE.LocationName
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
XLACTIVATE( Excel1, "Sheet1")
WHILE IEGETDATA(IE,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA( IE,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA( IE,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
IE.Quit

Dim IE1 = CreateOleObj("InternetExplorer.Application");
IE1.visible = TRUE;
IE1.Navigate(dat[2,1]);
REPEAT
SLEEP(0.1)
UNTIL !IE1.busy AND IE1.readystate = 4

XLACTIVATE( Excel1, "Sheet2")

WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA( IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA( IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

No.3020 2016/10/11(Tue) 09:52:59

Re: 連続してサイトを2つ開いてスクレイピングについて / しろまさ
こうあるはずだから・・というような思い込みは捨て、取得した全ての変数を msgbox などで確認して下さい。
どこで取得できていないかが解れば、なぜ取得できないかを調べることが出来ます。
オブジェクトが取れていない、タグが違う、URLが違う、Sheetが違う、等々。

URL不明のためこちらで検証は出来ません。もっと自分でがんばって下さい。

No.3023 2016/10/11(Tue) 12:44:28

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
しろまさ様
何度も返信頂きありがとうございます。MSGBOXで調べてみたのですが、forで2回目を繰り返す際のdata1=IEGETDATA( IE,"TAG=p",cnt)が取得できていないというのが判明しました。data1=IEGETDATA( IE,"TAG=h2",cnt)でするとシート2にも2つ目に開いたサイトのh2のデータが出力されますがこれを"TAG=p"ですると出力するデータが多いのかシート1には1つ目に開いたサイトは出力されるのですが、2つ目に開いたサイトのデータはシートには出力されません。
SLEEPを入れてみたりと試したのですが、うまくいきません。なにか良い方法ご教授願いませんでしょうか?

開いているサイトが下記になります。
[1つ目サイト]
http://keiri-note.com/%E7%B5%8C%E7%90%86%E3%81%AE%E8%BB%A2%E8%81%B7%E3%81%AB%E5%BC%B7%E3%81%84%E8%BB%A2%E8%81%B7%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88

[2つ目サイト]
http://career.jusnet.co.jp/support/

下記がコードになります。

// h2だとデータが少ないのでシート1、2で取得できたがpタグのデータが多い場合はシート1しか取得できずシート2はデータ出力なし。

path="C:\Users\aruke\Desktop\Book1.xls"
path1="C:\Users\aruke\Desktop\Book2.xls"
Y = 1
cnt = 1

//Excelデータ取得用
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :=path)
XLACTIVATE( Excel, "Sheet1")

SLEEP(2.0)
//Excelデータ出力用
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
hazime=input("始め")
owari=input("終わり")

for i = hazime to owari
tek = "B"+i
Excel.Range(tek).select
URL = EXCEL.selection.value
XLACTIVATE( EXCEL1, "Sheet"+Y)
Y=Y+1
//インターネットエクスプローラーを開く
Dim IE = CreateOleObj("InternetExplorer.Application");
IE.visible = TRUE;
IE.Navigate(URL);
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
//IE = GETACTIVEOLEOBJ("InternetExplorer.Application")

WHILE IEGETDATA(IE,"TAG=p",cnt ) <> EMPTY
data1=IEGETDATA( IE,"TAG=p",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
cnt = cnt + 1
WEND

IE.quit
SLEEP(5.1)
next

xlclose(EXCEL)

No.3026 2016/10/12(Wed) 21:44:05

Re: 連続してサイトを2つ開いてスクレイピングについて / miles
> 2つ目に開いたサイトのデータはシートには出力されません。
cntの初期設定が抜けてますよ!

No.3028 2016/10/13(Thu) 10:38:15

Re: 連続してサイトを2つ開いてスクレイピングについて / しろまさ
シスイさん、milesさんの指摘は理解できましたか?

1つ目のサイトでは1〜45行目のタグPが取得できました。
2つ目のサイトでは46〜取得しようとしてるのでデータが無いわけです。

XLの46行目から続けたいのか、B列に移りたいのかは解りませんが、
cntの扱いに一手間必要ですね。

No.3029 2016/10/13(Thu) 12:53:23

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
miles様、ありがとうございます。2日間ずっと悩んでいて、気付かなかった自分の実力のなさを痛感しています。cntの初期設定だったんですね。
No.3032 2016/10/13(Thu) 20:52:00

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
しろまさ様、最後までおつきあい頂き、ありがとうございました。
cntの初期設定をWENDの後に設定でうまくできました。
色々教えて頂き感謝致します。

No.3033 2016/10/13(Thu) 20:54:32

Re: 連続してサイトを2つ開いてスクレイピングについて / 俄プログラマー
>cntの初期設定をWENDの後に設定でうまくできました。

動けばいいのであればその場所でも良いですが
なぜ初期設定が必要か?いつ初期設定が必要か?を考えてみましょう。

ヒント:最後のループ時の終了間際に初期設定の意味はありますか?

No.3037 2016/10/14(Fri) 00:19:46


 過去ログ(〜2016/10/02)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> | 過去ログ ]