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

2重ループの抜け方かgetElemetsbyNameの共通Name取得方法 / クッキー
こんにちは
UWSCで初めてプログラミングスクリプトを開始させた初心者です。

ドメインをサーバーに登録するという作業を自動化したいと思っております。

下記のようなHTMLがあり、テキストボックスのValueが空欄であれば1回だけドメインを入れたいです。
<INPUT TYPE="text" SIZE="30" NAME="mydomain1" VALUE="aaaa.com">
<INPUT TYPE="text" SIZE="30" NAME="mydomain2" VALUE="bbb.com">
<INPUT TYPE="text" SIZE="30" NAME="mydomain3" VALUE="">
<INPUT TYPE="text" SIZE="30" NAME="mydomain4" VALUE="">
空欄部分に文字を入れたら、サブミットボタンをおします。

テキストボックスへのINPUTはmydomainは最大9999まで入力可能で入力フォームの空欄が下に続いています。

mydomainの部分が連番なので、下記のようなスクリプトを作成しました。
しかし、この書き方だと最初に発見した空欄にドメインを入力した後にまた次の空欄を探しに行って、9999までこの処理を続けてしまいます。
空欄を発見し1回ドメインを1回入力しSUBMITボタンをしたら、この処理を終わりにしたいのですが、外側のFor ループの抜け方がわかりません。
どのように記述すればよいでしょうか?

もしくはmydomainを含むName属性をgetelementbynameで取得するという記述ができれば外側のfor i = 0 to 9999のループがいらなくなると思うのですが、そのやり方もわかりません。

何か良いやり方をご教授いただければ幸いです。
宜しくお願いいたします。

//*******作成したスクリプト**************
for i = 0 to 9999
i=0
NAME = "mydomain" + i
inputclasses = IE.document.getElementsByName(NAME)

for i = 0 to inputclasses.length - 1
NAME = "mydomain" + i
inputclasses = IE.document.getElementsByName(NAME)

if inputclasses.item(i).value = "" then
inputclasses.item(i).value ="abbbb.com" //ドメイを記入
IESetData(IE,True,"domain2") // SUBMIT ドメイン設定クリックする
break
Endif
next
next

//*******作成したスクリプト終わり**************

No.4606 2017/10/30(Mon) 17:12:42
メール送信 / おぐら
ネットで拾ってきたメール送信のスクリプトなのですが、ログインまではできても送信時にエラーが出ます。
原因はスクリプトではなく別の要素にあるのかもしれないですが、わかる方がいましたら教えていただけると幸いです。
低レベルで申し訳ないです。


Dim objEmail = CreateOleObj("CDO.Message")

//内容をセット
objEmail.From = "送信者@gmail.com"
objEmail.To = "あて先アドレス"
objEmail.Subject = "題名"
objEmail.Textbody = "内容"

Schemas = "http://schemas.microsoft.com/cdo/configuration/"
objEmail.Configuration.Fields.Item(Schemas + "sendusing") = 2
objEmail.Configuration.Fields.Item(Schemas + "smtpserver") = "smtp.googlemail.com"

objEmail.Configuration.Fields.Item(Schemas + "smtpserverport") = 465 //ポート番号
objEmail.Configuration.Fields.Item(Schemas + "smtpauthenticate") = True
objEmail.Configuration.Fields.Item(Schemas + "sendusername") = "ID(送信者@gmail.com)"
objEmail.Configuration.Fields.Item(Schemas + "sendpassword") = "メールパスワード(ログイン時と同じもの)"
objEmail.Configuration.Fields.Item(Schemas + "smtpusessl") = True

objEmail.Configuration.Fields.Update

objEmail.Send

No.4595 2017/10/26(Thu) 10:11:39

Re: メール送信 / stuncloud
> ログインまではできても送信時にエラーが出ます。
それはログインに失敗しているのでは

通常のメーラーを使って同一の設定でメールを送信できますか?
それが出来ない場合はまずgmail側の設定を確認してください
例えば二段階認証を有効にしている場合は通常のログインパスワードではなくアプリ専用のパスワードを都度発行する必要があります
あとは「安全性の低いアプリの許可」が無効になっているとか?

