[ 掲示板に戻る ]

過去ログ閲覧モード

画像を数値に変換したい2 / ぶく
昨日はありがとうございます。
ただ、いろんなOCRを試したのですが、どれもいまいちよくわかりませんでした。
エクセルでA列に画像を貼り付け、B列にその画像に対応する数値を入力して、
UWSCでその数値を用いて作業させたいのですが、可能でしょうか?
可能ならばどんなコマンドになりますか?



--|A|B
01|イ.bmp|1
02|ロ.bmp|2

No.4816 2017/12/12(Tue) 15:26:30

Re: 画像を数値に変換したい2 / stuncloud
おそらく可能です

画像の貼り付けに関しては
・Excelへ画像を挿入
・挿入した画像がセルにフィットするようにプロパティを設定する
というような操作を行うことになるのではないかと
このあたりはExcelVBAで画像を挿入するサンプルを探されると良いかと思います

あとはOCRで画像から読み取られた文字列をB列に入力するだけです

> どれもいまいちよくわかりませんでした
サンプルは試されたのでしょうか
なにを試してどのようにわからなかったのかを書かれると回答されやすくなると思います

No.4818 2017/12/12(Tue) 16:14:47
マウス移動をキーボード入力に置き換え / たかし
お忙しいところしつれいします。

マウスの移動をゲームで転用したく
マウスが上にいったらW入力
下はs
左はA右はD
といった置き換え入力は可能でしょうか?

No.4810 2017/12/11(Mon) 21:57:42

Re: マウス移動をキーボード入力に置き換え / stuncloud
可能です

定期的にマウス座標を保存しておき、現在のマウス座標と保存したマウス座標を比較して変化があればその方向に応じてキーを送信する、という方法が考えられます
マウス座標監視ループの間隔やマウスカーソルが移動したと判定する閾値などは色々試してしっくりくるものを探してください
もしマウス自体の操作を画面上に反映させずにキー入力に変換する、というのが希望でしたらこの方法ではムリです

No.4813 2017/12/12(Tue) 09:53:33
画像を数値に変換したい / ぶく
画像を数値に変換して読み込める方法はありますか?
No.4807 2017/12/11(Mon) 14:15:40

Re: 画像を数値に変換したい / satocha
OCRを使えばいいです。サンプルページの57番を見てください
http://www.uwsc.info/sample.html#N57

No.4808 2017/12/11(Mon) 16:01:50
海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
海外の重複を削除して数字の25と10を合計した結果を出力して
ソートで並び替える方法ないでしょうか?
自分が考えたのがtokenとifと配列を使えばいけそうな気がするのですが、コードが思いつきません。お力を貸して頂けないでしょうか?

[元]
関東:322
関西:99
東海:30
海外:25
海外:10
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1

[希望処理]
関東:322
関西:99
海外:35
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1

No.4770 2017/12/04(Mon) 12:52:26

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
元が下記の場合でできました。
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
イギリス,欧州,北米,南米,インド:25
シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10

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


call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws

file="C:\Users\aruke\Desktop\1.txt"
search="イギリス,欧州,北米,南米,インド:"
search1="シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:"
file1="C:\Users\Desktop\a.txt"

fid=fopen(file, F_read or F_WRITE)
gyou=fget(fid,-1)
for i = 1 to gyou
naiyou=fget(fid,i)
if pos(search,naiyou) then
a=pos(":",naiyou)
b=copy(naiyou,a+1)
elseif pos(search1,naiyou) then
a1=pos(":",naiyou)
b1=copy(naiyou,a1+1)
endif
next
goukei=val(b)+val(b1)

for i = 1 to gyou
naiyou=fget(fid,i)
if pos(search,naiyou) then
FDELLINE(fid,i)
elseif pos(search1,naiyou) then
endif
next

for i = 1 to gyou
naiyou=fget(fid,i)
if pos(search1,naiyou) then
FDELLINE(fid,i)
endif
next
fput(fid,"海外:"+goukei)

zen=fget(fid,-2)
zen=COMMON.sort1(zen)
COMMON.Write_ALLText(file1,zen)

No.4775 2017/12/05(Tue) 11:23:35

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / Liners
自己解決という事で良いのかな?
No.4776 2017/12/05(Tue) 13:45:40

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / しゅん
// 解決済みっぽいですけど、私ならという例を。

OPTION EXPLICIT

TEXTBLOCK data
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
イギリス,欧州,北米,南米,インド:25
シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10
ENDTEXTBLOCK

// 文字列からデータ取り出しと重複を考慮した加算処理
// データの保持形式がこんなでなければ、もうちょっと簡単にかけるかも
// 別ファイルの場合、FGETのF_ALLTEXTあたりで全体読み込めばOKかな
DIM oc[] = "関東;関西;東海;中国;北海道;四国;九州,沖縄;東北", "海外"
DIM reg = CREATEOLEOBJ("VBScript.RegExp")
reg.Pattern = "(([^:]*):(\d*)(?:\r\n|$))"
reg.Global = TRUE
HASHTBL dup
DIM m, key
FOR m IN reg.Execute(data)
  key = m.SubMatches(1)
  IF !POS(key, oc[0]) THEN key = oc[1]
  dup[key] = dup[key] + VAL(m.SubMatches(2))
NEXT

// ソート準備
DIM i, n = LENGTH(dup) - 1, keys[n], vals[n]
FOR i = 0 TO n
  keys[i] = dup[i, HASH_KEY]
  vals[i] = dup[i, HASH_VAL]
NEXT

// ソート
// 安定ソートじゃないけどね
// 安定ソートにしたかったら、http://d.hatena.ne.jp/junjun777/20150611/uwsc_stable_sort
QSORT(vals, QSRT_D, keys)

// 結果出力
FOR i = 0 TO LENGTH(keys) - 1
  MSGBOX(keys[i] + ":" + vals[i])
