106392
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオン
動作不具合での質問の場合には環境を表記(OS,バージョン等)
タイトルは内容を表し、内容はネットゲーム関係禁止
自身でコードを書く気の無いナマケモノは特に質問禁止
失敗作でもコードを投稿すること(具体性の無い質問は無視される可能性大)

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
環境設定[s7777777]

VALについてお教えください。 / ながいも
バーコードを読み取るとQ0000****.00と表示がされます。
Qはbitweenで消せますし、INTで.00は取れるのですが
****が1桁の数字だったり4桁の数字だったりし、どのように0を削除して良いのかわかりません。
初歩的な質問で申し訳ございません。
お教え頂ければ幸いです。

No.873 2020/06/08(Mon) 20:11:58

Re: VALについてお教えください。 / ながいも
すいません。
勘違いのようでした。。。

No.874 2020/06/08(Mon) 20:22:53
文字列内の指定文字列の個数をカウントしたい / もじもじ
例えば「ABCCBACACBABACAB」といった文字列があります。
この中から「AB」がいくつあるかをカウントし変数に格納したいです。
どのように処理したらよいでしょうか。

No.870 2020/06/05(Fri) 21:22:40

Re: 文字列内の指定文字列の個数をカウントしたい / satocha
count=length(split("ABCCBACACBABACAB","AB"))-1

あとは
msgbox(count)
でも
print count
でもやって確認してください。

あまりに短いんで気づいたことを一つ。
UWSCの文字列処理は、英字の大文字、小文字を区別しません。
しかし、どういうわけかsplit関数の第二引数の文字列は区別するようです。

ほかのUWSCの文字列処理と合わせるなら、比較する前に、文字列、キーとも大文字化しておくといいです。

No.871 2020/06/06(Sat) 13:36:20

Re: 文字列内の指定文字列の個数をカウントしたい / もじもじ
satochaさん
ありがとうございました。助かりました。

No.872 2020/06/06(Sat) 17:24:16
SPLITがだめなのでしょうか・・・ / ながいも
お世話になっております。
データテーブル内の注文番号を抜き出す処理においてエラーが発生いたします。
エラー発生箇所はT2_DATAです。
REPEAT/UNTILの間に入れているからだとおもいますが何か良い方法はございますでしょうか?
初歩的な質問で申し訳ありません。
お助けいただけますようお願いいたします。

*******************************
TBL_CTR = 0
REPEAT
DE_DATA=DATA_TBL[TBL_CTR]

T0_DATA=BETWEENSTR(DATA_TBL[TBL_CTR],,) //1行まるごと抜き取り
T1_DATA=SPLIT(T0_DATA,",") //行をSPLITで分割
T2_DETA=T1_DATA[0] //1番先頭にいる注文番号を取りたい
T_DATA= BETWEENSTR(T2_DETA,"<#DBL>","<#DBL>") //ダブルクォーテーションが邪魔だから消す

DE_DATA=DATA_TBL[TBL_CTR]
IFB (SCAN=T_DATA )
TBL_CTR=LIST
ELSE
TBL_CTR = TBL_CTR + 1
ENDIF
UNTIL TBL_CTR + 1 > LIST

No.859 2020/06/02(Tue) 15:05:30

Re: SPLITがだめなのでしょうか・・・ / stuncloud
なんのエラーが出てますか?なるべくエラーメッセージもそのまま書いてください
なんとなくT0_DATAが長さ0の文字列だとだめになりそうな気がします
(長さ0の文字列splitすると長さ0のsafearrayになったような記憶
長さ0の配列だと[0]すらないのでエラーになる)

No.860 2020/06/02(Tue) 18:01:51

Re: SPLITがだめなのでしょうか・・・ / ながいも
stuncloud さん
お世話になっております。

variant or safe array index out of bounds
T2_DETA=T1_DATA[0]

というエラーでした。

仮で下記のように1と与えてみても同じエラーとなります。
variant or safe array index out of bounds
T2_DETA=T1_DATA[1]

*******************************
TBL_CTR = 1
REPEAT
DE_DATA=DATA_TBL[TBL_CTR]

T0_DATA=BETWEENSTR(DATA_TBL[TBL_CTR],,) //DATA_TBLから1行まるごと抜き取り
T1_DATA=SPLIT(T0_DATA,",") //行をSPLITでカンマ区切りで分割
T2_DATA=T1_DATA[1] //SPLITでカンマ区切りした1番先頭にいる注文番号を取りたい
T_DATA= BETWEENSTR(T1_DATA,"<#DBL>","<#DBL>") //ダブルクォーテーションが邪魔だから消す

DE_DATA=DATA_TBL[TBL_CTR]
IFB SCAN=T_DATA
TBL_CTR=LIST
ELSE
TBL_CTR = TBL_CTR + 1
ENDIF
UNTIL TBL_CTR + 1 > LIST

No.861 2020/06/02(Tue) 18:43:28

Re: SPLITがだめなのでしょうか・・・ / HIBI
T2_DATA だったり
T2_DETA だったりしてますが、単なる記述ミスですか?

No.862 2020/06/02(Tue) 18:49:18

Re: SPLITがだめなのでしょうか・・・ / ながいも
HIBIさん
お世話になっております。
単なる記述ミスです。。。すいません
記述ミスはエラーには関係がなさそうです。
お助けください。

No.863 2020/06/02(Tue) 18:54:34

Re: SPLITがだめなのでしょうか・・・ / ながいも
なおこっちでは問題なく動くのですがデータテーブル全体をPOSで
総当たりしてるからダメだと言われたための修正です。。。


for i = 1 to length(DATA_TBL)-1
ifb POS(SCAN,DATA_TBL[i]) > 0 then
print DATA_TBL[i]
SCANLINE =BETWEENSTR(DATA_TBL[i],,)//これで対象となる1行は取れた
endif
next