で、それらがクリアされてるならスクリプトの問題になります…が…
gmailのSMTPサーバーってsmtp.gmail.comじゃないですかね?
smtp.googlemail.comというのは…?

No.4596 2017/10/26(Thu) 11:08:47

Re: メール送信 / しろまさ
業務でさっきまでGmail設定してました^^

さて直接的な原因では無いと思いますが
smtpauthenticate は 0,1,2 指定なのでTRUE(1)はたまたま合ってるだけですね。
https://support.microsoft.com/ja-jp/help/555287

あとはstunさんの言うように、SMTPと二段階認証あたりの設定で通ると思います。

No.4600 2017/10/26(Thu) 16:32:48
テキスト全内容を引数にいれるだけで、重複内容行削除する方法 / さやか
テキスト全内容コピーした状態でスクリプト起動、重複内容行削除をした状態でのテキスト全内容を取得したいのですが、下記のスクリプトではエラーがでます。何か良い方法ないでしょうか?

下記の表示される
式がおかしい or 型が合っていない
配列[i]=hash[i, HASH_KEY])

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

テキスト全内容=getstr(0)
a=jyuhuku(テキスト全内容)
print a

function jyuhuku(テキスト全内容)
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
HASHTBL hash = HASH_CASECARE // ●HASH_SORT
public 配列[-1]
file="C:\Users\aruke\Desktop\aa.txt"
COMMON.Write_ALLText(file,テキスト全内容)

fid=fopen(file, F_read)
gyou=fget(fid,-1)
for i = 0 to gyou
hash[fget(fid,i)]=1 // 1 はダミー
next


for i=0 to length(hash)-1
配列[i]=hash[i, HASH_KEY])
next
result=join(配列)
fclose(fid)
DELETEFILE(file)
fend

No.4597 2017/10/26(Thu) 12:24:41

Re: テキスト全内容を引数にいれるだけで、重複内容行削除する方法 / stuncloud
> 式がおかしい or 型が合っていない
> 配列[i]=hash[i, HASH_KEY])


エラーは最後の ) のせいです
また、それを解消しても

> public 配列[-1]

で配列サイズが0なので代入できずエラーになります

> for i = 0 to gyou

fgetの行指定は1からなので i = 1 としましょう

ちなみにhashtblも実はjoinできるので
> hash[fget(fid,i)]=1 // 1 はダミー
の部分でダミーの値を入れずに
hash[fget(fid,i)]=fget(fid,i)
としてキーと同じ値を入れておけば
join(hash) で値部分がjoinされます
(join用の配列を別途用意する必要がなくなる)

これでひとまずは目的通りの動作になると思います

No.4598 2017/10/26(Thu) 14:03:19

Re: テキスト全内容を引数にいれるだけで、重複内容行削除する方法 / さやか
stuncloud様、いつも回答ありがとうございます。
目的の動作ができました。
それにしてもUWSCというツールがすごいですね。無限の可能性を感じさせてくれます。
UWSCを使いこなせるようになったら、自分の可能性も拡げさせてくれるような気がします。


function jyuhuku1(テキスト全内容)
call C:\Users\aruke\Desktop\_共通化.uws
HASHTBL hash = HASH_CASECARE // ●HASH_SORT

file="C:\Users\aruke\Desktop\aa.txt"
COMMON.Write_ALLText(file,テキスト全内容)

fid=fopen(file, F_read)
gyou=fget(fid,-1)

for i = 1 to gyou
hash[fget(fid,i)]=fget(fid,i)
next

result=join(hash,"<#CR>")
fclose(fid)
DELETEFILE(file)
fend
endCLASS

No.4599 2017/10/26(Thu) 14:37:36
アイコン不点灯 / 川田
フリー版のタスクバーにおいて、再生と録画のアイコンが点灯しなくなりました。
クリックしても動作しません。
OSはWIN10です。

