[ 掲示板に戻る ]

過去ログ閲覧モード

変数を用いてダウンロード、保存するファイル名の記述方法 / VBA-IE
UWSCのホームページのサンプル#58の”IEにてファイルをダウンロード処理”を使い記述していますが、5行目のダウンロードして保存するファイル名(abc.zip)を変数を用いた記述に変更したいのですが、記述方法が分かりません。
具体的には、このファイル名はUWSCを呼び出すVBA上で変数宣言(DLfile)して使用しており、それをそのままUWSCへ引き渡し、変数として記述したいのですが、記述方法など教えてください。

5行目をsetNameFileDlg(DLfile, ".CSV") と記述したら、変数DLFILEが指定されていませんとエラーになります。

// IE にてファイルのダウンロード処理  #N58
// IE(IE9以上) にてダウンロードのページが開いている事(http://www.uwsc.info/download.html)
ieid = GETID("Internet Explorer", "IEFrame")
ClkItem(ieid, "UWSC Free版", CLK_LINK or CLK_SHORT) // Free版のUWSCをクリック
sleep(1) // 間が必要
ClkItem(ieid, "\保存\名前を付けて保存", CLK_BTN) // '保存'スプリットボタンの '名前を付けて保存'をクリック
setNameFileDlg("abc", ".zip") // ファイル名 abc.zip にてダウンロード
closeDlg(ieid) // ダウンロード終了確認

// '名前を付けて保存'ダイアログに名前を設定し保存(fname:保存ファイル名、extens:拡張子)
Function setNameFileDlg(fname, extens)
Result = False
id = GETID("名前を付けて保存", "#32770", 5)
if id < then Exit
Sleep(1)
pp = -1
for n = 1 to 3 // 検索項目が付加される事がある為Edit順番を確認
ifb Pos(extens, GetStr(id, n))>0
pp = n
break
endif
next
if pp < 0 then Exit
SendStr(id, fname + extens, pp, True)
Result = ClkItem(id, "保存", CLK_BTN or CLK_MUSMOVE)
Fend
// ダウンロード終了確認、フォルダーを開く
Procedure closeDlg(ieid)
while True
Sleep(1)
n = GETITEM(ieid, ITM_ACCTXT)
if Pos("ダウンロードが完了", ALL_ITEM_LIST[n-1])>0
CLKITEM(ieid, "フォルダーを開く", CLK_BTN)
Exit
endif
Wend
Fend

No.4239 2017/07/18(Tue) 11:21:41

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / satocha
UWSCはVBAから呼ばれただけで、VBAのことは何も知りません。VBA上の変数をUWSCスクリプトに直接記述しても、未定義エラーになるだけです。

そこで、VBAからUWSCを呼び出すとき、VBAの変数をパラメータとして与えることになります。

UWSC側でパラメータを受け取る方法については、ヘルプのPARAM_STRの項に説明があります。

<起動時パラメーター>
 // スクリプトにパラメーターを付けて起動した場合、その値は配列変数 PARAM_STR[ ] に入る
 PARAM_STR[ ]   // 配列はゼロから

※VBAから別プログラム(今回の場合はUWSC)をパラメータ付きで呼び出す方法は、UWSCの質問ではありませんので、VBAの掲示板等で聞いてください。

No.4241 2017/07/19(Wed) 03:06:28

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / VBA-IE
satochaさんのご指摘通り、以下を実施してみましたが、うまくいきません。
@VBAからUWSCを呼び出す際にVBAの変数(DLfile)をパラメータとして記述
具体的には、Shell "C:\UWSC\uwsc5302\UWSC.exe DL1.UWS(フルパス指定のUWSスクリプトファイル) DLfile"
AUWSスクリプトファイルでDLfileをPARAM_STR[0]に変更
具体的には、setNameFileDlg(PARAM_STR[0], ".csv")
実行したところ、変数の中身が伝わっていかず、DLfile.csvの名前でダウンロードされました。
本来、変数DLfileは、中身はDL_170721の様な日付情報が入っており、DL_170721.csvの名前でダウンロードしたいのですが。
VBAからUWSCにはパラメータが伝わっているようなので、どこか記述方法が違っているのではないかと思うのですが、教えていただきたく、お願いします。

No.4252 2017/07/21(Fri) 15:04:51

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / koi
Shell "C:\UWSC\uwsc5302\UWSC.exe DL1.UWS(フルパス指定のUWSスクリプトファイル) DLfile"
↑ の書き方では DLfile という変数の中身渡してるんじゃなくて
DLfile という文字列をスクリプト(UWSC)に渡してますのでそこを修正してください

UWSCの問題じゃないので自分で解決できないなら
satocha さんも書かれてるようにVBA掲示板にでも質問してください