ARR = SPLIT(SCANLINE,",")
注文ナンバー=ARR[0]

No.864 2020/06/02(Tue) 19:03:25

Re: SPLITがだめなのでしょうか・・・ / ながいも
もしかして。。。
多次元配列であれば行けるのでしょうか?

No.865 2020/06/02(Tue) 21:05:58

Re: SPLITがだめなのでしょうか・・・ / stuncloud
>variant or safe array index out of bounds
配列の添字が範囲外のエラーです
やはり配列の長さが0だったようですね
以下のような状態です

arr = split("", ",")
print length(arr) // 0

これだと要素(長さ)0の配列になるので、arr[0]とすると範囲外になります
(arr[0]とするには要素が最低1つ必要なので)
簡単に言えば要素0の配列にはどんな添字を入れてもエラーになっちゃいます

おそらく T0_DATA が空文字列になっているのでしょう
すると T1_DATA が要素0の配列になります
そういった場合は処理をしないように、例えば

T1_DATA=SPLIT(T0_DATA,",") //行をSPLITで分割
if length(T1_DATA) = 0 then
 continue
endif
T2_DETA=T1_DATA[0] //1番先頭にいる注文番号を取りたい

のようにして続く処理を行わないようにしましょう

それと細かいとこですが
> T0_DATA=BETWEENSTR(DATA_TBL[TBL_CTR],,) //1行まるごと抜き取り
一行まるごとならbetweenstrは不要ですね

No.866 2020/06/02(Tue) 22:13:30

Re: SPLITがだめなのでしょうか・・・ / stuncloud
なお、前回書いたモジュールを使えばこんな風に記述できます


call Module_CSV.uws

// 略

CSV.OpenFile(filepath, FALSE) // csvファイルを読み込む

rows = length(CSV.GetTable()) // csvの行数を得る

// 1行ずつ処理
for i = 1 to rows
 T2_DATA = CSV.GetValue(i, 1) // i行目の1列目の値を得る
 // 残りの処理
next

No.867 2020/06/02(Tue) 22:28:03

Re: SPLITがだめなのでしょうか・・・ / ながいも
stuncloudさん
丁寧なご説明を頂きありがとうございました。
コンテニューで数値が入るまで戻る必要があったのですね。
早速明朝にプログラムを見直してみます。

前回頂いたCSVuwsは、私が使いたいCSVファイルにそのまま使えましたが、コピペだけでは成長出来ないと泣く泣く今回は使わないようにしておりました。

明朝にどはまりするようであればモジュールデータをそのまま利用させて頂きます。

度々御指南頂きありがとうございます。

No.868 2020/06/03(Wed) 00:39:43

Re: SPLITがだめなのでしょうか・・・ / ながいも
stuncloudさん
お世話になっております。
ご指南いただいたおかげでようやく前にすすめることができました。
SPRITなんか使ってるからだ!BETWEEN使えと言っていた先輩にSPLITでもわるくないんですと言い返せすことができました。
本当にありがとうございました。

*******************************
TBL_CTR = 0
REPEAT
DE_DATA=DATA_TBL[TBL_CTR]
T1_DATA=SPLIT(DE_DATA,",") //行をSPLITで分割
IF LENGTH(T1_DATA) = 0 THEN
TBL_CTR = TBL_CTR + 1
CONTINUE
ENDIF

注文ナンバー=(T1_DATA[0]) //1番先頭にいる注文番号を取りたい
部品コード=(T1_DATA[1])
部品名称=(T1_DATA[2])

注文ナンバー1= BETWEENSTR(注文ナンバー,"<#DBL>","<#DBL>") //ダブルクォーテーションを消す

DE_DATA=DATA_TBL[TBL_CTR]
IFB SCAN=注文ナンバー1
TBL_CTR=LIST
ELSE
TBL_CTR = TBL_CTR + 1
ENDIF
UNTIL TBL_CTR + 1 > LIST

No.869 2020/06/03(Wed) 09:57:55
Whileの挙動がおかしい。 / かぢゅ
while 1
 KBD(VK_F9,CLICK,400)
 IFB !CHKIMGX(ImageName, WindowID, x1, y1, x2, y2, d, td, tc)
 else
  MSGBOX("????????????????")
  break
 endif
Wend

というようなwhile処理を書いています。
画像認証自体は成功しているのですが、
認証してbreakしているにも関わらずF9キーが押されます。

速度を遅くすれば正しい動きをしますが、
400msのループでは余計にキーが押されてる状態です。

早いから止まらずもう一周しちゃうなんて、
プログラムとして致命的じゃないですか?

No.845 2020/05/31(Sun) 18:42:54

Re: Whileの挙動がおかしい。 / stuncloud
> 早いから止まらずもう一周しちゃうなんて、
> プログラムとして致命的じゃないですか?

そうですね、困りますね

僕はchkimgxを使ったことがないのでそちらを疑うということはできませんから、そこは問題ないものとします
ご質問の状況ですとmsgboxのダイアログを閉じた後にF9が押された、ということで間違いはないでしょうか
そうでなかった場合はchkimgx成功後にどのようにF9が押されたことを確認したのかを教えて下さい

それと以下のようにコードを修正した場合に現象を回避できるかも試してみてください

KBD(VK_F9,CLICK,400)
while 1
 IFB !CHKIMGX(ImageName, WindowID, x1, y1, x2, y2, d, td, tc)
  KBD(VK_F9,CLICK,400)
 else
  MSGBOX("????????????????")
  break
 endif
Wend

僕もwhileの挙動について調べてみようと思います
もし問題があった場合はumiumiさんでないと根本の解決ができませんが、コードの書き方でどうにかできるのであればそのノウハウを残しておきたいですし