情報をお待ちしております、よろしくお願いいたします。

No.4593 2017/10/25(Wed) 13:04:41

Re: アイコン不点灯 / ASD
ここ
http://www.uwsc.info/faq.html#N5

No.4594 2017/10/25(Wed) 14:53:19
DEFF_DLL で教えてください / えあり
APIからレジストリデータを取りたいと思っております

レジストリの項目が分かっているときに
 RegOpenKeyExA
 RegQueryValueExA
では正常に取得できていますが、項目が分からないため、一覧を取得しようとすると
 RegQueryInfoKey
 RegEnumValueEx
 RegEnumKeyEx
上記関数でいずれも NOT DLL FUNCTION が出てエラーとなってしまいます。

データ型や指定方法が分かる方、教えていただけませんでしょうか。
FILETIME指定の箇所は {var dword, var dword} でも試しましたがこれもうまくいきませんでした。

Windos2000ではREGコマンドが無く、この方法でしか取得できず、困っております。



Dim Handle
Dim Time[1]

Dim BufA[4] = 2147483650, "SOFTWARE\Microsoft\Updates\", 1, 0
DEF_DLL RegOpenKeyExA( hwnd, string, dword, dword, var hwnd ) : long : Advapi32.dll
Print RegOpenKeyExA( BufA[0], BufA[1], 0, BufA[2], Handle )

Print Handle

Dim BufB[4] = "test", 0, 0, 0
DEF_DLL RegQueryValueExA( hwnd, string, dword, var dword,_
var pbyte, var dword) : long : Advapi32.dll
Print RegQueryValueExA(Handle, BufB[0], 0, BufB[1], BufB[2], BufB[3]) )

//ここまでは正常に動きます

Dim BufC[9] = "test", 1255, 0, 1, 1, 0, 0, 0, 0, 0
DEF_DLL RegQueryInfoKey( hwnd, var string, var dword, dword,_
var dword, var dword, var dword, var dword, var dword,_
var dword, var dword, var dword[]) : long : Advapi32.dll
MsgBox( RegQueryInfoKey( Handle, BufC[0], BufC[1], NULL, BufC[2],_
BufC[3], BufC[4], BufC[5], BufC[6], BufC[7], BufC[8], Time ) )

Dim BufD[5] = "test", 1255, 0, 0, 1256
DEF_DLL RegEnumValueEx( hwnd, dword, var string, var dword,_
dword, var dword, var pchar, var dword) : long : Advapi32.dll
MsgBox( RegEnumValueEx( Handle, 0, BufD[0], BufD[1], NULL, BufD[2], BufD[3], BufD[4]) )

Dim BufE[5] = "test", 1255, NULL, 0, 1256
DEF_DLL RegEnumKeyEx( hwnd, dword, var string, var dword,_
var dword, var string, var dword, var dword[]) : long : Advapi32.dll
MsgBox( RegEnumKeyEx( Handle, 0, BufE[0], BufE[1], BufE[2], BufE[3], BufE[4], Time ) )

No.4585 2017/10/23(Mon) 17:16:58

Re: DEFF_DLL で教えてください / stuncloud
> 上記関数でいずれも NOT DLL FUNCTION が出てエラーとなってしまいます。
については
> Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装
なので
> RegQueryInfoKey
> RegEnumValueEx
> RegEnumKeyEx

はそれぞれ
RegQueryInfoKeyA
RegEnumValueExA
RegEnumKeyExA
にする必要があるんじゃないかと思います
# あとRegEnumValueExてあるんですかね、msdn見たらRegEnumValueしかなかったんですが

レジストリに関してはWMIを使ったほうが簡単かもしれないですよ

No.4586 2017/10/23(Mon) 18:02:41

Re: DEFF_DLL で教えてください / えあり
早速の回答ありがとうございます。
RegQueryInfoKeyAとしたところ、この関数は動作いたしました。
が、やはりRegEnumValueExAおよびRegEnumKeyExAは動作しないようです。