私はVBA知らないので回答もできませんが見てる限り
4238 で回答されてることと同じ過ちを繰り返してるだけの気がします
※ スペース入れろとか言った話じゃなくて書き方もその中に回答されてると思います

No.4253 2017/07/21(Fri) 15:22:33

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / satocha
いやホントすごいなあ
こう書いてください、と書こうと思ったけど
koiさんのおっしゃる通り、4238に答えが書いてあった
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=4238

No.4255 2017/07/21(Fri) 21:09:46

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / VBA-IE
Koiさん、satochaさんの指摘通り、4238のところを再度読み直し試してみたところ、うまくいきました。
アドバイス、ありがとうございました。

No.4265 2017/07/25(Tue) 10:48:02
セレクトボックスとキーボードの連動 / 谷
セレクトボックスが出現している状態で、
キーボード押下で実行されるように出来ないでしょうか?

例) 
1キーを押下すると1番目の命令、2キーを押下すると2番目の命令…と
いったように実行される

No.4258 2017/07/22(Sat) 14:24:38

Re: セレクトボックスとキーボードの連動 / 谷
実際に自分で書いたものは下記です。

--------------------

A = 1
REPEAT

SELECT SLCTBOX(SLCT_BTN, 0, 1000,600, "操作","左上","右上","左下","右下","終了")
CASE -1
CASE SLCT_1 // 左上
BTN(LEFT,CLICK,700,500)
CASE SLCT_2 // 右上
BTN(LEFT,CLICK,1200,500)
CASE SLCT_3 // 左下
BTN(LEFT,CLICK,700,700)
CASE SLCT_4 // 右下
BTN(LEFT,CLICK,1200,700)
CASE SLCT_5 // 終了
EXITEXIT
SELEND

UNTIL A>2

No.4259 2017/07/22(Sat) 14:38:44

Re: セレクトボックスとキーボードの連動 / yanyan
順番ではないですが、アクセスキー設定が可能です。
SELECT SLCTBOX(SLCT_BTN, 0, 1000,600, "操作","左上(&1)","右上(&2)","左下(&3)","右下(&4)","終了(&5)")

No.4260 2017/07/22(Sat) 20:14:55

Re: セレクトボックスとキーボードの連動 / satocha
UWSCのslcboxの選択肢の上限は31個または無制限です。
なのでユーザが「2」を押したからといって、即2番めの選択肢とはきまらず、もしかすると23番めの選択肢がユーザの意図かもしれません。

なので、選択終了のキーをユーザに入力させることが必要になりますが、それくらいなら、矢印キーで選んでEnterを押すのとさして手間は変わらなくなります。

なので、選択肢は1〜9限定で、数字キーを押したらすぐ結果を出すという場合に限って作ってみました。また、選択肢が6つしかないのに8を押したなどというエラー処理もしていません。

thread pushSlctBox()
sl=SLCTBOX(SLCT_BTN or SLCT_STR,0, 1000,600, "操作","左上","右上","左下","右下","終了")
msgbox(sl)
procedure pushSlctBox()
 title ="UWSC - " + Get_UWSC_Name
 classs ="TUslctBox_uwsc"
 repeat
  ky =0
  for i =1 to 9
   if eval( "GetKeyState( vk_" + i + " )" )
    ky=i
    break
   endif
  next
  if ky =0 then continue
  id  =getid( title, classs, 0.1 )
  if !status( id, st_isid ) then continue
  getitem( id, itm_btn, -1 )
  clkitem( id, All_Item_List[ ky - 1], clk_btn )
 until true
fend

No.4261 2017/07/22(Sat) 20:25:10

Re: セレクトボックスとキーボードの連動 / 谷
yanyan 様
satocha 様

ありがとうございます。
ずばり、私が求めていたものです。
早速使わせていただきます。

ご指導ありがとうございました。


No.4262 2017/07/24(Mon) 09:38:52
ログファイルをスクリプトの途中で変更したい / 森
OPTION LOGPATH = だと、変数や式が使えないので、スクリプト開始時にすでに決定していなければいけません。
スクリプトの途中で何度か変更したいのですが、何か良い方法は無いでしょうか?

No.4242 2017/07/20(Thu) 10:15:28

Re: ログファイルをスクリプトの途中で変更したい / stuncloud
1. printによるロギングを諦めてロギング専用関数を作る
現実的な解だとこれでしょう
例:

procedure print2(log, path)
 print log
 fid = fopen(path, F_READ or F_WRITE)
 gettime()
 t = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_NN2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2
 fput(fid, t + " " + log)
 fclose(fid)
fend