# かなり前のバージョンですが、ループとtryの組み合わせで致命的な不具合があったのを思い出しますね

No.846 2020/05/31(Sun) 22:34:35

Re: Whileの挙動がおかしい。 / かぢゅ
stuncloudさん、レスありがとうございます。

結論から書くと、残念ながら変わりませんでした。
挙動としては、画像認証成功後ブレイクで処理終了するのが理想ですが、
F9キー押下→画像認証成功→アラート表示→F9キー押下となります。

アラート表示した時点で一切の処理を終了したいのです。

No.847 2020/05/31(Sun) 23:45:41

Re: Whileの挙動がおかしい。 / stuncloud
なるほど
正直なんとも言えませんね
実のところ100%かぢゅさんの勘違いだと思っているのですが、明日にでも動作を確認してみようと思います

最後に一つだけ確認したいのですが、ここに書かれたコードで現象が再現するんですよね?ほかにも色々書かれているけど端折っているということはないですよね?
もし違うなら再現するコードをください

以下は自分用メモです

おそらく状況としては
F9を押すと画面が変化する
変化した画面に対してchkimgxを行う
というようなことだと思われる

ぱっと見で正常動作しない要素はないのでchkimgxの挙動か、あるいはkbd()になにか落とし穴がある?

No.848 2020/06/01(Mon) 01:22:20

Re: Whileの挙動がおかしい。 / かぢゅ
端折っているところはあります。
下記全コードになります。

私も勘違いなのかなーと思うんですがね・・・。

------------------------------------
CALL ChkImgX.uws

in = "256.bmp"
wid = 0
x1 = 1340
y1 = 360
x2 = 1460
y2 = 400
d = 1
td = 5
tc = -1

startup_chkimgx()

KBD(VK_F9,CLICK,400)
while 1
IFB !CHKIMGX(in, wid, x1, y1, x2, y2, d, td, tc)
KBD(VK_F9,CLICK,400)
else
MSGBOX("????????????????")
break
endif
Wend
------------------------------------

1、F9キーを押して画面再描画
2、画像認証を行う
3、対象の画像があればアラートを表示し、処理終了

No.849 2020/06/01(Mon) 08:01:59

Re: Whileの挙動がおかしい。 / しろまさ
状況は少し違いますが、長押キーがスタックされ予期しない動作を起こした記憶があります。
対策は判断する直前に空のGetKeyState()を入れ、キーの記憶を解除していました。

以上を踏まえて試しに、Break直前にGetKeyState(VK_F9)を入れるとどうなりますか?

No.850 2020/06/01(Mon) 08:52:54

Re: Whileの挙動がおかしい。 / かぢゅ
結果は変わらず、F9キーが余計に押されてしまう状態ですね・・・。
No.851 2020/06/01(Mon) 12:21:37

Re: Whileの挙動がおかしい。 / しろまさ
F9は何のために押してるのかの確認です。 
KBD(VK_F9,CLICK,400) は強制的に F9 を押す命令ですが、
押した F9 はどのように作用しているのかがコードからは読み取れません。

> F9キー押下→画像認証成功→アラート表示
この文章の解釈は 「F9 を押すことで画像認識を発動させたい」ということでしょうか?
もしそうなら KBD(VK_F9,CLICK,400) ではなく

Ifb GetKeystate(VK_F9)
 IFB !CHKIMGX(ImageName, WindowID, x1, y1, x2, y2, d, td, tc)

なのかな?と思いました。

No.852 2020/06/01(Mon) 13:22:08

Re: Whileの挙動がおかしい。 / かぢゅ
とあるアプリケーションで利用します。

例えるなら
F9キーを押下することでランダムで画像が表示される。
その画像が、目的の画像だった場合のみアラートを表示させて処理を停止したい。

ということです。

目的の画像じゃなかった場合は、再度F9キーを押下したいのです。

現状は目的の画像を発見し、処理終了するものの
最後にもう一度F9キーがおされてしまい、画像が目的のものから変わってしまいます。

No.853 2020/06/01(Mon) 15:18:13

Re: Whileの挙動がおかしい。 / しろまさ
多分ですが、
?@ (誰かorUWSCにより) F9 が押される
?A UWSCの CHKIMGX() が実行される(評価はFALSE)
?B アプリ側の画像が切り替わる
?C UWSCにより F9 が押される
という順番で流れていると思われます(?B?Cの前後は未保証)

F9の後、アプリ側の画像が切り替わったら(もしくはSleep)という条件判断が無いと、
UWSCの実行が早すぎて評価が先に終わっている(もしくは2度評価されてる)のではないかと考えられます。

No.854 2020/06/01(Mon) 16:50:07

Re: Whileの挙動がおかしい。 / stuncloud
調べました
結論から言うと

コードは正常動作してるけど、受け側でF9入力の処理が余分に行われている

だと思われます

以下検証コード
https://gist.github.com/stuncloud/8f182060413cf7b4f9d43a331765a224

msgbox()が出る瞬間からその直前くらいで画像がまた変化することがありました (現象再現、頻度はわりと高め)
そのときのprintログを見るとmsgbox()を出したあとにUWSCからF9を押した形跡はありませんでした
なのでコード側が余計にkbd()を実行したわけではないと言えます

ですが、このままだと不都合なので対策を考えていきましょう

ひとまずkbd()が怪しいのかな?ということでそこをsckey()に変更してみました
するとどうやら現象が発生しない様子 (20回くらいやっても全く発生しない)
ので、ひとまずkbd()→sckey()の修正で様子を見てもらえないでしょうか

No.855 2020/06/01(Mon) 16:50:38