個人的にはFILETIMEの構造体の部分が怪しいとにらんでいるのですが
この場合、指定方法が間違っているかどうかも含めて
どのように検証したらよいのか見当がつきません。

引き続き、お願いいたします。

No.4588 2017/10/23(Mon) 19:06:36

Re: DEFF_DLL で教えてください / stuncloud
すいません、winapiを試してたんですが僕のめんどくさい閾値を越えてしまったのでWMIのサンプルを書いてみました
サブキーまでわかっていてエントリがわからない状態でエントリ名の列挙と値の取得をしています (REG_SZ、REG_DWORDのみ)
ただ使う分にはこんなにめんどくさくないんですが、WOW64対策を入れてるのでこんなことになっています
今回は書き込みを行ってないので関係ないんですが、HKCU以外への書き込みを行う場合はUWSCを「管理者として実行する」必要があります

objCtx = CreateOleObj("WbemScripting.SWbemNamedValueSet")
objCtx.Add("__ProviderArchitecture", 32) // 32ビットを指定
objLocator = CreateOleObj("Wbemscripting.SWbemLocator")
objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
objStdRegProv = objServices.Get("StdRegProv")
InparamsEnum = objStdRegProv.Methods_("EnumValues").Inparameters
InparamsEnum.Hdefkey = HKEY_LOCAL_MACHINE
InparamsEnum.Ssubkeyname = "SOFTWARE\Umiumi\UWSC\" // 32ビットを指定したため64ビットOS上でもWOW6432Nodeのパスを指定する必要がない
// InparamsEnum.Ssubkeyname = "SOFTWARE\WOW6432Node\Umiumi\UWSC\"
OutparamsEnum = objStdRegProv.ExecMethod_("EnumValues", InparamsEnum, , objCtx)

if OutparamsEnum.ReturnValue = 0 then
 for i = 0 to length(OutparamsEnum.sNames) - 1
  print OutparamsEnum.sNames[i]
  select OutparamsEnum.Types[i]
   case REG_SZ
    method = "GetStringValue"
   case REG_DWORD
    method = "GetDWORDValue"
  selend
  InparamsRead = objStdRegProv.Methods_(method).Inparameters
  InparamsRead.Hdefkey = HKEY_LOCAL_MACHINE
  InparamsRead.Ssubkeyname = "SOFTWARE\WOW6432Node\Umiumi\UWSC\"
  InparamsRead.sValueName = OutparamsEnum.sNames[i]
  OutparamsRead = objStdRegProv.ExecMethod_(method, InparamsRead, , objCtx)
  if OutparamsRead.ReturnValue = 0 then
   select OutparamsEnum.Types[i]
    case REG_SZ
     print OutparamsRead.sValue
    case REG_DWORD
     print OutparamsRead.uValue
   selend
  endif
  print
 next
endif

const HKEY_CLASSES_ROOT = $80000000
const HKEY_CURRENT_USER = $80000001
const HKEY_LOCAL_MACHINE = $80000002
const HKEY_USERS = $80000003
const HKEY_PERFORMANCE_DATA = $80000004
const HKEY_PERFORMANCE_TEXT = $80000050
const HKEY_PERFORMANCE_NLSTEXT = $80000060
const HKEY_CURRENT_CONFIG = $80000005
const HKEY_DYN_DATA = $80000006
const HKEY_CURRENT_USER_LOCAL_SETTINGS = $80000007

const REG_SZ = 1
const REG_EXPAND_SZ = 2
const REG_BINARY = 3
const REG_DWORD = 4
const REG_MULTI_SZ = 7
const REG_QWORD = 11

これもだいぶめんどくさい感じなんですけどwinapiよりはまだ気楽に扱えます…

No.4592 2017/10/25(Wed) 12:23:01
IEで新しいタブを操作したい / ボケチン
Internet Explorer で「新しいタブを操作したい」と思います。
下記にようにやっても、新しいタブ内のログインボタンをクリックすることができません、新しいタブ内のログインボタンをクリックするにはどのようにしたら良いでしょうか。

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True

