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

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

ピクセルをセンチ / hixyoi
お世話になります。
画像60X60のピクセルが、何センチX何センチになるか、求めるためには、モニタのインチサイズが必要なようですが、モニタのインチサイズは、結局、手で測らないとだめなのでしょうか。
なにかしら、良い案がございましたらご教授ください。

No.1102 2021/01/21(Thu) 16:21:18

Re: ピクセルをセンチ / stuncloud
現在の表示のppiがわかれば求められそうな気もしますね
pixels per inchの略なので60ppiなら60x60は1インチx1インチということになります
…ただしWindows自体や画像を表示するソフトの表示倍率なんかとの兼ね合いもあるので、一筋縄ではいかなさそうです…

解決策の提示ができてなくて恐縮ですが、なぜモニタ上の表示の実寸が必要なのかに興味があり差し支えなければお教え願いますでしょうか

No.1103 2021/01/21(Thu) 20:22:17

Re: ピクセルをセンチ / hixyoi
宮大工の端くれ設計図を書き始めています、こちらのソフトでもムリなのでしょうか、ppiは、1960x1080です。
No.1104 2021/01/22(Fri) 08:19:39

Re: ピクセルをセンチ / stuncloud
例えばこんな手段があるようです (リンク先はdelphiですがUWSCでもできるはず)
http://mrxray.on.coocan.jp/Delphi/plSamples/020_DisplayResolution.htm#09

ただ、ここにも書いてあるように
> ディスプレイのサイズを mm (ミリメートル) 単位まで取得するサンプルです.
> 最初のコードは,画面のピクセル数と DPI (インチ当たりのピクセル数,PPI とも言う) から換算しています.結果として数ミリメートル以上の精度は望めないようです.モニタのサイズや種類によっては目安程度の値と考えた方が無難と思われます.
> 正確な値は,おそらく,モニタを実測するしかないでしょう.


そこまで正確な値は出せないと思います
ただし、出力するモニタが一つであれば、それに対応した調整を計算結果に対して施す、ということはできるかもしれません
いかんせん環境依存ですのでこればかりは個々でやってみないとわからないですね…

ので、ひとまず自分の環境でちょっとやってみました

-------------
def_dll CreateDCA(string, string, string, dword):dword:Gdi32.dll
def_dll GetDeviceCaps(dword, int):int:Gdi32.dll

mon = 0 // メインモニタ

dc = CreateDCA("DISPLAY", "\\.\DISPLAY" + (mon + 1), NULL, 0)
hsize = GetDeviceCaps(dc, 4) // HORZSIZE
vsize = GetDeviceCaps(dc, 6) // VERTSIZE

msgbox("画面サイズ<#CR>横:" + hsize + "mm<#CR>縦:" + vsize + "mm")

// 60x60の画像なら
w = 60
h = 60
mmw = w / monitor(mon, MON_WIDTH) * hsize
mmh = h / monitor(mon, MON_HEIGHT) * vsize

msgbox("横"+w+"pixel:" + round(mmw, -2) + "mm<#CR>縦"+h+"pixel:" + round(mmh, -2) + "mm")
-------------

先の記事をよく読むとGetDeviceCapsでHORZSIZEとVERTSIZEを取ると画面幅と高さがミリメートルで取れるようなのでそれを使いました
Windows 10なのでそこそこ正確な値が出ているようです (実際にメジャーで測ってみましたが合ってるようでした)
画面の実寸がわかれば、画像のピクセルと画面全体のピクセルの比率から画像の実寸も得られるという寸法です
ただし、リンク先にもあるようにOSによっては正しい値を返さない場合があることを留意しておいてください

No.1105 2021/01/22(Fri) 11:51:05
「UWSCでタスクトレイアイコンを表示する」について / たくろー
どこで聞いて良いのか分からなかったのですが、作者様がいますのでここで質問させてください。

「UWSCでタスクトレイアイコンを表示する (COM版)」で、
アイコン右クリックで終了させるのはどうしたらいいのですか?

procedure R()
 ans =msgbox("終了します",BTN_OK or BTN_CANCEL)
 if ans = 1 then exitexit