Re: Whileの挙動がおかしい。 / かぢゅ
while 1
 SLEEP(0.2)
 SCKEY(0,VK_F9)
 IFB !CHKIMGX(in, wid, x1, y1, x2, y2, d, td, tc)
 else
  MSGBOX("????????????????")
  break
 endif
Wend

これで思ったような挙動になるのを確認できました!
お二人とも、ありがとうございました!

No.856 2020/06/01(Mon) 17:08:47

Re: Whileの挙動がおかしい。 / stuncloud
画像名ランダム生成してたけど順番に変更していけば100%再現した…
なんにせようまくいってよかったです
kbd()とsckey()だと何が変わるんでしょうね?

No.857 2020/06/01(Mon) 17:14:15

Re: Whileの挙動がおかしい。 / しろまさ
>kbd()とsckey()だと何が変わるんでしょうね?
処理が重い(より時間が掛かる)とか?

No.858 2020/06/01(Mon) 19:27:18
token / kevens
お世話になります、以下、エラーになります、やりたことは、重複文字を消して、1つづつ取り出したいのですが、ご教示ください。

奇数 = 1,3,3,7,11,11,13,"aa","aa"
a1=Token(", ",奇数, True)
a2=Token(", ",奇数, True)
a3=Token(", ",奇数, True)
a4=Token(", ",奇数, True)
a5=Token(", ",奇数, True)
a6=Token(", ",奇数, True)

取り出したいもの
a1=1
a2=3
a3=7
a4=11
a5=13
a6=aa

No.841 2020/05/30(Sat) 19:59:54

Re: token / stuncloud
tokenは文字列を切り出すものです、なので

奇数 = "1,3,3,7,11,11,13,aa,aa"

のようにしないといけません

今回のようなケースで文字列を分割するならtokenよりsplitのほうが扱いやすいと思います
重複排除の定番はhashtblを用いた方法ですね、これに関しては過去ログにいくつかサンプルがあるはずです

No.842 2020/05/30(Sat) 22:49:01

Re: token / kevens
stuncloud様、いつも的確な回答、恐れ入ります、悩んでいたことがあっさりで、涙でそうです、ありがとうございました。
No.844 2020/05/31(Sun) 07:46:11
ファイルの中身を読み込んだテーブルの取り扱い / ながいも
連日の投稿失礼いたします。
皆様のおかげで少しずつですが完成に近づいてまいりました。
重ねて御礼申し上げます。

今回お伺いしたい内容はメモリテーブルに保存されている
CSVファイルの抜き取り方についてご助言をいただきたく思い
投稿させていただきました。
旧タイプではFOPENの戻値のFIDでCSVの行を把握し、注文番号以外の
部品名などの情報も列に+1とかすれば簡単に吸い出せました。

ところメモリテーブルに変更となると
ん?
FGET使えない?
メモリテーブルってファイルじゃないのにFOPENできませんよね?

中身のCSVをBETWEENで,ごとに抜き取るしかないのでしょうか?

**************************************************************
旧タイプ
SCAN = Input("注文番号をスキャンして下さい", "", FALSE, 200, 200)
列 = 1 //1列目に注文番号があるの1列目で検索
行 = 1
WHILE SCAN <> FGET(ID,行,列)
行 = 行 + 1
WEND
**************************************************************

**************************************************************
BETWEENタイプ
SCAN = Input("注文番号をスキャンして下さい", "", FALSE, 200, 200)
for i=0 to LIST//LISTはF_LINECOUNTで取得した最終行
SCANLINE =BETWEENSTR(DATA_TBL[i],,)//対象となる1行は取れた
next
**************************************************************

No.839 2020/05/29(Fri) 18:40:34

Re: ファイルの中身を読み込んだテーブルの取り扱い / stuncloud
csvの各行をsplit()で配列にすると扱いやすいでしょう

// 1行目の2列目の値を表示
row = split(DATA_TBL[0], ",") // 1行目なので添字は0
print row[1] // 2列目なので1

で、そういったことをやってくれるモジュールを書いてみました
メモリに格納したCSVのテーブルから、任意の行と列で値を抜き出せるようにしています
参考にしてみてください
https://gist.github.com/stuncloud/157e6a040fcde2a1a8e4195e53c4893e
Module_CSV.uwsが本体です、callして使います
Sample.uwsが実際にモジュールを使っているサンプルです
Test.csvがサンプルで読み込んでいるCSVファイルです

これをそのまま使っていただいても大丈夫ですよ
ただし厳密なCSV対応はできていないので予期せぬ結果になる場合があります

No.840 2020/05/30(Sat) 03:34:55

Re: ファイルの中身を読み込んだテーブルの取り扱い / ながいも
stuncloudさん
ありがとうございます。
早速スプリット関数なるものを使わせて頂きます。

No.843 2020/05/31(Sun) 00:01:31
テーブルという考えについてお教えください。 / ながいも
たびたびすいません。
先ほどFOPENについてご質問した際に一緒にに聞けばよかったのですがまたまた難題が。。。

CSVファイルをファイル開いたままで検索させずに、メモリテーブルに保存させ、PROCEDUREで組んだファイルのどこからでも呼び出せるようにしろと上長から言われました。
折角FOPENでわかったのに。。。と泣き言を言ってもいられないので

先ほどのFOPENの後に下記のようなものをいれると
次元数が異なるなどエラーが出てしまいます。
恐らくまた初歩的なミスなのだとおもいますがさっぱりです。
お助けいただけますようお願いいたします。


*********************************
PUBLIC LIST
PUBLIC FID
PUBLIC DATA_TBL
DIM DATA_TBL[LIST]
for i = 2 to LIST 
SETCLEAR(DATA_TBL[i])
DATA_TBL[i] = FGET(fid,i)  
next
FCLOSE(FID)
fend
for i=0 to list
print DATA_TBL[i]//ここではCSVを読める。
NEXT