IE.navigate("https://www.yahoo.co.jp/")
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate=4

IE.navigate2("https://email.excite.co.jp/",$800)
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate=4

IESetData(IE,True,"","innerText=ログイン")

宜しくお願い致します。

No.4584 2017/10/23(Mon) 12:31:11

Re: IEで新しいタブを操作したい / stuncloud
複数タブについては「IE タブ」で掲示板内を検索すれば出てきます
わりと最近似たような質問が数件あったので、そちらを参考にしてください

No.4587 2017/10/23(Mon) 18:10:21

Re: IEで新しいタブを操作したい / ボケチン
stuncloud様

どうも有り難うございます。
Googleでサイト検索しても理解できなかったので、過去ログの中を検索して勉強したいと思います。

No.4591 2017/10/24(Tue) 09:04:01
function、procedureの中でpublic使う方法での戻り値について / さやか
functionはresultで戻り値を返す事ができる。
procedureは戻り値を返す事ができない。
今回下記のスクリプトでnIDという変数をメイン処理で使いたい場合ですが、procedureの中でpublicを使用する方法が思いつきます。この考え方で問題ないでしょうか?

検証した結果は、1と2それぞれでnIDは使えています。いまいち、publicの意味が完全に理解できていないような気がして質問させて頂きました。

---------------------
1

url="https://staf"
nID=ieget(url)
a=status(nID, ST_title)
print a


function ieget(url)
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
endTry
result =hndtoid(IE.hwnd)
fend
---------------------
2


url="https://staf"
nID=ieget(url)
a=status(nID, ST_title)
print a

procedure ieget(url)
public nID
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
endTry
nID = hndtoid(IE.hwnd)
fend

No.4573 2017/10/22(Sun) 11:12:45

Re: function、procedureの中でpublic使う方法での戻り値について / satocha
関数の方は問題なさそうですね。
同じことをプロシジャでやりたいのでしたら、お書きのとおり、procedureは値を返すことができないので、public指定した大域変数にprocedure中で代入するという感じです。コードで書くと
//メーン部

public nID

//プロシジャ
procedure ieget(url)

nID=…
fend

という風に、できることはできるのですが、大域変数はプログラムのあちこちで値を変更できてしまうため、バグを生じやすい懸念があります。
こういう例なら、関数で実装したほうがよいと思います。

※もうひとつ、プロシジャに変数を参照渡しする方法もあります。これなら、大域変数を使わないので前の例よりも好ましいですが、直感的に変数の値を変更していることに気付きにくいので、関数を使ったほうが後々らくだと思います。
具体的には
iget( url, nID)//これで、nIDにプロシジャで設定した値が入る
procedure ieget( url, var id )//引数の前にvarを付ける。ヘルプの「関数の定義」参照

id=…
fend

No.4575 2017/10/22(Sun) 13:52:09

Re: function、procedureの中でpublic使う方法での戻り値について / さやか
satocha様返信ありがとうございます。
全部で4パターンがあると分かりました。

パターン1
url=""

ieget(url)
a=status(nID, ST_title)
print a

procedure ieget(url)
public nID
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
nID = hndtoid(IE.hwnd)
fend
---------------------
パターン2
url=""
dim nID
ieget(url,nID)
a=status(nID, ST_title)
print a

procedure ieget(url,var nID)

try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
nID = hndtoid(IE.hwnd)
fend
---------------------
パターン3

url=""
public nID
ieget(url)
a=status(nID, ST_title)
print a


procedure ieget(url)

try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
nID = hndtoid(IE.hwnd)
fend
---------------------
パターン4

url=""

nID=ieget(url)
a=status(nID, ST_title)
print a

function ieget(url)
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
result= hndtoid(IE.hwnd)
fend

No.4576 2017/10/22(Sun) 14:38:44

Re: function、procedureの中でpublic使う方法での戻り値について / しろまさ
余計なお世話かもしれませんが蛇足を少々。