NEXT

No.4778 2017/12/05(Tue) 20:53:16

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
Liners様、解決はできましたが今後の為にもっと簡潔なコードで書けるようなら教えて頂きたいです。
No.4779 2017/12/06(Wed) 10:47:17

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
しゅん様、返信ありがとうございます。希望通りの処理ができました。

今の私の実力では下記の処理がどういう意味合いかが理解できません。
自分なりの解釈してみたのですが分からない所があります。

oc[]の配列[0]が"関東;関西;東海;中国;北海道;四国;九州,沖縄;東北"、配列[1]が"海外"になっている。
forinと正規表現でm.SubMatches(1)で関東:322からシンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10までを変数keyにいれて、!POS(key, oc[0])のコードの意味は各行のデータが"関東;関西;東海;中国;北海道;四国;九州,沖縄;東北"になければ"海外"を変数keyにいれる

下記のコードの意味が分かりません。
dup[key] = dup[key] + VAL(m.SubMatches(2))

No.4780 2017/12/06(Wed) 11:24:37

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / Liners
私的「簡素感」で書きます。基本、代入のみです♪
しゅんさんと同じですが、解説用に標準機能のみで変数に漢字を使います。


TEXTBLOCK 元データ
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
イギリス,欧州,北米,南米,インド:25
シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10
ENDTEXTBLOCK

海外置換後 = replace(元データ, "イギリス,欧州,北米,南米,インド", "海外")
海外置換後 = replace(海外置換後, "シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア", "海外")
hashtbl 連想配列

For 行内容 in Split(海外置換後, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] = 連想配列[地域] + val(行内容) //各地域ごとの数量が加算される
Next
dim 配列上限 = length(連想配列) -1, 希望データ[配列上限], 数値[配列上限]

For i = 0 to 配列上限
  数値[i] = 連想配列[i, HASH_VAL]
  希望データ[i] = 連想配列[i, HASH_KEY] + ":" + 数値[i]
Next
qsort(数値, QSRT_D, 希望データ)
SLCTBOX(SLCT_LST, 0,"配列内容", 希望データ)

No.4781 2017/12/06(Wed) 15:48:03

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / しゅん
Linersさんの回答の方が、標準機能ですし、シンプルなので良いと思いますが、一応回答しておきます。

> oc[]の配列[0]が"関東;関西;東海;中国;北海道;四国;九州,沖縄;東北"、配列[1]が"海外"になっている。

海外変換用の配列です。
配列を使うのが適切かと言われると、不適切かもしれませんが、まとめたかったのでこうしました。
サンプルデータでは「海外」が固定のようですが、国内以外を海外にした方がよかろう、という考えから、国内をセミコロン区切りで確保し、その中に一致しないものは「海外」に置き換えるため、用意した次第です。


> forinと正規表現でm.SubMatches(1)で(以下略)

for-in構文で、mは「関東:322」〜「シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10」にマッチします。
m.SubMatches(0)は正規表現の一番左の括弧に対応、すなわち最初は「関東:322」に一致。
m.SubMatches(1)は正規表現の二番目の括弧に対応、すなわち最初は「関東」に一致。
m.SubMatches(2)は正規表現の二番目の括弧に対応、すなわち最初は「322」に一致。
一旦、keyに「関東」を入れて、oc[0]を探すと「関東」はあるので、keyはそのまま。
で、続いて、、、

> 下記のコードの意味が分かりません。
> dup[key] = dup[key] + VAL(m.SubMatches(2))


に入り、連想配列dupの「関東」のキーに「322]を数値かして加算する、ということです。
連想配列がどういうものか、というのを調べられることをオススメします。

No.4785 2017/12/06(Wed) 18:44:32

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
Liners様、回答ありがとうございます。Liners様のコードを見て勉強させた頂いたのですが、連想配列難しいですね。

数値[i] = 連想配列[i, HASH_VAL]の連想配列[i, HASH_VAL]を  希望データ[i] = 連想配列[i, HASH_KEY] + ":" + 連想配列[i, HASH_VAL]にした場合、海外:35がソートされない。

TEXTBLOCK 元データ
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
イギリス,欧州,北米,南米,インド:25
シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10
ENDTEXTBLOCK

海外置換後 = replace(元データ, "イギリス,欧州,北米,南米,インド", "海外")
海外置換後 = replace(海外置換後, "シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア", "海外")
hashtbl 連想配列