Procedure 通常出荷
for i=0 to list
print DATA_TBL[i]//ん?パブリックでdata_tblって作ったのに?
NEXT
SCAN = Input("注文番号をいれて下さい", "", FALSE, 200, 200)
列 = 1 //1列目に注文番号があるの1列目で検索
行 = 1
WHILE SCAN <> FGET(DATA_TBL,行,列)//ここで次元数がと言われます。
行 = 行 + 1
IFB 行 > LIST
FUKIDASI("検索文字列はありません",50,100,0,30)
SOUND("Beep")
Exit
fend

No.833 2020/05/28(Thu) 15:10:06

Re: テーブルという考えについてお教えください。 / stuncloud
興味深い

問題点ははっきりしています
> PUBLIC DATA_TBL
> DIM DATA_TBL[LIST]

ここですね
これでpublic変数のDATA_TBLと、配列のDATA_TBL[]が別々に宣言されています(※詳細は末尾で)

なので 通常出荷() 内のDATA_TBLはpublic変数のそれになる(配列ではない)ため、次元数のエラーが出ます
配列をpublicにしておけば良いので、先程の2行を以下のように修正してください

PUBLIC DATA_TBL[LIST] // これ1行でOK

これで関数内からも配列DATA_TBL[]にアクセスできます


※ 検証コード

public hoge = "public variable"
dim hoge[] = "array"

print hoge[0] // array
fuga() // public variable

procedure fuga()
 print hoge
fend

同名の変数と配列を別々に定義できてるのがわかりますね
この仕様は知りませんでした

No.834 2020/05/28(Thu) 17:21:07

Re: テーブルという考えについてお教えください。 / ながいも
stuncloud さん
ご回答ありがとうございました。
DIM PUBLIC の混在のため次元エラーが発生していたことがわかりました。
早速修正してみたところ今度は配列エラーが出てしまいました。。。
UWSC難しすぎます。。。
とりあえず頑張ってググってみます。
次元エラーについてわかりやすい回答をいただきありがとうございました。

No.835 2020/05/28(Thu) 19:11:16

Re: テーブルという考えについてお教えください。 / しろまさ
> 配列エラーが出てしまいました。。。
解決しました?
最大数LIST個の配列はLIST番目の要素は存在しないのですよ(0番スタートの為)

No.836 2020/05/29(Fri) 13:08:33

Re: テーブルという考えについてお教えください。 / Rayna
>>835 ながいも さん

 ながいも さんのスクリプトでは
 LISTの代入部分は書かれていないので推測なのですが
 変数、定数の初期化順は以下の通りなので
  http://www3.rocketbbs.com/601/bbs.cgi?id=siromasa&mode=pickup&no=487
 そこまわりで配列エラーが起きてるかもしれないです

 例えばこんなスクリプトを書けば同じ配列宣言で違う長さの配列が出来てしまいます

  Public nUBound
  nUBound = 9
  Dim aLocal[nUBound] // 代入された 9
  Public aGlobal[nUBound] // 変数(nUBound)初期値の EMPTY を 0 と解釈

  SetClear(aLocal, "aLocal Value"); SetClear(aGlobal, "aGlobal Value") // わかりやすいように配列を埋める

  // 最大添字の確認
  //  'nUBound = 9' としているので 9 が結果として出てほしい
  Print Length(aLocal)-1 // 9
  Print Length(aGlobal)-1 // 0

  Print aLocal[1] // 読み成功 'aLocal Value' と表示
  Print aGlobal[1] // 読み失敗、範囲外を読もうとしたのでエラー

  Sleep(10)

 上記スクリプトの宣言部分は内部では次の順番で実行されています

  Public nUBound
  Public aGlobal[nUBound] // 変数(nUBound)初期値の EMPTY を 0 と解釈
  nUBound = 9
  Dim aLocal[nUBound] // 代入された 9
   ...

 グローバル変数に初期値を設定して扱うときは初期化順にも注意が必要です
 配列の要素数が自分の得たい結果になっているかどうか確認してみてください

No.837 2020/05/29(Fri) 14:24:21

Re: テーブルという考えについてお教えください。 / ながいも
しろまささん

ご回答ありがとうございます。
しろまささんのアドバイスのおかげでCSVは最大件数で1000件程度のデータのためPUBLIC DATA_TBL[2000]と変数ではなく定数を設定することでとりあえずしのぎました。

Raynaさん
Lengthなんて初めてききました。
今回はCSVのデータであったのでLISTはF_LINECOUNTで取得してましたがこのような文字数の取り方もあるんですね。
記載いただいた情報で勉強をさせていただきます。
長文でのご指南ありがとうございました。

No.838 2020/05/29(Fri) 18:06:25
fopenについてお教えください / ながいも
おせわになります。
下記のようなFOPENのプログラムでWORK_DATAというCSVファイルを開きたいのですが
DATA\というフォルダを指定するとファイルが開けません。
逆にフォルダ指定なしのTO_FILE = "C:\amazon依頼品出荷チェッカー\"だと開きます。
fopenで開けるフォルダの階層などはあるのでしょうか?


*********************************
TO_FILE = "C:\amazon依頼品出荷チェッカー\DATA\"
FILES = "WORK_DATA*"

for i=0 to GETDIR(TO_FILE, FILES,FALSE,3)-1
FID = FOPEN("<#DBL>" + GETDIR_FILES[i] + "<#DBL>")
NEXT
LIST = FGET(FID,F_LINECOUNT)
print FID
print LIST//開くファイルの行数をプリント

No.830 2020/05/28(Thu) 10:18:03