public はどこに記述しても実行時に定義されます。
 procedure ieget(url)
 public nID
ですので、このような書き方をするとどれがpublic変数か見落としやすくなるので
最初や最後などどこかにまとめて書いておくと後から見たとき解りやすいと思います。

ちなみにModule内publicは外部からModule内変数を参照したいときに宣言します。

No.4580 2017/10/23(Mon) 08:56:28

Re: function、procedureの中でpublic使う方法での戻り値について / さやか
しろまさ様、返信ありがとうございます。

関数一覧.uwsに関数を書いていく時、下記のように配列の宣言は先頭に書いていく方がよさそうですね。今までは、各関数内に書いていましたので、分かりにくかったです。配列の処理する時は、先頭で宣言したpublic a[-1]の配列変数aで処理していくようにします。

call C:\Users\aruke\Desktop\関数一覧.uws
tes.com1()

for i in tes.a
print i
next

print length(tes.a)

---------------------
C:\Users\aruke\Desktop\関数一覧.uws

CLASS tes

public a[-1]

procedure com()
resize(a,4)
for i = 0 to 3
a[i]=i
next
fend


procedure com1()
resize(a,3)
for i = 0 to 2
a[i]=i
next
fend

endCLASS

No.4590 2017/10/24(Tue) 05:37:06
Functionの中でtextblockを切り替えたい。 / sen
いつもお世話になっております。
Functionの中でTEXTBLOCKを切り替えできるようにして、複数に対応できるようにしたいのですがうまくいきません。
こういう場合は、別々にすべきなのでしょうか?
ご教授頂けませんでしょうか?


print F置換え連想配列("牛sc興業様御中")

Function F置換え連想配列(var 漢字)
 fp = Fopen("", F_READ or F_WRITE)
 Fput(fp,T届け先漢字, F_ALLTEXT)

 正規 = CreateOLEObj("VBScript.RegExp")
 正規.IgnoreCase = true
 正規.Global = true
  for i = 1 to Fget(fp, F_LINECOUNT)
   正規.Pattern=Fget(fp,i,1)
   漢字 = 正規.Replace(漢字,Fget(fp,i,2))
   Result=漢字
  next
 Fclose(fp)
Fend

TEXTBLOCK T届け先漢字
^,""
^,""
^(株),""
様御中$,""
様$,""
御中$,""
店$,""
ENDTEXTBLOCK



print F置換え連想配列("牛sc興業様御中","T届け先漢字")

Function F置換え連想配列(var 漢字,テキストブロック)
 fp = Fopen("", F_READ or F_WRITE)
 Fput(fp,テキストブロック, F_ALLTEXT)

 正規 = CreateOLEObj("VBScript.RegExp")
 正規.IgnoreCase = true
 正規.Global = true
  for i = 1 to Fget(fp, F_LINECOUNT)
   正規.Pattern=Fget(fp,i,1)
   漢字 = 正規.Replace(漢字,Fget(fp,i,2))
   Result=漢字
  next
 Fclose(fp)
Fend

No.4574 2017/10/22(Sun) 13:20:32

Re: Functionの中でtextblockを切り替えたい。 / しろまさ
Fput(fp,Eval(テキストブロック), F_ALLTEXT)
はどうですか?

No.4581 2017/10/23(Mon) 09:06:04

Re: Functionの中でtextblockを切り替えたい。 / stuncloud
textblockは定数なので

置換え連想配列("牛sc興業様御中", T届け先漢字)

とすれば良いです、""が余計でしたね
あと、ついでにおせっかいなのですが…このくらいの正規表現置換であればパターンは1つにまとめられちゃいます

TEXTBLOCK T届け先漢字2
^(弓掛(株))|(様御中|様|御中|店)$,""
ENDTEXTBLOCK

print F置換え連想配列("牛sc興業様御中", T届け先漢字2)
// 高田興業

それとF置換え連想配列のvarも必要ないですね

# それにしてもFget(fp,i,2)した「""」が空文字として評価されてるのはなんでなんだぜ…?