fend

だと終了はしますが、タスクトレイにアイコンが残ってしまいます。

procedure R()
 ans =msgbox("終了します",BTN_OK or BTN_CANCEL)
 if ans = 1
  TaskIcon.Dispose()
  exitexit
 endif
fend

だとTaskIconが定義されていない、と怒られてしまいます。

また本体の常駐プログラムでは sleep(3600) を使っていますので、
こちらで監視は出来ないです。

よろしくお願いします。

No.1096 2021/01/16(Sat) 16:53:11

Re: 「UWSCでタスクトレイアイコンを表示する」について / stuncloud
> また本体の常駐プログラムでは sleep(3600) を使っていますので、
> こちらで監視は出来ないです。

いやいや、そちらでしてください
3600秒経過、または終了フラグによってループを終えてDispose()してください
oleevent()で呼び出す関数が終了フラグを立てるようにします

try-finallyならexitexit後にfinally部って実行されるんでしたっけ?できるなら
try
 sleep(3600)
finally
 TaskIcon.Dispose()
endtry
でも良さそうですね

なお、件の記事に掲載しているコードはあくまでサンプルなので、あれを元に各々必要な機能を追加していただく想定です
なので自分の用途に合うよう改造して使ってもらうのが一番良い解決策です

No.1097 2021/01/16(Sat) 18:29:57

Re: 「UWSCでタスクトレイアイコンを表示する」について / たくろー
ご連絡有難うございます。

終了フラグをパブリックにして、右クリックの動作を
if msgbox("終了します",BTN_OK or BTN_CANCEL) = 1 then 終了フラグ = 1

本体を
while true

 //処理

 for i = 1 to 3600 //sleep(3600) の代わり
  if 終了フラグ = 1 then break 2 //本体のループ抜ける
  sleep(1)
 next

wend

TaskIcon.Dispose()

で対応しました。

No.1098 2021/01/16(Sat) 19:08:55

Re: 「UWSCでタスクトレイアイコンを表示する」について / しろまさ
3600秒の正確性は問わないのですねー。
No.1101 2021/01/18(Mon) 11:33:56
ラインカウントについておしえてください。 / nagaimo
エクセルで2行目までは表題がはいっており、A.Bの列は無駄な情報が入っています。
その情報からラインカウントを行いたいのですがさっぱりうまくいきません。
IDはF_EXISTSでTRUEと表示されるのですがCNTは1になります。
半日調べたのですがさっぱりわかりません。
CSVのラインカウントならすぐできたはずなのですが。。。
お助けいただけますようお願いいたします。


NoteID = GETID("メモ帳") //既に開いているメモ帳の ID を取得
o_XL = GETACTIVEOLEOBJ("Excel.Application") // エクセル オブジェクト
o_WB = o_XL.activeworkbook // ワークブック オブジェクト
o_WS = o_WB.Sheets("登録部品手配リスト") 
o_WS.activate
A="<#DBL>"+o_WB.Name+"<#DBL>"
ID = FOPEN(A, F_READ or F_WRITE)
CNT = FGET(ID,F_LINECOUNT,3) // 3列目の行数を取得したい
FCLOSE(ID)
//CNT=CNT-3//CNTを-3にする
FOR i=3 TO CNT//3行目からスタート
//抜き出したものをSENDSTRなどします。
NEXT

No.1089 2021/01/15(Fri) 19:11:43

Re: ラインカウントについておしえてください。 / Rayna
>>1089 nagaimo さん

・FOpenはテキストファイル等を読み書きするのに適しています
・CSVは中身がテキストなので FGet, FPut の機能で行列を解釈して読み書きする事が出来ます
・Excel系ファイル はテキストファイルではないのでFGet, FPutの機能を正常に使うことは出来ません

・o_XLから Cells(y, x).value 等で値を獲得しましょう
・この場合ForではなくWhileやRepeatで終端の値(例えばEMPTYとか)が出てくるまでループさせるのがいいかもです

No.1092 2021/01/16(Sat) 00:46:09