Re: fopenについてお教えください / しゅん
// 「C:\amazon依頼品出荷チェッカー\」にUWSファイルを置いているからです。
// カレントフォルダー以外のファイルを開こうとしていますので、FOPENのパス指定に注意してください。
// GETDIR_FILES[i]をPRINTしてみると良いでしょう
// あと、FOPENしたファイルは必ずFCLOSEしましょう


TO_FILE = "C:\amazon依頼品出荷チェッカー\DATA\"
FILES = "WORK_DATA*"

FID = -1
for i=0 to GETDIR(TO_FILE, FILES, FALSE, 3) - 1
  IF FID <> -1 THEN FCLOSE(FID)
  FID = FOPEN(TO_FILE + GETDIR_FILES[i])
NEXT
LIST = FGET(FID, F_LINECOUNT)
print FID
print LIST//開くファイルの行数をプリント

IF FID <> -1 THEN FCLOSE(FID)

No.831 2020/05/28(Thu) 12:07:24

Re: fopenについてお教えください / ながいも
しゅんさんへ
早速のご回答ありがとうございます。
2か月前より急にUWSCを扱う配置変更になったのですが上長があてにならないので独学で進めている中で本当に助かりました。
ありがとうございました。

No.832 2020/05/28(Thu) 13:32:04
スプレッドシート / kevens
お世話になります。
uwscで直接スプレッドシートにデータを追加したいです。
メモにあるデータをダイレクトにスプレッドシートに入力することは、できますでしょうか。
全体をペーストは、できるのですが、指定セルに入力、削除する方法、ご教授いただければと思います。

No.826 2020/05/24(Sun) 12:17:33

Re: スプレッドシート / stuncloud
google spreadsheetのことでしょうか
とりあえずそういうことで話を進めます

一番簡単なのは入力値をセルごとに<#TAB>と<#CR>で区切ってA1にペーストですかね

RowsAndCells = ""
RowsAndCells = RowsAndCells + 100 + "<#TAB>" + 200 + "<#TAB>" + 300 + "<#CR>"
RowsAndCells = RowsAndCells + 400 + "<#TAB>" + 500 + "<#TAB>" + 600 + "<#CR>"
RowsAndCells = RowsAndCells + 700 + "<#TAB>" + 800 + "<#TAB>" + 900 + "<#CR>"
sendstr(0, RowsAndCells)
sckey(id, VK_CTRL, VK_V)
// これでA1:C3にそれぞれの値がペーストされる


確実で自由度も高いのはspreadsheet APIを使うことですがいろいろ敷居が高いですね

あとは、GASを使って
1. ショートカット(Ctrl+Alt+Shift+0とか)でGASマクロを呼び出す
2. GASにpromptを出させる
3. promptに例えば「B1 500」という感じに入力
4. GAS側でB1セルに500と入力する処理を行わせる
とかするのもいいかもですね
GASがJavaScriptなのでやや敷居高いですが

No.827 2020/05/24(Sun) 17:54:03

Re: スプレッドシート / stuncloud
ペースト案の補足
"<#TAB><#TAB>" でペーストすればセルを一つスキップできますよ
これを駆使すれば狙ったとこだけデータを入れることも可能です

No.828 2020/05/24(Sun) 17:58:13

Re: スプレッドシート / kevens
stuncloud様、素晴らしいです、API、GAS、勉強してみます、ありがとうございました。
No.829 2020/05/24(Sun) 20:11:35
配列に入れる / sou
基本的なことなのだと思いますが、helpと掲示板をにらめっこしていますが、いっこうに解決できそうにないので、どうか教えてください、配列の基本について。
もし、Aの数字が、10より大きければ、配列に入れる、そうでなければ配列に入れない、で最終的に、合計したいです、helpで、見落としている、ネットでここを見るなどのご指摘でも構いません、どうぞよろしくお願いいたします。
A1=3
A2=11
A3=8

とりあえず、頑張ってみましたが、配列オーバーになります。

ifb A1 >= 10
  DIM データ[0]
else
 print "キャンセル"
endif

ifb A2 >= 10
  DIM データ[1]
else
 print "キャンセル"
endif
ifb A3 >= 10
  DIM データ[2]
else
 print "キャンセル"
endif

合計=データ[0]+データ[1]+データ[2]
print 合計

No.810 2020/05/16(Sat) 19:23:00

Re: 配列に入れる / stuncloud
最初にdimで配列サイズを決めて、ifで代入しましょう

// 冒頭に一度だけ書いておく
// サイズ3の配列を作る
dim データ[2]

// それぞれのif内で代入する処理を書いておく
データ[0] = A1
データ[1] = A2
データ[2] = A3

No.811 2020/05/16(Sat) 21:40:49

Re: 配列に入れる / stuncloud
// 僕ならこんな感じにします、参考まで

dim データ[] = 3, 11, 8

total = 0

for A in データ
 if A >= 10 then
  total = total + A
 endif
next

print total

No.812 2020/05/16(Sat) 21:46:35

Re: 配列に入れる / sou
ご教授ありがとうございます、以下でできるようですが、500コほどあります、その場合、何か、上手な方法がありますでしょうか。
dim データ[] = A1,A2,A3,,,,, 

No.813 2020/05/17(Sun) 16:28:59

Re: 配列に入れる / stuncloud
その500個ほどの数値はどこから来るんでしょうか
それ次第で様々な方法が考えられます

もしA1からA500までの変数があるというのであれば、forループとevalが使えそうです (この場合配列は使いません)
例: if eval("A" + i) >= 10 then

もし500行のテキストファイルで一行ごとに数値が書いてあるというのであれば、ファイルをすべて読み取って<#CR>でsplitすれば数値の入った配列が得られます

など

No.814 2020/05/17(Sun) 21:10:05