printしつつ指定パスにログを書くという内容ですね
fopen()を使うとログファイルが肥大化した際に読み書き動作が遅くなるので大量のログを書く場合は別の手段を用いたほうが良いです

2. LOGPATHを書き換えて再実行
無理やりやるパターン
例:

textblock
[option]
endtextblock
OPTION LOGPATH=C:\fuga.log

const LOG_HOGE = "C:\hoge.log"
const LOG_FUGA = "C:\fuga.log"

print "ログ書き込み"

if readini("option", "OPTION LOGPATH", GET_UWSC_NAME) = LOG_HOGE then
 writeini("option", "OPTION LOGPATH", LOG_FUGA, GET_UWSC_NAME)
 poff(P_UWSC_REEXEC)
endif

再実行後に別の処理をさせたい場合はPARAM_STRを使った分岐処理を入れる等の工夫が必要です
その場合はP_UWSC_REEXECじゃなくてexec等で自身を再実行しましょう
書いといてなんですがこんな方法は全くオススメしません

No.4243 2017/07/20(Thu) 11:06:42

Re: ログファイルをスクリプトの途中で変更したい / 森
stuncloudさん

超高速回答ありがとうございます!

> fopen()を使うとログファイルが肥大化した際に読み書き動作が遅くなるので大量のログを書く場合は別の手段を用いたほうが良いです
そう、これがネックなんですよね。
正規のログファイルでも、肥大化が原因だと思うのですが途中から残っていない場合もあって、途中で切り替えてみたいと思ったわけです。