Re: ラインカウントについておしえてください。 / しろまさ
まずはこれ。
https://excel-ubara.com/excelvba1/EXCELVBA318.html

No.1095 2021/01/16(Sat) 09:28:06

Re: ラインカウントについておしえてください。 / nagaimo
しろまささんRAYNAさん
ご回答ありがとうございました。
CSVとエクセルは全く別物で考えないといけないんですね。。。
Cells(y, x).valueやVBAを調べなおします。

No.1099 2021/01/18(Mon) 09:52:39

Re: ラインカウントについておしえてください。 / しろまさ
csvファイルとはいえ、XLに関連付けられていればダブルクリックでXLとして開きます。
それは既にエクセルファイルです。

fopenで開けばテキストファイルとして扱えます。

ただそれだけの違いです。

No.1100 2021/01/18(Mon) 11:31:35
エクセルでおしえてください。 / nagaimo
簡単な質問で申し訳ございません。
エクセルでおしえてください。

質問内容
指定ワークシート名のワークシートをアクティブに変更したいです。

詳細
エクセルのファイル名称は都度変化するのですがワークシート名は固定と
なっているエクセルがあります。
ただワークシートが追加・削除されたりもするため下記のような番号振りは
出来ませんでした。
また同じエクセル内で複数のワークシートを順次開きたいです。
皆様にとっては簡単な質問かもしれませんが何卒よろしくお願いいたします。

EXCEL = GETACTIVEOLEOBJ("Excel.Application")
EXCEL.visible = True
FOR A = 1 TO Excel.activeworkbook.worksheets.count
PRINT Excel.activeworkbook.worksheets(A).name 
//ワークシート名全部とりました。
NEXT
ifb Excel.activeworkbook.worksheets(1).name="登録部品手配リスト"
//else時に隣のワークシートをアクティブに変更できません。。。

No.1081 2021/01/13(Wed) 18:51:02

Re: エクセルでおしえてください。 / しろまさ
// ワークシート オブジェクトを select 又は activate
 o_XL = GETACTIVEOLEOBJ("Excel.Application") // エクセル オブジェクト
 o_WB = o_XL.activeworkbook // ワークブック オブジェクト
 o_WS = o_WB.Sheets(1)    // ワークシート オブジェクト
//o_WS = o_WB.Sheets("Sheet2") // 名前指定でもよい
 o_WS.activate         // 理由 http://d.hatena.ne.jp/paz3/20090824/1251086123

// こちらも参考にどうぞ
http://siromasa.html.xdomain.jp/uwsc/u_term/ExcelApplication.html

No.1084 2021/01/14(Thu) 08:56:34

Re: エクセルでおしえてください。 / nagaimo
しろまささん
ご回答いただきありがとうございました。
ばっちりとアクティブのワークシートを選択することができました。

ついでと言ってはなんなのですが新たに困った内容がでてきました。

エクセルで下記のようになっていた場合
山田 太郎 15
山田 次郎 13

for y = 1 to 2
for x = 1 to 3
山田リスト =o_XL.ActiveSheet.Cells[y,x].value
SENDSTR(ID, 山田リスト)
print 山田リスト
next
next

printで吐き出すと下記のようになります。
山田
太郎
15
山田
次郎
13

ところがsendstrの吐き出したものは
山田太郎15山田次郎13
とつながって出てきます。
printと同じように出力するためになにかいい方法はございますでしょうか?

No.1085 2021/01/14(Thu) 17:47:47