Re: 配列に入れる / sou
分かりやすく的確な回答おそれいります。
forで回さないと、みたいなことは、なんとなく思いましたが、その場合、やはり、配列にいれること自体が難しい形になるということでよろしいでしょうか。
生産管理で、500個ほどの数値は、エクセルのセルになります。
具体的には、セルの条件で、合計数を計算させたい、エクセル関数で難しい特殊条件でしたので、そのためには、配列が必要かと頭ふり絞って見ましたが、自分レベルで対応できず、今回、お世話になっている次第です。

No.815 2020/05/18(Mon) 06:13:22

Re: 配列に入れる / stuncloud
>forで回さないと、みたいなことは、なんとなく思いましたが、その場合、やはり、配列にいれること自体が難しい形になるということでよろしいでしょうか。
難しくはないです
わざわざ配列に入れる必要がないケースもあるよという話です

>具体的には、セルの条件で、合計数を計算させたい、エクセル関数で難しい特殊条件でしたので
条件で合計するならExcelのsumif関数あたりでできるでしょう
むしろそういった計算が得意なのがExcelなわけで…
断言しますがそれは間違いなくExcelだけでできる計算です
なので先ずはそっちでやってみてはいかがでしょうか

No.816 2020/05/18(Mon) 10:01:14

Re: 配列に入れる / しろまさ
> 具体的には、セルの条件で、合計数を計算させたい、エクセル関数で難しい特殊条件でしたので、
逆にエクセル関数 SUMIF や 配列数式 で出来ない特殊条件とはなんでしょうか?

> 参考 SUMIF  https://office-hack.com/excel/sumif/
> 参考 配列数式 http://office-qa.com/Excel/ex69.htm

No.817 2020/05/18(Mon) 16:26:13

Re: 配列に入れる / sou
申し訳ございません、伝え方がまずかったようです。
関数で難しい特殊条件とは、そのシート自体が、別ネットワークにあり、そこは、時間ごと、随時、数字、カラーが動きます、また、そのシートに手を加えたくありません、そこから、各チームのpcに、別条件で随時、読み込み計算させる必要があるため、シートに関数やマクロを入れることは、難しい、しかも、読み込む各チームPCは、エクセルあるなし、バージョン違いがあります。
初心者レベルですので、難しい内容は理解できませんが、もしも、セルの色が赤であったなら、配列に入れる、ということを教えていただければ助かります。
ifとPEEKCOLORは、なんとなくわかりますが、もしも⇒配列に入れるが、さっぱりわかりません。

No.818 2020/05/18(Mon) 18:20:09

Re: 配列に入れる / しゅん
UWSCでやろうとしていますが、Excelはある前提で良いのですよね。
(PEEKCOLORでやるなら、Excelで開けているのでしょうから)

どう考えてもExcelマクロでやるべきです。
Excel VBAの質問ができるところで質問してください。

Excelマクロは、対象のエクセルファイルに書く必要はありません。
Excelマクロは、開いているファイルに対しても実行できます。
色で対象セルを決定したいだけのようですので、ほぼExcelのバージョンは関係ありません。(Office代替であっても、それほど大きく変わりません)
UWSCでどうしてもやりたいのであれば、とめはしませんが、、、。

No.819 2020/05/18(Mon) 19:49:33

Re: 配列に入れる / sou
Excelは、受け側にある前提ではないです、受け側は、エクセルない場合、Open OfficeやLibre Office、kings等と代替なります、もしも⇒順番に配列に入れる
のuwscでの基本の型を知りたいです。
ifb データ >= 10 then
dim データ[] = A1,A2,A3,,,,, 

No.820 2020/05/18(Mon) 22:36:33

Re: 配列に入れる / stuncloud
> Excelは、受け側にある前提ではないです、受け側は、エクセルない場合、Open OfficeやLibre Office、kings等と代替なります
souさん以外の方も完成したスクリプトを使うんでしょうか?
しかしそれらすべてに対応するのを作るのはかなり難しいでしょうから、ひとまずsouさんの環境で動くものを目指しましょう
そこはExcelが動くと考えていいですね?

Excelが使えるならしゅんさんの仰る通りマクロ用のExcelファイルをローカルに作っておいて、そのマクロを対象ファイルに対して使うのが一番楽です

…なんですが、どうしてもUWSCを使いたい場合は以下を読んでください

> uwscでの基本の型を知りたいです
基本となるものは提示済みです
あとは元のExcelファイルから値を取り出して
変数なり配列なりに代入するだけです
似たような事例が掲示板の過去ログから見つけられると思うのでそちらを参考にされても良いでしょう

それとちょっと厳しいことを書きます
これまでのsouさんの受け答えを見るに、今後も似たような質問が続くようですと正直これ以上は回答できないです
(それはなぜかと言うと、今のところこちらから何を提示してもあなたはほぼ同じ内容の質問しかしないからです、なのでもう答えることがなくなります)

一旦自分なりにコードを書いてみてください
まずはExcelのことは忘れて、スクリプト上に用意した配列で望みの計算を行うものを書く
次は、Excelから必要なデータを抽出するだけのスクリプトを書く
そして、それらを組み合わせたスクリプトを書く

それらを書く中でいよいよわからなくなったら、そのときに改めて質問をしてみてください (新しいスレッドで構いません)
その際は
・どのようなコードを書いたか
・その中でどの点がうまく行かないか
に絞って質問してください
後から情報を小出しするようなことも避けてください

長くなりましたが僕からは以上です
健闘を祈ります!

No.821 2020/05/19(Tue) 03:43:23