No.4582 2017/10/23(Mon) 10:32:46

Re: Functionの中でtextblockを切り替えたい。 / しろまさ
あれ?
 print F置換え連想配列("牛sc興業様御中","T届け先漢字")
の"T届け先漢字"を切り替えて使いたいという要望ではなかったんですかね? 読み違えたか。

No.4583 2017/10/23(Mon) 10:59:03

Re: Functionの中でtextblockを切り替えたい。 / sen
ありがとうございます。
うまくいきました。

<読み違えたか。

合っております。こういう時に、Evalを使うんですね。


<このくらいの正規表現置換であればパターンは1つにまとめられちゃいます

お恥ずかしい限りです。

No.4589 2017/10/23(Mon) 22:42:09
間違ってXLACTIVATEすると、次のエクセルが開けなくなる / sen
いつもお世話になっております。
以前から、ちょこちょこエクセルがうまく操作できない事を質問させて頂いていた原因らしきものが、
発見できたのですが、@のところで、間違ってXLACTIVATEすると、次のエクセルが開けなくなるみたいです。
間違いなく自分が悪いのですが、コピーして作成した為に、おかしな行がそのまま残っていたのだと思います。
ただ、沢山作った中でどこに間違った指定があるのか分からず、困っています。
これは、これでこんなものでしょうか?

//注文.CSV //を開いている
//1,2,3,4

Excel = GETACTIVEOLEOBJ("Excel.Application")

XLACTIVATE(Excel,"Nrb0000.CSV")//@ 開いていないファイルを間違って指定する
エクセル = XLGETDATA(Excel, "A1:D1")
XLCLOSE(Excel,TRUE)

for i = 0 to 3
 print I+" "+エクセル[1,i+1]
next
//ここまでは、うまく動く。

XLOPEN("新規.xlsx")//A 別のファイルを開くとうまく開けない

No.4579 2017/10/23(Mon) 00:44:42
Excel ファイルを開いた場合に書式設定のユーザー定義が破壊されます / お名前
Windows 10 Home 64bit, UWSC 5.3.0.2, Microsoft Excel 2007

UWSC から Excel ファイルを [OLEObj] として開いた場合のみ、 書式設定のユーザー定義が破壊されます。 具体例を示します。

----------------------------------------
<再現方法の具体例・ここから>
最初に、 [C:\Book1.xlsm] を作成し、 任意のセルに 2017年1月1日などの年月日を記述します。 その書式を [セルの書式設定 > ユーザー定義] で [yyyy"年"mm"月"dd"日"] に設定します。 その後、 UWSC から以下のプログラムで開きます。

Excel_OLEObj_2 = CreateOLEObj("Excel.Application")
Excel_OLEObj_2.Visible = True
Excel_OLEObj_2.WorkBooks.Open(FileName :="C:\Book1.xlsm")

すると、 本来であれば [yyyy"年"mm"月"dd"日"] のユーザー定義を維持していなければいけないはずですが、 [yyyy"年"m"月"d"日"] に きょうせいリプレースされます。 また、 該当のユーザー定義は消滅しています。

<再現方法の具体例・ここまで>
----------------------------------------

しかし、 yyyy"年"m"月"dd"日" の場合、 なぜか破損しません。 また、 "西暦"yyyy"年"mm"月"dd"日" の場合も、 なぜか破損しません。

ファイルの拡張子が .xlsb, .xlsx の場合もユーザー定義が破損します。 しかし、 ファイルの拡張子が .xls の場合、 なぜかユーザー定義が維持されます。

セルのスタイル > 新しいセルのスタイル
に登録した場合も同じ不具合になりました。 この場合、 セルのスタイルのユーザー設定ごと破損していました。

UWSC でも、 [OLEObj] いがいの方法だと正常に動作しました。 例えば、 以下の コマンド プロンプトからだと正常に起動できました。
DOSCMD("C:\Book1.xlsm", TRUE)

[Windows 7 Professional 32bit + Microsoft Excel 2013] の環境では発生しませんでした。