Re: エクセルでおしえてください。 / しろまさ
SENDSTR(ID, の送り先は何ですか?
エクセル テキストエディタ その他アプリ
それぞれ適切な処理があると思いますが、
改行を入れたいだけであれば
SENDSTR(ID, 山田リスト+"<#cr>")
でしょうか。

No.1087 2021/01/15(Fri) 07:24:10

Re: エクセルでおしえてください。 / nagaimo
しろまささん
ご回答ありがとうございました。
<#cr>に"がぬけていたため<#cr>をいれてもエラーになっていただけでした。
くだらない質問で失礼いたしました。

No.1088 2021/01/15(Fri) 09:45:23
THREAD処理で刻々と変わる変数の値を取得したい / YMK
題材の件、並行処理で変わる変数の値を、本スレッドで取得するにはどうすれば良いのでしょうか

//パブリック変数にしたけど上手くいかない
PUBLIC a = 0
THREAD test(a)
for i = 1 to 30; print a ;sleep(0.2);next //i=6以上では「1」を返して欲しいところだけど
sleep(5)

PROCEDURE test(a)
sleep(1)
a = 1
FEND



//参照引数にしても上手くいかない
a = 0
THREAD test(a)
for i = 1 to 30; print a ;sleep(0.2);next //i=6以上では「1」を返して欲しいところだけど
sleep(5)

PROCEDURE test(var a)
sleep(1)
a = 1
FEND

No.1074 2021/01/12(Tue) 23:43:04

Re: THREAD処理で刻々と変わる変数の値を取得したい / YMK
済みません、PUBLIC宣言をしたのだから引数を渡す必要はありませんでした。

PUBLIC a = 0
THREAD test()
for i = 1 to 30; print a ;sleep(0.2);next //i=6以上では「1」を返した
sleep(5)
PROCEDURE test()
sleep(1)
a = 1
FEND

あまりPUBLICは使いたく無かったのですが、
参照引数では上手くいかないのですね、、

No.1076 2021/01/13(Wed) 05:12:30

Re: THREAD処理で刻々と変わる変数の値を取得したい / しゅん
// 自己解決されているようなので、お遊び的な参考情報を

// Public縛りするなら、一部のCOMオブジェクトがスレッド間参照可能なことを使います。

DIM i, a = CreateOleObj("VBScript.Regexp")
a.pattern = 0
THREAD test(a)
for i = 1 to 30; print a.pattern ;sleep(0.2);next
sleep(5)


PROCEDURE test(a)
sleep(1)
a.pattern = val(a.pattern) + 1
FEND

// patternは文字列なので、数値評価し直しが必要ですね、、、。



// 他はプロセスメモリーを参照するか
// asm.uwsは https://junjun777.hatenablog.com/entry/20120616/uwsc_function_pointer

CALL asm.uws
a = Asm.Alloc(4) // 4byte確保
Asm.SetDword(a, 0)
THREAD test2(a)
for i = 1 to 30; print Asm.GetDword(a) ;sleep(0.2);next
sleep(5)
Asm.Free(a) // 使い終わったらFreeが必要なのが面倒


PROCEDURE test2(a)
sleep(1)
Asm.SetDword(a, Asm.GetDword(a) + 1)
FEND

// VirtualAllocは4byteなんて少なく確保はしないですけどね、、、。
// 4byte指定でも4KBくらい確保したはず。

// 他にも方法はいろいろありますね。

No.1078 2021/01/13(Wed) 14:51:29

Re: THREAD処理で刻々と変わる変数の値を取得したい / YMK
しゅんさん
Publicにすることなく動作することを確認しました。
有難うございます。

ただ、説明を簡単にするために変数にしましたが、実際は配列なのです。
配列だとCOMオブジェクトでは出来ないですよね、、

DIM i, data[5,2000] = CreateOleObj("VBScript.Regexp")
data[0,0].pattern = 0
data[0,1].pattern = 10 //ここでCOMエラー


Asm.uws の方法は、ボリュームがあるので時間をかけて調べてみます。

No.1080 2021/01/13(Wed) 16:42:42

Re: THREAD処理で刻々と変わる変数の値を取得したい / stuncloud
やたらめったらpublicを使っているというのでなければ、publicでも良いと思いますよ
気になるならmoduleに入れておくとか?

thread M.test()
for i = 1 to 30; print M.a ;sleep(0.2);next
sleep(5)

module M
 public a = 0
 procedure test()
  sleep(1)
  a = 1
 fend
endmodule

No.1083 2021/01/14(Thu) 00:14:08

Re: THREAD処理で刻々と変わる変数の値を取得したい / satocha
しろまささんのサイトにある
http://siromasa.html.xdomain.jp/uwsc/u_sample/DLL/Class_SharedMemory.uws
をつかってみてはどうですか。
配列にも対応しています。

No.1086 2021/01/15(Fri) 01:44:29
Explorer について / Roppy
リストボックスの、あるファイルにフォーカスを当てる時
ファイル数が多くなり、ファイルがウィンドウの可視内に収まらなくなると
うまくいかなくなります。(ちなみに XPは、CLK_TREEVIEW で、できます)

p= "C:\UWSC"
f= "xxx.uws"

id= exec("Explorer.exe "+ p)
clkitem(id, f, CLK_LEFTCLK)

No.1071 2021/01/12(Tue) 06:42:22

Re: Explorer について / stuncloud
見えていないとクリックが成功しない、つまり
> clkitem(id, f, CLK_LEFTCLK)
がFalseを返すので、その場合はスクロールさせて再度clkitemを行う
それをTrueが返されるまで繰り返す
という処理にすると良いかと思います

スクロールはsetslider()を使う、page downを押す、などの方法があります

No.1072 2021/01/12(Tue) 10:41:51

Re: Explorer について / Rayna
>>1071 Roppy さん

// ・explorer は Exec しても 開いたウインドウが id として獲得できない場合があります
// ・操作によってはOS毎に方法を変える必要性があります(UIの操作は特に)

// XP -> Vista で新しいデスクトップの描写システムが追加され(DWM, Aeroとか)
// 7 -> 8 はそこまでUWSCの挙動は変わらないですが DWM が強制されたりと仕様が変わっているので厳密なことをする場合は注意が必要です
// 8.1 -> 10 はUIが一新されたので 同じスクリプトでも動作の違いが顕著になります

// 体感ですが | を 設計や仕様変更を考慮する壁 だとすると
//  2000, XP || Vista, 7 | 8, 8.1 || 10
// こんなかんじだと思います

/////////////////////////////////
// UWSC(Free版) のディレクトリから explorer を使って Readme.txt を開くスクリプト

Dim f = "Readme.txt"
Dim p, id

Select KindOfOs()
Case 13 // Windows XP // Test OSBuild:2600
 p = Trim(DosCmd("Echo %UserProfile%\デスクトップ\UWSCF\5.302"))
 id = Exec("Explorer.exe <#DBL>" + p + "<#DBL>") // -1 // ID取れてない
 id = GetId(GET_ACTIVE_WIN) // とりあえず↑で開かれたアクティブウインドウから獲得

 Print ClkItem(id, f, CLK_LISTVIEW) // True
Case 30 // Windows 10 // Test OSBuild:19042
 p = "C:\Program File\UWSCF"
//id = Exec("Explorer.exe <#DBL>" + p + "<#DBL>") // IDは取れているけどExecで開いたウインドウではない
 // ファイル見えてない問題を解決するために explorer の /select オプションを使ってみる
 id = Exec("Explorer.exe /select,<#DBL>" + p + "\" + f + "<#DBL>") // -1 // ID取れてない
 id = GetId(GET_ACTIVE_WIN) // とりあえず↑で開かれたアクティブウインドウから獲得

 Print ClkItem(id, f, CLK_LIST Or CLK_DBLCLK) // True
SelEnd
/////////////////////////////////

// 蛇足
http://codepad.org/tXBtFz7b

No.1073 2021/01/12(Tue) 13:18:35

Re: Explorer について / Roppy
stuncloudさん、ありがとうございます。参考になりました。

Raynaさん、ありがとうございます。早速、やってみます。助かりました。

No.1075 2021/01/13(Wed) 00:07:48

Re: Explorer について / Roppy
岩ずでもがなな事ども

stuncloudさん、Windows を使うことは、将にそういうことを、したいが為ですね。

Raynaさん、
Windows のヴァージョンアップの度に襲われるこの迷惑感。
未だに、XP や 7 を使わねばならぬ、あれやこれ、溜息がでます。
今回は、10 で動作させねばならなくなり、「見える化」を維持したいがため、この仕儀となりました。
Explorer は、なかなかハードルが高いです。
当面は、どのファイルが、いかなる処理をされるかを、MSGBOX 等で確認させる事で対応します。そして、別のファイラーも選択肢として、粘ってみます。

UWSC がこの世に無かったら、私は、Windows を使っていないでしょう。
umiumi さんに、最大のリスペクトを。

No.1077 2021/01/13(Wed) 07:11:34

Re: Explorer について / stuncloud
ファイル操作だけならExplorerを操作するよりも
・doscmd()またはpowershell()でファイル操作系コマンド
・COM(Shell.ApplicationやScripting.FileSystemObjectなど)
を使って裏で片付けちゃうのが楽なんですよねえ
というよりExplorerのGUI操作がキツすぎる、というわけなんですが
やってる操作はprint窓に出力するようにすれば視覚的なものもなんとかなるかな、という気はします
ファイルコピーや移動の際にダイアログを出すオプションがShell.Applicationにあるので、それを駆使するというのもアリでしょう (僕もこれはよく使います)

No.1079 2021/01/13(Wed) 15:39:41

Re: Explorer について / Roppy
stuncloudさん、ありがとうございます。

>>ファイルコピーや移動の際にダイアログを出すオプションがShell.Applicationにあるので、それを駆使するというのもアリでしょう

これ、いただきます。

No.1082 2021/01/13(Wed) 19:00:58
SENDSTRについて教えてください / 藍
いつもお世話になります。

webシステムで支店コードのところに代入しようとしています。
SENDSTR(id, "123456", 7, True)の番号7の部分なのですが、
機種??によって「8」になったりします。

windows10 64ビット、ie11を利用

同一の環境で実行しているつもりですがこのような事象が発生します。
なぜなのか理由がわかりません。ご存じの方がいましたら教えてください。
よろしくお願いいたします。

No.1068 2021/01/05(Tue) 18:10:46

Re: SENDSTRについて教えてください / stuncloud
> webシステムで
ということは何かしらのブラウザだったりするのでしょうか
環境によってエディットボックスの数が異なるのだと思われます
例えば、一方はアドレスバーのみだがもう一方はアドレスバーと検索バーがある、など
この場合検索バーが増えた分、sendstrの番号指定が一つずれるという具合です

対処法として思いつくのは

・いずれの環境でもウィンドウの状態を揃えるようにする

ですがそれが難しい場合、あるいは原因ではなかった場合は

・入力先に初期値があるならgetstr(id, 7)して比較
  その場所に入力して良いならそのまま7にsendstr
  だめなら8にsendstr
  (きちんとするならgetstr(id, 8)も調べる)

といった感じで入力できる場所を適宜探すのが良いと思います

No.1069 2021/01/06(Wed) 10:40:18

Re: SENDSTRについて教えてください / 藍
stuncloud様 返信ありがとうございます。
ブラウザーはie11を利用しています。
PCは複数台ありウィンドウの状態を揃えのは難しいため
アドバイス通り入力できる場所を適宜探す方法で対処しました。
ありがとうございました。

No.1070 2021/01/06(Wed) 16:46:05
ネットストックハイスピードに証券番号が自動入力できない / nanashi
お疲れ様です。
windows10 64bit環境で下記ブログにあるように松井証券のネットストックハイスピードのチャートを自動で保存しようとしているのですが、code入力の部分がうまく動きませんでした。
"ComboBox"でなくて"Edit"でないかなとか、o_HNDそのものを使って書き換えられないかなとか、マウス右クリックでペースト出来ないかなどもろもろ試したのですがうまくいきませんでした。
もし入力が成功する人がいましたら、やり方を教えてほしいです。
よろしくお願いいたしますmm

元サイト:http://www.m-trader.net/chart_funasi2
code入力の部分
```
//銘柄のCode入力処理開始。
w_ID = GetID(windowTitle)
o_HND = GetCtlHND(w_ID, "ComboBox")
o_ID = HNDtoID(o_HND)
CTRLWIN(w_ID, ACTIVATE)
SENDSTR(o_ID, code, 1, True)
KBD(VK_RETURN)
//銘柄のCode入力処理終了
```

No.1067 2020/12/28(Mon) 00:12:36
ファイルが消えない / selon
助けてください、タスクマネージャに、なぜか、exeファイルが残り、毎回、手動で消さなければなりません、xxx.exeを消す方法を教えていただけないでしょうか。
No.1064 2020/12/24(Thu) 07:42:44

Re: ファイルが消えない / yanyan
何のexeファイルが、なぜ残るかわかりませんが、TASKを強制的に消すなら、UWSCではexecでTASKKILL.ExEを実行するとかで消せます。
No.1065 2020/12/24(Thu) 14:38:11

Re: ファイルが消えない / selon
yanyanさん、ありがとうございます、助かりました。
No.1066 2020/12/24(Thu) 15:15:20
ループ処理を抜けたい / YMD
下記のプログラムを実行するとループ処理はされるのですが条件を満たしても止まりません。
間違いのある個所を教えてください。ループを抜ける条件はエクセルの(A13:M13)の赤色セルが6個になったらです。
よろしくお願いします。


xls=GETACTIVEOLEOBJ("Excel.Application")
xls.Visible=TRUE

a = 0

REPEAT
(処理)
UNTIL For i = 1 To 13
IFB xls.Worksheets("sheet1").Cells(13, i).DisplayFormat.Interior.ColorIndex = 3 Then
a = a + 1
ENDIF
NEXT
a = 6

No.1054 2020/12/22(Tue) 06:20:11

Re: ループ処理を抜けたい / stuncloud
これ動くんですか…?
> UNTIL For i = 1 To 13
コピペミスかしらん

ループを抜けるのはbreakです
if a = 6 then break
でaが6なら今のループを抜けます
多重ループの抜け方というのもあるので、詳しくはヘルプを見てください

No.1055 2020/12/22(Tue) 13:55:19

Re: ループ処理を抜けたい / YMD
> これ動くんですか…?
> > UNTIL For i = 1 To 13
> コピペミスかしらん


恥ずかしながらコピペミスです///

>
> ループを抜けるのはbreakです
> if a = 6 then break
> でaが6なら今のループを抜けます
> 多重ループの抜け方というのもあるので、詳しくはヘルプを見てください



REPEAT
(処理)
UNTIL(条件式)

で条件式がTRUE つまりAが6になったらループを抜けるのではないのですか?
初心者なのでサンプルコードなど書いていただけると助かります。

No.1056 2020/12/22(Tue) 16:22:52

Re: ループ処理を抜けたい / しろまさ
>で条件式がTRUE つまりAが6になったらループを抜けるのではないのですか?
これが解っているならまず書いて試す。

>初心者なのでサンプルコードなど書いていただけると助かります。
甘えすぎ。アドバイスを受けて修正したコードをテストして
それでもダメならそのダメなコードを張り付けて再質問するように。

ここは作成依頼掲示板ではありません。

No.1057 2020/12/22(Tue) 16:33:08

Re: ループ処理を抜けたい / stuncloud
> で条件式がTRUE つまりAが6になったらループを抜けるのではないのですか?
repeatとforがあってどっちを抜けたいのかがわからず、どちらでも抜けられるbreakを提示しました
・提示されたコードに誤りがある
・説明不足
だと十分な回答はできませんよ

ちなみに条件式ってのは a = 6 なのでじゃあそれをuntilに書いてみたらいいんじゃないかな!

No.1058 2020/12/22(Tue) 16:40:23

Re: ループ処理を抜けたい / YMD
> > で条件式がTRUE つまりAが6になったらループを抜けるのではないのですか?
> repeatとforがあってどっちを抜けたいのかがわからず、どちらでも抜けられるbreakを提示しました。


大変失礼しました。REPEATの方でお願いします。

> ・提示されたコードに誤りがある

コピペミス治してみました。
よろしくお願いします。

xls=GETACTIVEOLEOBJ("Excel.Application")
xls.Visible=TRUE

a = 0

For i = 1 To 13
IFB xls.Worksheets("sheet1").Cells(13, i).DisplayFormat.Interior.ColorIndex = 3 Then
a = a + 1
ENDIF
NEXT

REPEAT
(処理)
UNTIL a = 6

> ・説明不足
> だと十分な回答はできませんよ
>
> ちなみに条件式ってのは a = 6 なのでじゃあそれをuntilに書いてみたらいいんじゃないかな!


やってみてだめだったのでこちらのサイトで質問させていただきました。

No.1059 2020/12/22(Tue) 19:35:32

Re: ループ処理を抜けたい / YMD


> > で条件式がTRUE つまりAが6になったらループを抜けるのではないのですか?
> repeatとforがあってどっちを抜けたいのかがわからず、どちらでも抜けられるbreakを提示しました。


大変失礼しました。REPEATの方でお願いします。

> ・提示されたコードに誤りがある

コピペミス治してみました。
よろしくお願いします。

xls=GETACTIVEOLEOBJ("Excel.Application")
xls.Visible=TRUE

a = 0

For i = 1 To 13
IFB xls.Worksheets("sheet1").Cells(13, i).DisplayFormat.Interior.ColorIndex = 3 Then
a = a + 1
ENDIF
NEXT

REPEAT
(処理)
UNTIL a = 6

> ・説明不足
> だと十分な回答はできませんよ
>
> ちなみに条件式ってのは a = 6 なのでじゃあそれをuntilに書いてみたらいいんじゃないかな!


やってみてだめだったのでこちらのサイトで質問させていただきました。

No.1060 2020/12/22(Tue) 19:36:26

Re: ループ処理を抜けたい / stuncloud
> a = a + 1
これをどこでやるか、という話ですね
repeat-untilの中でaが6になるとループを抜ける
というのはつまり、6にならないとループを抜けない
ということなのはわかりますか?
repeat-untilの中でaを6にする処理が必要です
つまりfor文が書かれるべき場所は…?

さて、上に書いたことが理解いただけたならuntilでループを抜けられるようになったかもしれませんが、状況によっては抜けられていないかもしれません
すなわちuntilに到達した時点でaが7以上になっていた場合ですね
aが6じゃないので抜けられません
forの処理を見る限りaが7以上になる可能性も捨てきれませんから、forもa = 6の時点で抜けられたほうがいいかもしれません
その場合は先のbreakを使います
あるいはuntilの条件式をa >= 6にする

No.1061 2020/12/22(Tue) 22:17:06

Re: ループ処理を抜けたい / stuncloud
にっちもさっちもいかないというならサンプルも書きますけど
その場合は何がしたいか明確にしてしただけますか

・repeat-until内の処理ってなにやってんの?
・赤が6つなら処理を終えたいということは、赤の数は6未満の数からだんだん増えるものなの?増えるならどうすると増えるの?
・赤が7つ以上になっちゃったらどうするの?

このあたりがわかんないです
なんとなく漠然とですけど

repeat
 //なんか処理
until 赤を数える関数() = 6

みたいな事がしたいのかな?という気はしますが
> ・説明不足
> だと十分な回答はできませんよ

の状態は依然続いているのでご協力お願いします

No.1062 2020/12/22(Tue) 22:34:59

Re: ループ処理を抜けたい / YMD
> > a = a + 1
> これをどこでやるか、という話ですね
> repeat-untilの中でaが6になるとループを抜ける
> というのはつまり、6にならないとループを抜けない
> ということなのはわかりますか?
> repeat-untilの中でaを6にする処理が必要です
> つまりfor文が書かれるべき場所は…?


できました!このような初歩的な質問に回答して下さりありがとうございます!

>
> さて、上に書いたことが理解いただけたならuntilでループを抜けられるようになったかもしれませんが、状況によっては抜けられていないかもしれません
> すなわちuntilに到達した時点でaが7以上になっていた場合ですね
> aが6じゃないので抜けられません
> forの処理を見る限りaが7以上になる可能性も捨てきれませんから、forもa = 6の時点で抜けられたほうがいいかもしれません
> その場合は先のbreakを使います
> あるいはuntilの条件式をa >= 6にする


親切にありがとうございます!

No.1063 2020/12/22(Tue) 23:45:04

以下のフォームに記事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