> 書いといてなんですがこんな方法は全くオススメしません
思わず、ほっこりと笑ってしまいました(*´▽`*)
ちょっとカリカリしてきていたので、良いガス抜きをしてもらった感じです。

とりあえず、PRINTした行数は把握できているので、途中で別ファイルに退避することで対処しようと思います。
ありがとうございました。

No.4244 2017/07/20(Thu) 11:31:55

Re: ログファイルをスクリプトの途中で変更したい / stuncloud
> 正規のログファイルでも、肥大化が原因だと思うのですが途中から残っていない場合もあって

OPTION LOGLINESを超えた分かな?と思いましたがそれだと古いログから削除されるはずなのではて…?

> fopen()を使うとログファイルが肥大化した際に読み書き動作が遅くなるので大量のログを書く場合は別の手段を用いたほうが良いです

F_READ or F_WRITE だと一旦ファイルの内容を全部読み取って、書き出すときも全部まるっと書いてるんじゃないかと思ってるんですよね
なのでファイルが大きくなるほど遅くなっちゃう
昔数日に及ぶ作業をさせつつログ取ってたら、恐ろしくパフォーマンスが落ちてひどい目にあいました…
そこで別の手段が欲しくなるというわけです
ログファイルなんかは追記したいだけなのでそういうことができるものを使いましょう

path = "sample.log"
const ForAppending = 8 // 追記
const TristateUseDefault = -2 // システムデフォルト(sjisっぽい)で書く

with createoleobj("Scripting.FileSystemObject")
 with .OpenTextFile(path, ForAppending, TRUE, TristateUseDefault)
  .WriteLine("追記モードで書き込み")
  .Close()
 endwith
endwith

方法は色々ありますがFSOを使ったサンプルを書いてみました
1行300文字*5万行のテキストファイルに対してfopenだと500ミリ秒くらいかかってましたがこれだと15ミリ秒くらいでした
UTF8で書きたい!というような場合だとADODB.Streamあたりが良いかもですね

No.4245 2017/07/20(Thu) 14:11:10

Re: ログファイルをスクリプトの途中で変更したい / satocha
巨大なログに書き込むとなると、追記できる手段が必要だと思います。
思いつくのは
<OLE使用>
1)FileSystemObjectの追記モード
2)ADODB.Stream
<shell系>
3)doscmd("文字列 >> logfile")
4)powershell("文字列 >> logfile")
<powershellコマンドレット>
5)out-fileコマンドレットの-appendオプション使用
6)そのものずばりのadd-Contentコマンドレット
<.Net>
7)powershellでstreamwriteクラスを使う(filemod.appendで)

1はstuncloudさんが説明sしてくださったとおりです。ログ出力にutf-8が使えないことが難点でしょうか。OLEオブジェクトを使うなら、2でしょうか。

3,4は手軽ですが、エンコードが固定されること、出力文字列に改行や引用符が入ってくるとエスケープが大変、などが難点です。

6は書き出し中にreadもロックしてしまうようなので、ログには不向きかもしれません。

7はほかの手段ではできなかったeucでの書き込みにも対応しているので、UNIX系OSと共存するようなシステムでは有効だと思います。ただ、設定が大変そうで、詳しく調べていません。

そこで、5のout-fileで作ってみました。

msgbox( AppendToLog( powershell( "date" )+ logtext,"D:\LOG\log.txt" ) )

textblock logtext
改行やら引用符があるテキスト
改行やら"引用符"があるテキスト
改行やら'引用符'があるテキスト
endtextblock
function AppendToLog( text, log=Get_AppData_Dir+"\UWSC\UWSC.LOG", charset="unicode" )
 src  =replace(_ApprndToLog_ps1,"<TEXT>",text)
 src  =replace(src,"<LOG>",log)
 src  =replace(src,"<CHARSET>",charset)
 result =powershell(src)

textblock _ApprndToLog_ps1
$text =@"
<TEXT>
"@
$log ="<LOG>"
$charset ="<CHARSET>"
$PossibleChars ="unicode,utf7,utf8,utf32,ascii,bigendianunicode,default,oem" -split ","
if ( $PossibleChars -contains $log ){
$charset =$log
$log ="$ENV:APPDATA\UWSC\UWSC.LOG"
}
if ( $PossibleChars -notcontains $charset ){
charset="unicode"
}
$text|out-file -append -encoding $charset $log
endtextblock
fend

No.4247 2017/07/21(Fri) 08:31:11

Re: ログファイルをスクリプトの途中で変更したい / 森
stuncloudさん、satochaさん
ありがとうございます!

扱うのは、UTF-8です。
ログを動作中にチェックしたいからRead Lockはダメ
改行は入りませんが、引用符はシングルもダブルも大量にあります

なので、satochaさんに書いて頂いた 5)out-file を試してみます。
問題があれば、ADODB.Stream ですね。

今日は別の事をやっているので、テストできるのは週明け。
また結果報告します!

No.4248 2017/07/21(Fri) 09:20:33

Re: ログファイルをスクリプトの途中で変更したい / 森
途中報告です。
out-file -append でやってみました。
satochaさんのコードをベースにギリギリまで切り詰めてみましたが、10行のログ出力だけで6秒掛かりました。
残念ながら実用的では無かったです。
行けそうな気がしていたのですが、実際にやってみないと分らないものですね・・・
次は、ADODB.Stream で試してみます。

AppendToLog.uws
---------------------------------
dim log_data[]="あんず","いちご","イチジク","オレンジ","かぼす","柿","キウイ","栗","グレープ","さくらんぼ"
for text in log_data[]
AppendToLog( text , "hoge.log")
next

procedure AppendToLog( text, log_file )
print text
src = "(Get-Date).ToString(<#DBL>yyyy/mm/dd hh:mm:ss<#DBL>) + <#DBL> " + text + "<#DBL> | out-file -Encoding UTF8 -append " + log_file
powershell(src)
fend

hoge.logの出力結果
---------------------------------
2017/32/21 09:32:40 あんず
2017/32/21 09:32:41 いちご
2017/32/21 09:32:42 イチジク
2017/32/21 09:32:42 オレンジ
2017/32/21 09:32:43 かぼす
2017/32/21 09:32:43 柿
2017/32/21 09:32:44 キウイ
2017/32/21 09:32:45 栗
2017/32/21 09:32:45 グレープ
2017/32/21 09:32:46 さくらんぼ

No.4256 2017/07/21(Fri) 21:43:00

Re: ログファイルをスクリプトの途中で変更したい / 森
実用速度になりました。
読めれば良いので、FSOのUTF-16でも問題ないと思いますが、ADODB.StreamだとUTF-8(ただしBOM付)で書き出せるので、今回の私のケースではADODB.Streamを採用することにしました。
速度的にはどちらも高速で満足です。
ちなみにOut-Fileは、Out-File自体の処理が遅いのではなく、PowerShell()での実行が遅いのかなという感じですね。
stuncloudさん、satochaさん、ありがとうございました。
---------------------------------------
dim log_data[]="あんず","いちご","イチジク","オレンジ","かぼす","柿","キウイ","栗","グレープ","さくらんぼ"
for log_str in log_data[]
 log_print( log_str , "hoge.log")
 log_print2( log_str , "hoge2.log")
next

// FSO(stuncloudさんのコードをベースにUnicodeに変更)
procedure log_print(log_str , path)
 print log_str
 gettime()
 t = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_NN2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
 log_str = t + " " + log_str
 with createoleobj("Scripting.FileSystemObject")
  with .OpenTextFile(path, 8 , TRUE, -1 )
   .WriteLine(log_str)
   .Close()
  endwith
 endwith
fend

// ADODB.Stream(UTF-8 ただしBOM付)
procedure log_print2(log_str , path)
 print log_str
 gettime()
 t = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_NN2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
 log_str = t + " " + log_str
 with createoleobj("ADODB.Stream")
  COM_ERR_IGN
   try
    .Mode = 16 // 読み取り/書き込みモード 排他しない
    .Type = 2
    .Charset = "UTF-8"
    .Open
    .LoadFromFile (path) // logファイルが無い時、ここでエラーになる
    .Position = .Size // ポインタを終端へ
   finally
    .writeText(log_str , 1)
    .SaveToFile(path , 2)
    .Close
   endtry
  COM_ERR_RET
  EndWith
fend

No.4257 2017/07/22(Sat) 11:20:19
ウィルス対策ソフトでexeuws.exeがウィルス検知される / ビギナー
公式ページからDLした5302ですが、SymantecでTrojan Horseとして検疫されてしまいます。
No.4246 2017/07/20(Thu) 16:44:21
UWSスクリプトファイルが見つからない / VBA-IE
UWSCの実行ファイルをC:\UWSC\uwsc5302に、スクリプトファイルDL.uwsをC:のルートに置き、
以下を実行するが、UWSCでDL.UWSファイルが見つからないとエラー表示される。
ファイルのパスは合っていると思いますが、ファイルを見つけてくれない原因は何で、どのように
修正すれば良いかお教え願います。

Dim Fname As String
Fname = "c:\DL.uws" 'UWSスクリプトファイル名指定
Shell "C:\UWSC\uwsc5302\UWSC.exe /L" & Fname

No.4232 2017/07/13(Thu) 15:53:00

Re: UWSスクリプトファイルが見つからない / stuncloud
/L の後に半角スペースないからでは
>C:\UWSC\uwsc5302\UWSC.exe /Lc:\DL.uws
となってるので /Lc:\DL.uws なんてファイルないよと言われているんだと思います

# /L ってなんだ

No.4233 2017/07/13(Thu) 17:05:06

Re: UWSスクリプトファイルが見つからない / routa
ルートや"Program Files"以下に勝手にファイルを置くのは禁止されてます。
置いてしまうとVirtualStoreが働きます。
VirtualStoreについては検索で調べて下さい。

No.4236 2017/07/15(Sat) 01:54:47

Re: UWSスクリプトファイルが見つからない / VBA-IE
教えて欲しいのは、UWSCのスクリプトファイル名を変数を用いて指定する記述方法です。
記述を色々変えて実行した結果は以下です。
@Shell ("C:\UWSC\uwsc5302\UWSC.exe /L" & Fname) => VBA実行時エラー ファイルがみつかりません
AShell ("C:\UWSC\uwsc5302\UWSC.exe /L & Fname") => UWSCでFILE not found :&Fname.uws とエラー表示
BShell ("C:\UWSC\uwsc5302\UWSC.exe /L & Fname) => VBAでコンパイルエラー
CShell ("C:\UWSC\uwsc5302\UWSC.exe /L" & Fname") => VBAでコンパイルエラー

なお、ファイル名を変数を使わずに以下の様にフルパスで指定するとうまくいきます。
Shell "C:\UWSC\uwsc5302\UWSC.exe /L c:\DL.uws"

スクリプトファイル指定を変数を使って記述する方法を教えてください。

No.4237 2017/07/18(Tue) 10:42:31

Re: UWSスクリプトファイルが見つからない / stuncloud
> /L の後に半角スペースないからでは
って書いたの伝わってないですね
わりと直接的な答え書いたつもりだったんですけど全部書いて見せないとわからないのかしら、すごいなー
こうです、こう書いてください

Shell "C:\UWSC\uwsc5302\UWSC.exe /L " & Fname

/Lの後に半角スペースがあるのがわかるでしょうか、こう書くことに気付いてもらいたかったんですがとても残念です
ちなみになぜそこまで答えなかったかというと質問の内容も答えもUWSC関係ないからです、だってVBAの話なんだもの
本来ならVBAの質問に答える義理はないんですよ、ここUWSC掲示板ですし

No.4238 2017/07/18(Tue) 11:11:43

Re: UWSスクリプトファイルが見つからない / VBA-IE
stuncloud様

ご指摘の通り、/Lの後に半角スペースを入れたらうまくいきました。
他にもうまくいっていない個所もあり混乱していて、以前の回答をじっくり読めていなかった様です。
助かりました。ありがとうございます。

No.4240 2017/07/18(Tue) 14:22:02
ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / 加川プロ
CHGMOJ関数を使って置き換えをすると、部分一致で全てを置き換えてしまいます。したい事が完全一致で指定文字列のみを置き換える方法を探しています。正規表現を使えばできそうですが、いまいちコードが想い浮かびません。助けて頂けないでしょうか?
下記が試しているコードです。

---------------------

file="C:\Users\テキスト.txt"
fid=fopen(file,f_read)
text=fget(fid,-2)

大阪し
大阪しらべる
大阪したい
---------------------

key="大阪"
y="し"

mozi1=key+y
resc=CHGMOJ(text,mozi1,"")


[結果]

らべる
たい

[希望処理]

大阪しらべる
大阪したい

No.4230 2017/07/13(Thu) 12:45:28

Re: ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / しろまさ
TextBlock txt
大阪し
大阪しらべる
大阪したい
EndTextBlock

key="大阪"
y="し"
mozi1=key+y

MsgBox( Trim(regReplace(txt + "<#CR>", "^" + mozi1 + "\r\n", "")) )

// 正規表現 置換
Function regReplace(a_Str, a_Pattern, a_StrReplace)
  reg = CreateOLEObj("VBScript.Regexp")
  reg.Global = TRUE
  reg.Multiline = TRUE
  reg.IgnoreCase = TRUE
  reg.Pattern = a_Pattern
  Result = reg.Replace(a_Str, a_StrReplace)
FEnd

No.4231 2017/07/13(Thu) 13:12:36

Re: ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / 森
正規表現は便利だけど敷居が高いですよね。
ちょっと工夫で、こうやれば実現可能だったりします。

textblock before
大阪し
大阪しらべる
大阪したい
endtextblock

key = "大阪"
y = "し"
mozi1 = key + y + "<#CR>" // 改行も含める

temp = before + "<#CR>------------" // 最終行に改行が無いのでダミーデータを付けておく
temp = replace(temp, mozi1 , "<#CR>") // 改行を含めたキーを改行のみに置換
after = replace(temp, "<#CR>------------" , "") // ダミーデータを削除
msgbox(after)

No.4234 2017/07/13(Thu) 17:53:28

Re: ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / stuncloud
// 完全一致なら単に = で比較したんでも良いのでは
// そのままファイルの書き換えまでしています

fid = fopen(file, F_READ or F_WRITE)

key="大阪"
y="し"
mozi1=key+y

for i = 1 to fget(fid, F_LINECOUNT)
 if fget(fid, i) = mozi1 then // 完全一致していたら
  fput(fid, "", i) // 置換後の文字列を同じ行に書き込む
 endif
next

fclose(fid)

No.4235 2017/07/14(Fri) 11:20:02
保存した部分htmlファイルにinnerHTMLとかTXTとかしたいのですが / もも
お世話になります。
Webサイトを巡回して、IE.document.getElementByID(ID).outerHTML で
必要なところだけ切り出してファイル保存しています。

後日、ファイル内のTable内容をExcelやcsvに転記したいのですが、
ローカル保存した(BodyとかHeadとかが無い)不完全なhtmlファイルに対して、
更に部分切り出ししてinnerHTMLとかinnerTEXTみたいなことがしたいのですが
可能でしょうか?

いまは置換でスタイルシート一括除去とか不要タグ除去してみてるのですが、
このあと自前でTABLE読み込みを作ると思うとめげてしまいまして、なんとか
ラクは出来ないものかと。

よろしくお願いします。

No.4227 2017/07/11(Tue) 15:30:06

Re: 保存した部分htmlファイルにinnerHTMLとかTXTとかしたいのですが / stuncloud
そういう場合はhtmlfileが楽ですね、適当に書き込んでもそれなりのドキュメントにしてくれます
以下csvに書き出すサンプル

textblock table // 保存したテキストファイルの内容がこうだったとします
<table id="table1">
<tr>
<td>1</td>
<td>foo</td>
</tr>
<tr>
<td>2</td>
<td>bar</td>
</tr>
<tr>
<td>3</td>
<td>baz</td>
</tr>
</table>
endtextblock

htmlfile = createoleobj("htmlfile")
htmlfile.write(table) // 書き込み
// htmlfile.documentElement.documentがIE.document相当
table1 = htmlfile.documentElement.document.getElementById("table1")

csv = fopen("table.csv", F_WRITE)

// あとはIEと同じようにDOM操作する
for row in table1.getElementsByTagName("tr")
 td = row.getElementsByTagName("td")
 fput(csv, td.item(0).innerText + "," + td.item(1).innerText)
next

fclose(csv)

No.4228 2017/07/11(Tue) 16:22:41

Re: 保存した部分htmlファイルにinnerHTMLとかTXTとかしたいのですが / もも
stuncloud 様
サンプルありがとうございます。
完璧なサンプルだなと思いつつも実ファイルにあわせてテストしていたら手こずってしまいました。
Classでの取得を挫折してClassをID宣言に置換して逃げてみたり
.item(1)や .length にたどり着くまでへこたれかけたりと
すこし脇道に逸れると途端にやり方が分からなくて途方に暮れますね…
お陰様でなんとかテストの実ファイルもcsvに出来ました。
ありがとうございました。

No.4229 2017/07/13(Thu) 01:40:48
関数に配列を渡す際のよくわからない仕様 / RICES
for i = 0 to 5
 print 配列返し()[i]
next

print "end"

print join(配列返し())
print "end1"

print 配列受取(split(join(配列返し())))
print "end2"

dim x = 配列返し()
print 配列受取(x)
print "end3"

print 配列受取(配列返し())
print "end4"

//関数の返り値が配列の場合、それを直接関数に渡すことはできない?

///////////////////////////////
function 配列返し()
dim 配列[5]=1,2,3,4,5,6
result = split(join(配列))
fend
///////////////////////////////
function 配列受取(配列2[])
result = true
fend
///////////////////////////////

またしても妙な疑問ですみませんが、
上記コードを実行してみると、end4に到達できないかと思います。
どういう原理なんでしょうか…ね??

No.4207 2017/07/07(Fri) 13:16:19

Re: 関数に配列を渡す際のよくわからない仕様 / stuncloud
UWSCの配列変数はなんだかものすごく特殊な感じがするので、仕様上しょうがないのかもしれないですね
詳しいことはumiumiさんの回答を期待したいです

配列受取((配列返し()))
()で括ったらどうなるかなと思ったらSyntax Error

function 配列受取(配列2)
とすればひとまずOK、SafeArrayしか使わないのであれば引数を配列変数として定義しないのはアリです
(ただしSafeArray以外を渡しちゃうと困るので入力値のチェックは厳格に行うべき)

No.4210 2017/07/07(Fri) 16:50:46

Re: 関数に配列を渡す際のよくわからない仕様 / RICES
内部では配列は2種類あるような扱われかたをしているような印象を受けます

function 配列受取(配列2)
これで受け取れるとは思いませんでしたが、逆に普通に変数定義した配列を入れられなくなっちゃうんですね…
ぶっちゃけちょっとコードが長くなるだけなので別に実害はなさそうですけど、変数に格納してから引数に入れるか、結合文字列として受け取って内部で配列化するかになりますかね

No.4219 2017/07/10(Mon) 00:06:09

Re: 関数に配列を渡す際のよくわからない仕様 / satocha
検証してみました
下のコードを動かしてみると次のような結果になりました。

配列を返す組み込み関数を組み込み関数から呼び出す→○
配列を返す自作関数を組み込み関数から呼び出す→○
配列を返す組み込み関数を自作関数から呼び出す→○
配列を返す自作関数を自作関数から呼び出す→×

msgbox( length(split("a b c d")) )
msgbox( mylength(split("a b c d")) )
msgbox( length(mysplit("a b c d")) )
msgbox( mylength(mysplit("a b c d")) )
function mysplit(str,sep=" ")
 result =split(str,sep)
fend

function mylength(ary[])
 result =length(ary)
fend

ならば、配列を返す自作関数をそのまま自作関数に投入せず、組み込み関数であるsliceでいったん受けてやればどうか?
msgbox( mylength(slice(mysplit("a b c d"))) )
見事うまくいきました。記述は増えるものの余計な変数は排除できます。

No.4220 2017/07/10(Mon) 07:17:03

Re: 関数に配列を渡す際のよくわからない仕様 / しゅん
SafeArrayが後から出てきたもので、元々の配列(DIMや関数の引数で定義する配列)との同居対応に漏れがあるためかと思います。
SafeArrayができるまでは自作関数で配列を返すことは出来なかったので、配列を受け取る自作関数に、
・変数を渡す場合、元々の配列はOK、SafeArrayもOKにした
・SplitやSlice等は配列を返すので、OKにした
・SafeArrayを返す自作関数は、、、対応が漏れている
といったところかと思います。
他にSafeArrayを返す方法は、、、あるかしらん?

限りなく不具合に近いと思いますので、umiumiさんに報告すれば直してもらえる可能性は高そうです。

No.4221 2017/07/10(Mon) 09:38:16

Re: 関数に配列を渡す際のよくわからない仕様 / MM
かなり昔、SafeArray関連機能が実装したての頃、
SafeArray配列の出来損ない(長さ0とか)を触ると、
絶対にTryでトラップできず実行が必ず中断されるエラーが出たりして、
それ以来、羹に懲りてなますを吹いています。
Splitは自作関数でラップして標準配列に転写し長さを検査したりとかですね…

No.4223 2017/07/10(Mon) 10:16:17

Re: 関数に配列を渡す際のよくわからない仕様 / RICES
>>組み込み関数であるsliceでいったん受けてやればどうか?
この方法で今の問題点が粗方解決してしました ありがとうございます

一応、split(join(配列))という渡し方をしても同様にエラーを吐かなくはなりますが、重いし長いので…

No.4226 2017/07/10(Mon) 23:05:11
UWSCでプルダウンメニューを操作するには / 高橋
UWSCでプルダウンメニューを操作するには
どのようにすればよいでしょうか。

例えば、下記のホームページ1のHTMLの場合、
人が手で操作すると、
左側のプルダウンメニューでBを選択すると
右側の表示がBになりますが
これを下記のtest.uwsで行うと
プルダウンメニューの表示はBになりますが
右側の表示がBになりません。
どのようにすれば、(UWSCでなく)手で操作した時と
同じようにBと表示されるのでしょうか。

よろしくお願いします

動作環境 : Windows7,UWSC:フリー版5.3.0.2,IE11

---test.uws-------------------------------
IE = createoleobj("internetexplorer.Application")
IE.visible = True
IE.navigate("C:\test\top.html")
repeat
sleep(0.1)
until !IE.busy and IE.readyState = 4
obj=ie.document.getElementById("id1")
obj = ie.document.frames.Item("name1").document.getElementById("id1")
sleep(1)
obj.selectedIndex = 1
-------------------------------------------

ホームページ1のHTML
---C:\test\top.html-----------------------------
<html>
<head>
<title>TEST</title>
<script type="text/javascript" SRC="function.js"></script>
</head>
<frameset cols="200,*" border="10">
<frame src="f1.html" name="name1" onload="MakeList()">
<frame src="" name="name2">
</frameset>
</html>
---C:\test\f1.html-------------------------------------
<html>
<head>
<title>f1</title>
<script type="text/javascript" SRC="function.js"></script>
</head>
<body>
<form name="name3">
<select name="name4" id="id1" onChange="ChangeList()">
</select>
</form>
</body>
</html>
---C:\test\fa.html-------------------------------------
<html>
 <head>
<title>fa</title>
 </head>
<body>
<p>A</p>
</body>
</html>
---C:\test\fb.html-------------------------------------
<html>
<head>
<title>fb</title>
</head>
<body>
<p>B</p>
</body>
</html>
---C:\test\fc.html-------------------------------------
<html>
<head>
<title>fc</title>
</head>
<body>
<p>C</p>
</body>
</html>
---C:\test\function.js---------------------------------
function MakeList()
{
 var obj;
 obj=parent.name1.document.getElementById('id1');
 obj.options[0]= new Option("A","fa.html",true,true);
 obj.options[1]= new Option("B","fb.html");
 obj.options[2]= new Option("C","fc.html");
 parent.name2.location.href=obj.options[0].value;
 parent.name2.focus();
}

function ChangeList()
{
 var url = document.name3.name4.options[document.name3.name4.selectedIndex].value;
 if (url != "")
 {
  parent.name2.location.href=url;
  parent.name2.focus();
 }
}
-----------------------------------------------

No.4217 2017/07/09(Sun) 13:00:57

Re: UWSCでプルダウンメニューを操作するには / stuncloud
対象のsselectにonchangeが定義してあるのでそれを呼びます

obj.selectedIndex = 1
obj.onchange()

No.4222 2017/07/10(Mon) 10:09:18

Re: UWSCでプルダウンメニューを操作するには / 高橋
stuncloud さん

教えていただきました方法でできました。
ありがとうござました。

No.4225 2017/07/10(Mon) 19:59:17
Procedureにおける行結合の挙動に関して / みそ
UWSC便利に使わせて貰ってます

以下のようにProcedureの引数定義の途中で _ による行結合を行ったとき、
TEST1のように2行であれば問題無いのですが、特定条件下でTEST2のように3行に渡る場合エラーになります。
あまりしない記述かとは思いますが、たまたま見つけてしまったので報告をしておきます。
よろしくお願いします

・動作確認
OS:Windows7,UWSC:フリー版5.3.0.2

・条件
定義が、
TEST1→TEST2の順であればエラーにならない
TEST2→TEST1の順、もしくはTEST2のみだとエラーになる
どうも、3行に渡るProcedureが最初の定義であった場合のみエラーになるようです

・スクリプト
Procedure TEST1(a,b, _
c,d)
Fend

Procedure TEST2(a,b, _
c, _
d)
Fend

・エラーメッセージ
__MAIN__:関数が入れ子しているか、閉じていません
PROCEDURE TEST2(A,B, FEND

No.4218 2017/07/09(Sun) 23:56:22

Re: Procedureにおける行結合の挙動に関して / MM
そういう条件だったのですか…
定義には行結合が使えないものとばかり思ってました

No.4224 2017/07/10(Mon) 12:44:39
全1137件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 114 >> ]