Re: 配列に入れる / しろまさ
// もしも⇒順番に配列に入れる のみに返答(uwscでの基本の型かどうかは?)
dim 配列[0] // 宣言が先
For i = 0 To 5
  データ = GetTime()
  ifb データ >= 10 then // もしも
    配列[ReSize(配列, Length(配列))-1] = データ // 順番に配列に入れる
  endif
  Sleep(1)
Next
MsgBox( Join(配列, "<#CR>") ) // 表示

No.822 2020/05/19(Tue) 15:33:37

Re: 配列に入れる / sou
基本となるものは提示済み、stuncloudさんのおっしゃる通りです、並べればできました、
A1=3
A2=11
A3=8
dim データ[2]
// それぞれのif内で代入する処理を書いておく
データ[0] = A1
データ[1] = A2
データ[2] = A3
ifb A3 >= 10
 dim データ[2]
else
 print "キャンセル"
endif
合計=データ[0]+データ[1]+データ[2]
print 合計
後から情報を小出しするようなことも避けてください、おっしゃる通りです。
教えていただく立場から、最初からこれこれこれで、これこれとは言いにくいことあります、理解納得できませんでしょう、お許しいただければと思います。
500あるとお伝えしましたが、数字は、順次、変更、一定でありません。
単純合計数でなく、もちろん、多くの方が利用できるよう、QRコードに変換、画面表示までさせるつもりです、茨の道ですが、、ここまで優しく回答いただいたこと、深く感謝いたします。
みかねて、掲示板管理人自らのご指導ありがとうございます。
以下が、理解できません、ReSizeがないと、エラーになりますが、このReSize
が、配列helpの一番上にあるということは、たぶん、基本の基だと思いますが、
umiumiさんの代わりに、どなたか、解説説明いただければ、助かります。
配列[ReSize(配列, Length(配列))-1] = データ // 順番に配列に入れる

No.823 2020/05/20(Wed) 07:01:06

Re: 配列に入れる / しろまさ
// 配列の状態と何処に入力しているのかを把握するために冗長に書き直しました。
// 理想は nMax にデータを入れるべきなのですが、表示省略のために許容しています。

データ = "12345"

Dim 配列[0] // 宣言
MsgBox( "上限値 = "+ ReSize(配列) + "<#CR>要素数 = "+ Length(配列) )

Dim nMax = ReSize(配列, Length(配列))
MsgBox( "上限値 = "+ ReSize(配列) + "<#CR>要素数 = "+ Length(配列) )

Dim nWrite = nMax - 1
配列[nWrite] = データ // 代入(最後から1つ手前にデータを入れている)

MsgBox( 配列[nWrite] ) // 表示

// 他にも 文字連結後SplitでSafeArrayを扱う方法、連想配列(HashTbl)を扱う方法等があります。
// 後はヘルプと試行錯誤で成長してください。

No.824 2020/05/20(Wed) 09:15:53

Re: 配列に入れる / stuncloud
> 教えていただく立場から、最初からこれこれこれで、これこれとは言いにくいことあります、理解納得できませんでしょう、お許しいただければと思います。
勘違いされているようですが、質問の内容を絞れば後出しの必要もなくなるということです
コードを書いている最中でわからないことがあったら、その点のみで質問をしてくださいということです
それに対しての回答が得られわからなかったことが解消すれば、またコードを書きすすめることができます

> 500あるとお伝えしましたが、数字は、順次、変更、一定でありません。
はい、それはすでに聞いています
計算対象の数値群は500くらいだろうと100くらいだろうと関係なく、その都度それらの数値をまとめてコード上で扱えるようにしましょうね、という話をしてきていたつもりです

> 単純合計数でなく、もちろん、多くの方が利用できるよう、QRコードに変換、画面表示までさせるつもりです、茨の道ですが、、
後出しとはこれです
これはQRコードについての情報を得たいという裏返しに見えます
もちろんそれについて答えることもできます、できますが、今は必要ありません
まだその段階ではないからです

いいですか、なんでもかんでも一度にやろうとは思わないでください、できるわけがないので
(僕だってできません)
一つ一つ課題を片付けていってください
そうでなくとも
・条件に応じて計算する
・Excelから数値を取得する
・Excelから計算の条件を得る
などすでに課題が山積みなのです
ひとつひとつやってください

とにかくコードを書いてください
これ以上何を言ってもあなたの望む答えそのものは出てきません
それはあなたが書くしかないのです

> A1=3
> A2=11
> A3=8
> dim データ[2]
> // それぞれのif内で代入する処理を書いておく
> データ[0] = A1
> データ[1] = A2
> データ[2] = A3
> ifb A3 >= 10
>  dim データ[2]
> else
>  print "キャンセル"
> endif
> 合計=データ[0]+データ[1]+データ[2]
> print 合計


ちなみにこれでは何もできていません
ほしいのは 11 のはずなのに 22 になりますよね
> // それぞれのif内で代入する処理を書いておく
とはこういうことです

dim データ[2]

ifb A1 >= 10
 データ[0] = A1
else
 print "キャンセル"
endif

ifb A2 >= 10
 データ[1] = A2
else
 print "キャンセル"
endif

ifb A3 >= 10
 データ[2] = A3
else
 print "キャンセル"
endif

合計=データ[0]+データ[1]+データ[2]
print 合計

ですがこのままだとA500まであった場合どうするのだ?ということになりかねないですよね
そういった部分を試行錯誤してみてください、どうしてもだめならまた聞いてください
そのようにしてまずはこの計算に関わる部分をしっかり作ってみてください

長くなっちゃいましたが以上です!
がんばってね!

No.825 2020/05/20(Wed) 14:36:55

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

- HOME - お知らせ(3/8) - 記事検索 - 携帯用URL - フィード - ヘルプ - メール - 環境設定 -

- Skin: Modern v2.0 - Author: ロケットBBS -

Rocket Board Type-X (Free) Rocket BBS