For 行内容 in Split(海外置換後, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
// msgbox(行内容)
// msgbox("地域"+地域)
// msgbox(連想配列[地域])
//   連想配列[地域] = val(行内容) //
  連想配列[地域] = 連想配列[地域] + val(行内容) //各地域ごとの数量が加算される
Next
dim 配列上限 = length(連想配列) -1, 希望データ[配列上限], 数値[配列上限]

For i = 0 to 配列上限
  希望データ[i] = 連想配列[i, HASH_KEY] + ":" + 連想配列[i, HASH_VAL]
Next
qsort(数値, QSRT_D, 希望データ)
for i in 希望データ
print i
next
pid = getid(GET_LOGPRINT_WIN)

text = getstr(pid, 1, STR_ACC_EDIT)

SENDSTR(0,text)

LOGPRINT(FALSE)

結果
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
海外:35
---------------------
Liners様の回答はうまくソートされている。

TEXTBLOCK 元データ
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
イギリス,欧州,北米,南米,インド:25
シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10
ENDTEXTBLOCK

海外置換後 = replace(元データ, "イギリス,欧州,北米,南米,インド", "海外")
海外置換後 = replace(海外置換後, "シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア", "海外")
hashtbl 連想配列

For 行内容 in Split(海外置換後, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] = 連想配列[地域] + val(行内容) //各地域ごとの数量が加算される
Next
dim 配列上限 = length(連想配列) -1, 希望データ[配列上限], 数値[配列上限]

For i = 0 to 配列上限
  数値[i] = 連想配列[i, HASH_VAL]
  希望データ[i] = 連想配列[i, HASH_KEY] + ":" + 数値[i]
Next
qsort(数値, QSRT_D, 希望データ)
for i in 希望データ
print i
next
pid = getid(GET_LOGPRINT_WIN)

text = getstr(pid, 1, STR_ACC_EDIT)

SENDSTR(0,text)

LOGPRINT(FALSE)

結果
関東:322
関西:99
海外:35
東海:30
中国:4
九州,沖縄:2
四国:2
北海道:2
東北:1
---------------------
  連想配列[地域] = 連想配列[地域] + val(行内容)の連想配列[地域]には25が入っている。

TEXTBLOCK 元データ
関東:322
関西:99
東海:30
中国:4
北海道:2
四国:2
九州,沖縄:2
東北:1
イギリス,欧州,北米,南米,インド:25
シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア:10
ENDTEXTBLOCK

海外置換後 = replace(元データ, "イギリス,欧州,北米,南米,インド", "海外")
海外置換後 = replace(海外置換後, "シンガポール,マレーシア,インドネシア,中国,香港,韓国,アジア", "海外")
hashtbl 連想配列

For 行内容 in Split(海外置換後, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] =val(行内容) //各地域ごとの数量が加算される
Next
dim 配列上限 = length(連想配列) -1, 希望データ[配列上限], 数値[配列上限]

For i = 0 to 配列上限
  数値[i] = 連想配列[i, HASH_VAL]
  希望データ[i] = 連想配列[i, HASH_KEY] + ":" + 数値[i]
Next
qsort(数値, QSRT_D, 希望データ)
for i in 希望データ
print i
next
pid = getid(GET_LOGPRINT_WIN)

text = getstr(pid, 1, STR_ACC_EDIT)

SENDSTR(0,text)

LOGPRINT(FALSE)

連想配列[地域] =val(行内容)にすると、
結果、海外が10で25が入っていない。

関東:322
関西:99
東海:30
海外:10
中国:4
九州,沖縄:2
四国:2
北海道:2
東北:1
--------------------

連想配列の単純化した使用例参考

[連想配列の使用例]
// パブリック、大・小文字区別しない、キーは書込み順
PUBLIC HASHTBL B
// 大・小文字区別、キーはソート
HASHTBL A = HASH_CASECARE or HASH_SORT
A["あ"] = 1
A["う"] = 3
A["お"] = 5
A["え"] = 4
A["い"] = 2
A["お"] = 9
// "う"の値は何?
print "'う' の値は " + A["う"]
// "え"があれば削除
ifb A["え", HASH_EXISTS]
 // 必要無くとも変数で受ける
 flg = A["え", HASH_REMOVE]
endif
// ソート順で表示 (文字型での昇順ソート)
for n = 0 to Length(A)-1
 print A[n, HASH_KEY] + " = " + A[n, HASH_VAL]
next

No.4793 2017/12/09(Sat) 12:29:12

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
しゅん様、返信ありがとうございます。正規表現の質問になってしまって恐縮ですが、ずっと考えていてなかなか解釈に難航しています。
([^:]*):(\d*)(?:\r\n|$)部分をSubMatches(0)と考える。そしてSubMatches(1)は([^:]*)の部分、SubMatches(2)は(\d*)の部分という考え方も合っていますでしょうか?質問ばかりで申し訳ないですが、(?:\r\n|$)の意味は、?は直前の文字の0または1回にマッチ、\nは改行にマッチ、\r キャリッジリターン(行頭復帰)にマッチ、|は複数の文字列を1つの正規表現にまとめ、そのうちのいずれかにマッチ、$は行末にマッチという意味で合っていますでしょうか?

No.4794 2017/12/09(Sat) 13:33:03

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
まとめてみました。

共通
forinで連想配列にデータ挿入
fornextで連想配列からデータ読み出し
 // 順列読出し
 変数[順列番号, HASH_KEY]     // キーを返す
 変数[順列番号, HASH_VAL]     // 値を返す



しゅん様のソース
正規表現のサブマッチを使い:の左側、右側をそれぞれ抽出。


Liners様のソース
tokenを使い:の左側取得、token後は
行内容は右側の取得可能になるのを利用。

No.4795 2017/12/09(Sat) 14:05:22

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / Liners
>連想配列難しいですね。
多くの人が最初はそう思うものです。一次元だけだし、ソートはしにくいし、ループも回しにくい。こんなの意味あるの?

しかし、先人達は比較的初期の段階でこの機能を実装しました。今では、ほとんどの言語が実装している重要な機能です。
にもかかわらず、効果的な例はなかなか見ないですね。使える人には、当たり前すぎて初心者には、馴染みがないのです。

話を戻して、連想配列[地域] =val(行内容)にすると、結果、海外が10で25が入っていない。
連想配列は、引数が数字以外も使える配列なので、迷ったら普通の配列に置換えて考えると良いですよ。

A[0] = 25
A[0] = 10 // 結果:10

A[0] = A[0] + 25 // 最初は25
A[0] = A[0] + 10 // 結果: 35


今回の例は、連想配列が持つ「潜在能力」のほんの一例です。
参考URL: https://ja.wikipedia.org/wiki/%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97

考えてみると、私たちは、多くの物を番号ではなく名前で呼びます。そのくらい応用範囲は広がります。

No.4796 2017/12/09(Sat) 17:27:50

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / せきしんご
Liners様、今回の連想配列のコードは連想配列の可能性を感じさせてくれるものでした、ありがとうございます。自分なりに提示頂いた回答を解釈しているのですが、以下の解釈であってますでしょうか?

Aの配列0に25を代入、Aの配列0に10を上書きしている
A[0] = 25
A[0] = 10 // 結果:10

Aの配列0に25を代入、Aの配列0の25と10を足してA[0]は35になる
A[0] = A[0] + 25 // 最初は25
A[0] = A[0] + 10 // 結果: 35


連想配列[地域] = 連想配列[地域] + val(行内容)の連想配列[地域] には25が入っている。この連想配列[地域]の意味はhashtbl 連想配列の連想配列と、地域 = token(":", 行内容)の地域を利用している。意味合いとしては、A["あ"] = 1みたいな使い方をしているという解釈であってますでしょうか?

//
For 行内容 in Split(海外置換後, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] = 連想配列[地域] + val(行内容) //各地域ごとの数量が加算される
Next

---------------------
(連想配列例)
HASHTBL A = HASH_CASECARE or HASH_SORT
A["あ"] = 1
A["う"] = 3
A["お"] = 5
A["え"] = 4
A["い"] = 2
A["お"] = 9

No.4797 2017/12/09(Sat) 19:54:01

Re: 海外の重複を削除して数字の25と10を合計した結果を出力してソート / しゅん
> ([^:]*):(\d*)(?:\r\n|$)部分をSubMatches(0)と考える。そしてSubMatches(1)は([^:]*)の部分、SubMatches(2)は(\d*)の部分という考え方も合っていますでしょうか?

あっています。

> 質問ばかりで申し訳ないですが、(?:\r\n|$)の意味は、?は直前の文字の0または1回にマッチ、\nは改行にマッチ、\r キャリッジリターン(行頭復帰)にマッチ、|は複数の文字列を1つの正規表現にまとめ、そのうちのいずれかにマッチ、$は行末にマッチという意味で合っていますでしょうか?

だいたい良いです。
すみません、あんまり意味ないのに「(?:」を使ってしまいました。
「(」に続き「?:」と書いた場合、キャストしない、という特別な意味になります。
キャストしない、というのは、SubMatchesに加えない、とほぼ等価です。
今回の場合「(([^:]*):(\d*)(?:\r\n|$))」と括弧でくくられる部分は4つあります。
しかし、SubMatchesは0〜2の3つしかありません。
「?:」をとると、最後の改行をとってくるので、SubMatches(3)まで格納されます。
他はその通りです。
「(\r\n|$)」は、Windows標準の改行、または、文末に一致する正規表現です。

No.4805 2017/12/11(Mon) 09:09:14
a会社を基準とした地域名でb会社、c会社の地域名の数の表作成 / せきしんご
a会社を基準とした地域名でb会社、c会社の地域名の数の表作成
a会社を基準としてb会社、c会社をまとめた1つの表を作成したいのですが、a会社基準の地域名を基準としてb会社、c会社の地域名もa会社基準の同じ地域名のb会社、c会社の数字をいれたいのですがうまくいきません。

例えば、a会社基準の中国・四国:114だとb会社の中国・四国:6、c会社の中国・四国:44を<TD></TD>にいれる方法ないでしょうか?


a会社基準

関東:2195
関西:511
中部・東海:327
中国・四国:114
九州・沖縄:78
北海道:37
東北:30
海外:21
---------------------
b会社

関東:322
関西:99
海外:35
中部・東海:30
中国・四国:6
北海道:2
九州,沖縄:2
東北:1
---------------------
c会社

関東:963
関西:254
中部・東海:160
九州:58
中国・四国:44
北海道:30
東北:28
海外:25
---------------------
[コード]


//変動
kaisya="a会社基準"
kaisya1="b会社"
kaisya2="c会社"
//変動

search=":"

a1="C:\Users\Desktop\スクレイピング\"
出力ファイル=a1+kaisya+"ト.txt"
出力ファイル1=a1+kaisya1+"fj.txt"
出力ファイル2=a1+kaisya2+"sk1.txt"
表_file=a1+"tesu\"+kaisya+"_"+kaisya1+"_"+kaisya2+"_a.txt"

hai_sea1(出力ファイル1,search)//searchの右側を配列挿
hai_sea2(出力ファイル2,search)//
resize(配列2,resize(配列))
// print "配列2サイズ"+resize(配列2)

表作成1(出力ファイル,出力ファイル1,出力ファイル2,表_file,kaisya,kaisya1,kaisya2)

procedure 表作成1(出力ファイル,出力ファイル1,出力ファイル2,表_file,kaisya,kaisya1,kaisya2)
call C:\Users\Desktop\ショットカット構文一覧\00_共通化.uws

//基準会社のソート済みのファイル
Dim res = COMMON.Read_ALLText(出力ファイル)

//比較したいのソート済みのファイル
Dim res1 = COMMON.Read_ALLText(出力ファイル1)


dim i=0
d=COMMON.gyou(出力ファイル)
// print "行数は"+d
fid=fopen(出力ファイル,F_READ)
resize(c2, d+20)
resize(c3, d+20)


for i = 1 to d
nai=fget(fid,i)
c2[hi]=token(":",nai)

c3[hi]=token(":",nai)
hi=hi+1
next
fclose(fid)

COMMON.hai_sizeawaseru(c2)



if resize(c2)<resize(配列) then
resize(c2,resize(配列))
else
resize(配列,resize(c2))
endif


html = "<table class=<#DBL>table<#DBL>>"

html = html + "<#CR>" + "<caption>【数】</caption>"
html = html + "<#CR>" + "<thead>"
html = html + "<#CR>" + "<tr>"
html = html + "<#CR>" + "<th>求人数(件数)</th>"



for y = 0 to d-1//列のエージェント名4列
 html = html + "<#CR>" + "<TH>" + c2[y]+ "</TH>" //----- 1行目は見出し
next
html = html + "<#CR>" + "  </TR>"
html = html + "<#CR>" + " </THEAD>"
html = html + "<#CR>" + " <TBODY>"

//1つ目会社
html = html + "<#CR>" + "<tr>"
html = html + "<#CR>" + "<td>"+kaisya+"</td>"
for i = 0 to d-1
 html = html + "<#CR>" + "<TD>" + c3[i]+ "</TD>" 
next
html = html + "<#CR>" + "  </tr>"

//2つ目会社
html = html + "<#CR>" + "<tr>"
html = html + "<#CR>" + "<td>"+kaisya1+"</td>"
for i = 0 to resize(配列)
 html = html + "<#CR>" + "<TD>" +配列[i]+ "</TD>" 
next
html = html + "<#CR>" + "  </tr>"


//3つ目会社
html = html + "<#CR>" + "<tr>"
html = html + "<#CR>" + "<td>"+kaisya2+"</td>"
for i = 0 to resize(配列2)
 html = html + "<#CR>" + "<TD>" +配列2[i]+ "</TD>" 
next
html = html + "<#CR>" + "  </tr>"


html = html + "<#CR>" + " </TBODY>"
html = html + "<#CR>" + "</TABLE>"

html=chgmoj(html,"<TD></TD>","<TD>0</TD>")
COMMON.Write_ALLText(表_file,html)
fend

procedure hai_sea1(出力ファイル1,search)//fileは読込ファイル
public 配列[-1]
call C:\Users\Desktop\ショットカット構文一覧\共通化.uws

Dim res = COMMON.Read_ALLText(出力ファイル1)
Dim res1 = COMMON.gyou(出力ファイル1)

gyou_1=1

fid=fopen(出力ファイル1,F_READ)
resize(配列, res1-1)
for i = 0 to res1-1
b=fget(fid,gyou_1)
c=pos(search,b)
配列[i]=copy(b,c+1)
gyou_1=gyou_1+1
next
fend

procedure hai_sea2(出力ファイル2,search)//fileは読込ファイル
public 配列2[-1]
call C:\Users\aruke\Desktop\ショットカット構文一覧\共通化.uws

Dim res = COMMON.Read_ALLText(出力ファイル2)
Dim res1 = COMMON.gyou(出力ファイル2)

gyou_1=1

fid=fopen(出力ファイル2,F_READ)
resize(配列2, res1-1)
for i = 0 to res1-1
b=fget(fid,gyou_1)
c=pos(search,b)
配列2[i]=copy(b,c+1)
gyou_1=gyou_1+1
next
fend
---------------------
[出力結果]

<table class="table">
<caption>【aaa】</caption>
<thead>
<tr>
<th>bbbb</th>
<TH>関東</TH>
<TH>関西</TH>
<TH>中部・東海</TH>
<TH>中国・四国</TH>
<TH>九州・沖縄</TH>
<TH>北海道</TH>
<TH>東北</TH>
<TH>海外</TH>
  </TR>
 </THEAD>
 <TBODY>
<tr>
<td>a会社基準</td>
<TD>2195</TD>
<TD>511</TD>
<TD>327</TD>
<TD>114</TD>
<TD>78</TD>
<TD>37</TD>
<TD>30</TD>
<TD>21</TD>
  </tr>
<tr>
<td>b会社</td>
<TD>963</TD>
<TD>254</TD>
<TD>160</TD>
<TD>58</TD>
<TD>44</TD>
<TD>30</TD>
<TD>28</TD>
<TD>25</TD>
  </tr>
<tr>
<td>c会社</td>
<TD>322</TD>
<TD>99</TD>
<TD>35</TD>
<TD>30</TD>
<TD>6</TD>
<TD>2</TD>
<TD>2</TD>
<TD>1</TD>
  </tr>
 </TBODY>
</TABLE>

No.4798 2017/12/09(Sat) 20:41:00

Re: a会社を基準とした地域名でb会社、c会社の地域名の数の表作成 / Liners
両方とも合っています。難しく考えることはありません。単に引数(添え字)に文字列が使えるというだけのの事です。
No.4800 2017/12/09(Sat) 22:14:41

Re: a会社を基準とした地域名でb会社、c会社の地域名の数の表作成 / Liners
間違えました。上記はNo.4797の返信です。
No.4801 2017/12/09(Sat) 22:19:45

Re: a会社を基準とした地域名でb会社、c会社の地域名の数の表作成 / Liners
ざっくりで、検証もしていませんが[検証できない]、各会社を連想配列に入れて、地域名で呼び出せばよいのでは?

html = html + "<#CR>" + "<TD>" + A会社[c2[i]] + "</TD>"  // こんな感じで。

No.4802 2017/12/09(Sat) 23:13:30

Re: a会社を基準とした地域名でb会社、c会社の地域名の数の表作成 / せきしんご
Liners様、返信ありがとうございます。各会社を連想配列に入れて、やってみました。
うまく基準会社の地域を基準とした並び替えがうまくできました。
1つ問題がでてきたのですが、下記の希望処理できる方法が思いつきません。何かアドバイス頂けないでしょうか?
:を区切りとしてsplitでできそうな感じがするのですが、そのコードが思いつきません。

---------------------
[希望処理]4つの配列を作成したい。

1つ目の配列、関東,関西,中部・東海,〜海外まで
2つ目の配列、2195,511,327,〜21まで
3つ目の配列、321,97,29,〜35まで
4つ目の配列、944,252,166〜0まで
---------------------
[出力結果]
関東:2195:321:944
関西:511:97:252
中部・東海:327:29:166
中国・四国:114:6:43
九州・沖縄:78:2:60
北海道:37:2:30
東北:30:1:28
海外:21:35:0
---------------------
[試したコード]
TEXTBLOCK 元データ
関東:2195
関西:511
中部・東海:327
中国・四国:114
九州・沖縄:78
北海道:37
東北:30
海外:21
ENDTEXTBLOCK

TEXTBLOCK 元データ1
関東:321
関西:97
海外:35
中部・東海:29
中国・四国:6
北海道:2
九州・沖縄:2
東北:1
ENDTEXTBLOCK

TEXTBLOCK 元データ2
関東:944
関西:252
中部・東海:166
九州・沖縄:60
中国・四国:43
北海道:30
東北:28
海外:0
ENDTEXTBLOCK

hashtbl 連想配列

For 行内容 in Split(元データ, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] =val(行内容) //
Next

For 行内容 in Split(元データ1, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] =連想配列[地域]+":"+val(行内容) //
Next

For 行内容 in Split(元データ2, "<#cr>", TRUE)
  地域 = token(":", 行内容) //残りは数値になる
  連想配列[地域] =連想配列[地域]+":"+val(行内容) //
Next

dim 配列上限 = length(連想配列) -1, 希望データ[配列上限], 数値[配列上限]

For i = 0 to 配列上限
  数値[i] = 連想配列[i, HASH_VAL]
  希望データ[i] = 連想配列[i, HASH_KEY] + ":" + 数値[i]
Next

for i in 希望データ
print i
next

No.4803 2017/12/10(Sun) 14:01:54

Re: a会社を基準とした地域名でb会社、c会社の地域名の数の表作成 / せきしんご
4つの配列作成できました。上記解決しました。
No.4804 2017/12/10(Sun) 16:56:42
同期処理する方法 / 2bkei
ループの中で、警告のポップアップが出る場合があり、警告が出たときのみポップアップを閉じて、次のループに進みたい処理があるとします。下の例のような場合です。⇓
for i = 0 to 5
?@ここである処理をおこなう

?A警告が表示されるときウィンドウのIDを取得してポップアップを閉じて次のループに進む
worn = GETID(title, "#32770")
if worn <> -1 then
CLKITEM(worn, "閉じる")
continue
endif
next

こういった場合に警告のポップアップを閉じるのが遅くて、先に次のループに進んでしまい、思ったような処理がなされないことがあります。こういったときに”閉じる”ボタンが押されるまで待って次の処理に移行するにはどうしたらよいのでしょうか?
r = CLKITEM(worn, "閉じる")
while r = false
sleep(0.1)
r = CLKITEM(worn, "閉じる")
wend
のようにもしてみたのですが、うまくいきませんでした。ご回答いただけたら、幸いです。よろしくお願いします。

No.4747 2017/11/27(Mon) 15:56:52

Re: 同期処理する方法 / 2bkei
上の訂正です。
for i = 0 to 5
?@ここである処理をおこなう

?A警告が表示されるときウィンドウのIDを取得してポップアップを閉じて次のループに進む
worn = GETID(title, "#32770")
if worn <> -1 then
CLKITEM(worn, "閉じる")
continue
endif
?B?@の処理の続き
next

No.4748 2017/11/27(Mon) 16:02:09

Re: 同期処理する方法 / しゅん
この内容では、なかなか答えられないと思いますよ!
どういう状況なのかわからないと、難しいですね。

例えば、i=0の時に、?@で警告が出たり出なかったりだと想定します。
この場合、
?AのGETIDでIDが取れたり取れなかったりするわけです。
取れた場合、continueでi=1のループに遷移するわけですが、GETIDを通過してから警告が出た場合は、警告があるのに、?Bに行くことになりますね。

簡単に思いつくのは、
「警告が出る時間が有る程度予測可能なら、GETIDでその時間を指定する」でしょうか。
デメリットは、警告が出ないケースでその時間待つので、遅くなることです。
デメリットが享受できないのであれば、警告が表示されても大丈夫なようにスクリプトを組めば良いだけかと思います。

No.4749 2017/11/28(Tue) 09:14:03

Re: 同期処理する方法 / 2bkei
しゅんさん、ご回答ありがとうございました。

質問がわかりづらくて申し訳ありません。警告のポップアップはループの最中に出る場合と出ない場合があると想定しています。

おっしゃられたとおりworn = GETID(title, "#32770")の前にsleepを長めに取ってみたらうまくいきました。ありがとうございました。

また、サンプルのN26 ”IEにてActiveX警告のダイアログを自動で閉じる”を参考に警告のポップアップを閉じる部分だけを別ファイルにして、'指定Windowが現れた時'の設定をする方法でも?Bの部分を無視すれば概ねうまくいきました。また、Threadを使ってなんとかうまく処理できないかと試してみたのですが、その方法ではあまりいきませんでした。その他に安定して上手く同期を取る方法があったら、ご教授願いたいと思っております。

No.4750 2017/11/28(Tue) 10:27:08

Re: 同期処理する方法 / Y.Sum
cotinueの前に

while GETID(title, "#32770") <> -1
sleep(0.2)
wend

を挟んで、閉じるボタンを押してから、ウィンドウが閉じられるまでの間、
当該ウィンドウIDが取得できなくなるまで待機するのはどうでしょうか。

No.4751 2017/11/28(Tue) 11:14:00

Re: 同期処理する方法 / しゅん
ちなみに、私が書いたのは、GETIDの第三引数を指定する想定でした(ヘルプ見てください)

例えば、最大で2秒待つとして、
---
SLEEP(2)
GETID(title, "#32770")
---
とするのと、
---
GETID(title, "#32770", 2)
---
とするのでは、警告が出ないケースではどちらもだいたい2秒かかりますが、
1秒で警告が出た場合、前者は2秒+α・後者は1秒程度、と後者が有利です。

No.4752 2017/11/28(Tue) 12:29:55

Re: 同期処理する方法 / 2bkei
Y.Sumさん、ご回答ありがとうございました。

cotinueの前に
while GETID(title, "#32770") <> -1
sleep(0.2)
wend

を挟んで試してみたところ、やはり先にループのほうが進んでしまってうまくいきませんでした。とはいえ、アドバイスいただきましてありがとうございました。

しゅんさん、GETIDの第三引数を指定する方法があったのですね。GETIDのヘルプを見落としていました。こちらのほうが無駄がないですね。わかりやすく説明くださり、ありがとうございました。

お二人ともありがとうございました。大変勉強になりました。

No.4753 2017/11/28(Tue) 14:19:23

Re: 同期処理する方法 / ばい

Threadを使ってこんな感じではどうでしょうか?

//------------------------------------------
PUBLIC LoopSW=TRUE
Thread PopClose()

for i = 0 to 5
//?@ここである処理をおこなう
next
LoopSW=FALSE



/////////////////////////////
Procedure PopClose()
While LoopSW=TRUE
// ?A警告が表示されるときウィンドウのIDを取得してポップアップを閉じる
worn = GETID(title, "#32770")
if worn <> -1 then
CLKITEM(worn, "閉じる")
endif
Sleep(0.5)
Wend
Fend
////////////////////////////

No.4773 2017/12/04(Mon) 17:43:33

Re: 同期処理する方法 / 2bkei
ばいさん、ご回答ありがとうございました。

continue以降の?Bの部分を無視すれば、こちらの案も素晴らしいのですが、?Bの部分が無駄になることを考えると、やはり、しゅんさんの案がベストかと思います。とはいえ、いいアドバイスをくださいまして、ありがとうございました。私がやってみた、警告のポップアップを閉じる部分だけを別ファイルにして、'指定Windowが現れた時'の設定をする方法よりはるかに良かったです。今後、他のプログラムを作るときに役立ちそうです。大変勉強になりました。

No.4788 2017/12/07(Thu) 18:12:09

Re: 同期処理する方法 / 2bkei
余談ですが、Threadで呼ぶ関数の中でフラグを立てて、戻り値として、メインの処理で渡すことができればうまくいきそうなのですが、UWSCでは無理なのでしょうか?例えば下のコードのような感じです。⇓

PUBLIC LoopSW=TRUE
r = false
Thread r = PopClose()

for i = 0 to 5
?@ここである処理をおこなう

if r = true then
continue
endif

?B?@の処理の続き
next
LoopSW=FALSE

/////////////////////////////
function PopClose()
While LoopSW=TRUE
// ?A警告が表示されるときウィンドウのIDを取得してポップアップを閉じる
w = GETID(title, "#32770")
if w <> -1 then
CLKITEM(w, "閉じる")
//ここで戻り値を設定する
result = true
endif
Sleep(0.5)
Wend
Fend
/////////////////////////////

No.4789 2017/12/07(Thu) 18:35:25

Re: 同期処理する方法 / 2bkei
Functionにしなくてもresult = trueのところをパブリック変数にするだけでした。失礼しました。ただ、試してみたところ、ポップアップが出るタイミングと合わないとやはりうまくいかないようでした。ありがとうございました。
No.4790 2017/12/07(Thu) 19:44:01

Re: 同期処理する方法 / ばい
2bkeiさんこんにちは

すみません。勘違いしていました。?Bの考慮が抜けていました。
私が提案したスクリプトは
「出るか出ないかわからないポップアップを待っている時間も勿体ないので、
出るのを監視して、出たら即閉じる」というものでした。

?Bを想定するのであれば、しゅんさん案ですね。

No.4792 2017/12/08(Fri) 12:07:33
SAVEIMG関数でウィンドウを指定して画像を保存しようとすると画像がウィンドウ内が真っ暗に表示されてしまいます。 / yumu
SAVEIMG関数でウィンドウを指定して画像を保存しようとすると画像がウィンドウ内が真っ暗に表示されてしまいます。
DIRECTXやOPENGLで描写されたものだとこうなってしまうようなのですが対処法はないでしょうか。

No.4764 2017/12/02(Sat) 12:30:48

Re: SAVEIMG関数でウィンドウを指定して画像を保存しようとすると画像がウィンドウ内が真っ暗に表示されてしまいます。 / 通りすがり技術者
私も同一現象が発生して、結局、根本原因がわからないので、CHKIMG関数を使用して保存した画像が画面上に存在するまで繰り返す方法を取りました。
以下、その方法(画像ファイル指定の場合は試してません)

id = GETID(GET_ACTIVE_WIN)
tryCnt = 0
ckScr = false
While tryCnt < 10 //成功するまで10ほど繰り返す。
CTRLWIN(id, ACTIVATE) // 念のためアクティブ
SAVEIMG(, id) // クリップボードに保存
ckScr = CHKIMG(, 0, STATUS(id, ST_X), STATUS(id, ST_Y), STATUS(id, ST_WIDTH), STATUS(id, ST_HEIGHT))
If ckScr Then Break;
SLEEP(0.05) //念のためちょっと待つ
tryCnt = tryCnt + 1
Wend

No.4786 2017/12/07(Thu) 15:36:51

Re: SAVEIMG関数でウィンドウを指定して画像を保存しようとすると画像がウィンドウ内が真っ暗に表示されてしまいます。 / stuncloud
対象ウィンドウがAlt+PrintScreenでクリップボードに保存できるなら、クリップボードの画像を保存するという手があります
クリップボードの保存にはPowerShellを使っているので動作は遅いです


path = "sample.png" // jpgやbmpも可

id = exec("notepad")
// 対象ウィンドウをアクティブにしてAlt+PrintScreen
ctrlwin(id, ACTIVATE)
kbd(VK_ALT, DOWN)
kbd(VK_SNAPSHOT, CLICK)
kbd(VK_ALT, UP)

// ファイルに保存
print SaveClipboardImage(path) // 成功時はtrueを返す

ctrlwin(id, CLOSE)


function SaveClipboardImage(path)
 with createoleobj("VBScript.RegExp")
  .Pattern = "\.(jpg|bmp|png)$"
  matches = .Execute(path)
  if ! matches.count then
   msgbox("ファイル拡張子は.jpg、.bmp、.pngのいずれかにしてください")
   result = FALSE
   exit
  endif
  ext = matches.item(0).SubMatches.item(0)
  select ext
   case "jpg"
    fmt = "jpeg"
   default
    fmt = ext
  selend
 endwith
 
 cmd = replace(ps, "%FilePath%", path)
 cmd = replace(cmd, "%format%", fmt)
 ret = trim(powershell(cmd))
 result = ret = 1
fend

textblock ps
Add-Type -AssemblyName System.Windows.Forms
$Image = [System.Windows.Forms.Clipboard]::GetImage()
if ($Image) {$Path = '%FilePath%'; $Image.Save($Path, '%format%'); return 1}
return 0
endtextblock

No.4787 2017/12/07(Thu) 17:18:11
MOUSEORG下でのCTRLやALTについて / うぃす
id =exec("notepad")
MOUSEORG(GETCTLHND(id,"Edit"), 2) // メモ帳のEdit部を指定
CTRLWIN(id, MIN)         // 最少化状態での書き込み
sendstr(0,"aaaaaaa")
KBD(VK_CTRL,DOWN)
KBD(VK_V)
KBD(VK_CTRL,UP)

このような処理を書き、場合、バックグラウンドでメモ帳にペーストを行いたいのですが行われません。
win10x64,win7x64で確認しましたがどちらも動きませんでした。

バックグラウンドでウィンドウをアクティブにせずにショートカットキーを送る方法はないのでしょうか?

No.4771 2017/12/04(Mon) 15:27:59

Re: MOUSEORG下でのCTRLやALTについて / ばい
id =exec("notepad")
CTRLWIN(id, MIN)         // 最少化状態での書き込み
sendstr(0,"aaaaaaa")
Sckey(Id,VK_CTRL,VK_V)

でどうでしょう?

No.4772 2017/12/04(Mon) 17:04:22

Re: MOUSEORG下でのCTRLやALTについて / うぃす
お返事ありがとうございます。

SCKEYも試したのですが、一瞬だけアクティブになり、それが原因なのか動作が不安定になります。
できれば完全にバックグラウンドで動作させたいのですが……

No.4774 2017/12/04(Mon) 18:01:09

Re: MOUSEORG下でのCTRLやALTについて / ばい

>できれば完全にバックグラウンドで動作させたいのですが
そ〜ですかぁ。

実現したい事として、バックグラウンドでCTRL+Vが目的なのでしょうか?
それとも、バックグラウンドでメモ帳に文字列を書きたいのでしょうか?

後者とすれば、次の方法でどうでしょうか?

id =exec("notepad")
CTRLWIN(id, MIN)           // 最少化状態での書き込み
sendstr(id, "aaaaaaa", 1, FALSE, 2)  // ウィンドウをアクティブ化しない

No.4777 2017/12/05(Tue) 16:37:58

Re: MOUSEORG下でのCTRLやALTについて / うぃす
実現したいことはCTRL+VやCTRL+Aといった「ショートカットキー」をバックグラウンドに送ることです。

教えていただいて申し訳ないのですが、sendstrとは異なります。

説明が足りなくてすみませんでした。

No.4782 2017/12/06(Wed) 17:08:43

Re: MOUSEORG下でのCTRLやALTについて / しゅん
ショートカットキーを送りたいのは、何か機能を実行させたい、からですよね。
SendMessageでWM_COMMANDを送る、という手もあります。
IDを調べるのが面倒ですが。

No.4783 2017/12/06(Wed) 18:06:45

Re: MOUSEORG下でのCTRLやALTについて / stuncloud
CLK_BACK でメニューをクリック

id = exec("notepad")
sendstr(0,"aaaaaaa")
ctrlwin(id, MIN)
sleep(1)
clkitem(id, "編集\貼り付け", CLK_MENU or CLK_BACK)
sleep(1)
ctrlwin(id, NORMAL)

おそらく本当に操作したい対象はメモ帳でもなくやりたいこともCtrl+Vではないのでしょうが
同じようにメニューバーから操作ができる場合はこの方法が使える可能性があります
その場合一点注意する必要があります
メモ帳であればメニューのアイテムを「編集\貼り付け」のように「\」区切りで指定できますが、この方法が使えないものもあります
getitem()でITM_MENUを確認してみてください
「\」区切りが使えない場合は

clkitem(id, "編集", CLK_MENU or CLK_BACK)
clkitem(id, "貼り付け", CLK_MENU or CLK_BACK)

のように個別にclkitem()します

No.4784 2017/12/06(Wed) 18:22:44
EXCELファイルを最小化状態で起動する方法につきまして / takahashi
EXCELファイルのデータを読み取って、そのデータを元に作業するマクロを作成しております。
その際、エクセルファイルを開くのですが、こちらを最小化、もしくは非表示の状態で起動する方法を探しております。下記方法でもやってみたのですが、これだと一度開いた後最小化する間もなくファイルが閉じてしまいます。

Excel = XLOPEN("サンプル.xlsm")
id = GETID("サンプル.xlsm")
CTRLWIN(id,MIN)
XLCLOSE(EXCEL)

No.4768 2017/12/04(Mon) 01:57:41
クロスリファレンスツールとは / ヨウコ
UWSCフォルダーにあるクロスリファレンスツールXRef.exeとはどういう時に使うものでしょうか?
helpを見ても使い方が書いていなかったので、教えて頂けないでしょうか?

No.4763 2017/12/02(Sat) 09:07:04

Re: クロスリファレンスツールとは / routa
デバッガーのヘルプに書いてあります。
デバッガーからの起動 Option -> Cross Reference:

クロスリファレンスリスト(変数や関数の使用行表示)の起動
利用されていない変数や関数は赤で表示されます
行番号をダブルクリックするとデバッガをその行に移動します

No.4765 2017/12/03(Sun) 00:57:24
全1170件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 117 >> ]