[UWSC から Excel ファイルを [OLEObj] として開いた場合] いがいの どんな方法でも、 この不具合は再現しませんでした。

質問です。 私以外の人も同じ不具合が発生するのかを教えてください。 原因、 対策、 などを知っていれば教えてください。 よろしく お願い致します。

No.4569 2017/10/20(Fri) 19:25:36

Re: Excel ファイルを開いた場合に書式設定のユーザー定義が破壊されます / しき
win7 pro 64bit + Excel2007 + UWSC 5.3.0.2
で再現しました。
対策。Local:=true を入れる。これが他にどんな影響を与えるかはわかりません

o_Excel = GetActiveOleObj("Excel.Application")
o_Excel.WorkBooks.Open("C:\test1.xlsm", Local:=true)


以下、試してみて分かったこと
・ファイルは .xlsm, .xlsx, .xlsb でも日付書式が変化します
 .xls (2003形式)では変化しません。2007以降のファイル形式で発生するよう

・4つの書式で試した
 yyyy"年"mm"月"dd"日"  //==> yyyy"年"m"月"d"日"
 yyyy/mm/dd       //==> 分類が ユーザー定義 から 日付になる
 mm"月"dd"日"      //==> m"月"d"日"
 mm/dd         //==> mm/dd 変化なし

・WorkBooks.Open で開いた後、手動で閉じて、手動で開くと書式は変化前に戻っている
 ==> 開いただけではファイルは更新されてない
    また、閉じるときに保存の確認もない

・WSH と WordのVBA で同じように開いてもこの現象は発生しない
 また、Local:=false としても問題の現象は発生しない
 ==> UWSCにも原因はある?

'==== WSH用 test.vbs ====
set o_Excel = GetObject(, "Excel.Application")
o_Excel.Workbooks.Open("C:\test1.xlsm")
'call o_Excel.Workbooks.Open("C:\test1.xlsm", , , , , , , , , , , , false)
'call o_Excel.Workbooks.Open("C:\test1.xlsm", , , , , , , , , , , , , true)

'==== Word VBA用 マクロ ====
Sub Macro1()
Set o_Excel = GetObject(, "Excel.Application")
o_Excel.Workbooks.Open FileName:="C:\test1.xlsm"
'o_Excel.Workbooks.Open FileName:="C:\test1.xlsm", Local:=False
'o_Excel.Workbooks.Open FileName:="C:\test1.xlsm", Local:=True
End Sub

No.4577 2017/10/22(Sun) 14:47:07

Re: Excel ファイルを開いた場合に書式設定のユーザー定義が破壊されます / お名前
ありがとうございます。 あなたの助言のとおり、 [Local:=true] を入れることで、 不具合は発生しなくなりました。

つまり、 書式のユーザー定義に日本語を含んでいる場合のみに不具合が発生するので、 あなたは [言語にかんけいしている] と判断して、 Local のパラメータに着目したのですね。 さすがです。

<以下、 個人的な勝手な推測 (根拠なし)>
Excel 2007 のファイル起動処理時に、 本来であれば Local の指定の有無にかかわらず、 [日本語のユーザー定義] もロードされなければ不自然です。 しかし、 Excel 2007 の不具合により、 [Excel 2007 から追加された新しい拡張子 (.xlsx など)] の起動処理のみでは [日本語のユーザー定義の一部] が正常に起動できません。 Local の指定がない場合、 ディフォルトの処理になり、 UWSC は default = English, [WSH と WordのVBA] は default = [OS と同じ言語]、 という処理だと仮定すれば、 その仕様に基づいて、 UWSC の場合のみ [日本語のユーザー定義の一部] が起動 (ロード?) されなくなります。

前述したとおり、 Excel 2013 では不具合が発生しませんでしたので、 Excel 2007 の不具合と推測されます。 UWSC の不具合であれば、 Excel 2013 でも発生しなければ不自然なので。

No.4578 2017/10/22(Sun) 17:13:03


 過去ログ(〜2017/08/24)・検索ツール


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