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

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

テーブルという考えについてお教えください。 / ながいも
たびたびすいません。
先ほど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
ブラウザでOneDrive上のExcelを操作する場合 / KEI
Excelを操作するようにOneDriveからブラウザ上でのExcelを操作するにはどうすれば良いでしょうか?
A1の値を取得したりセットしたりA1をB2にコピーしたいです。


ID = GETID("〇〇〇.xlsx - Microsoft Excel Online - Internet Explorer","IEFrame")

//選択中のセルにはABCが入力できましたが場所指定できません。
sendstr(ID,"ABC")

//comエラー
print ID.Workbooks("〇〇〇.xlsx").Worksheets("Sheet1").cells[4,2].value


//下記のようにしてみてもcomエラークラス文字列が無効です と言われました
EXCEL = GETACTIVEOLEOBJ("〇〇〇.xlsx - Microsoft Excel Online - Internet Explorer")

No.806 2020/05/06(Wed) 13:23:07

Re: ブラウザでOneDrive上のExcelを操作する場合 / stuncloud
ブラウザはExcelではないのでExcelと同じように操作することはできません
OneDriveであればローカルにファイルが同期できるので、それをExcelで開けば良いと思います

どうしてもブラウザでやりたいというのであれば、ブラウザ操作を頑張るかショートカットキーを駆使するなどでできるかもしれません

No.807 2020/05/06(Wed) 20:55:24

Re: ブラウザでOneDrive上のExcelを操作する場合 / Rayna
>>806 KEI さん

//| sendstr(ID,"ABC")
 IEのウインドウIDを獲得して
 IEのウインドウに対して"ABC"を送信してることになります
 入力出来たのはフォーカスをもったコントロールに対して文字列を送信できたためです

//| print ID.Workbooks("〇〇〇.xlsx").Worksheets("Sheet1").cells[4,2].value
 GetId で獲得できるのは
 UWSCがウインドウを識別するために使用する識別子(整数型)であり
 オブジェクト型ではありません、なので当然COMエラーが起きます

 COMオブジェクトを使いたいなら
 CreateOleObj か GetActiveOleObj で "Excel.Application"
 を指定して獲得しましょう

//| EXCEL = GETACTIVEOLEOBJ("〇〇〇.xlsx - Microsoft Excel Online - Internet Explorer")
 これはエラーメッセージに書いてある通りです
 COMのクラス文字列 を指定すべきところに
 IEのウインドウタイトル を指定したためです


COMが扱える環境なら
インストール済みのExcelを使ってローカルのOneDriveフォルダから読み書きするほうが
IEを操作してドキュメント上の要素を読み書きするより敷居が低いかと思われます

No.808 2020/05/06(Wed) 21:17:42

Re: ブラウザでOneDrive上のExcelを操作する場合 / KEI

stuncloudさま、Raynaさま返信ありがとうございます。
ブラウザ上で動作できれば理想だったのですが
無理があると言うことがわかりました。
ローカルで処理します
ありがとうございました。

No.809 2020/05/09(Sat) 15:23:36
inputとfukidasiの表示レイヤー順 / 太田
お世話になります。
inputの入力ダイアログとfukidasi(balloon)を重ねて表示すると
fukidasiのほうが上に来ます。
逆にinputボックスを上にすることは出来ますでしょうか?

No.800 2020/04/28(Tue) 12:52:03

Re: inputとfukidasiの表示レイヤー順 / しろまさ
fukidasi("a")
input("b")
// これで普通にinputがアクティブになりますが、何を求めてます? 

No.801 2020/04/28(Tue) 13:31:21

Re: inputとfukidasiの表示レイヤー順 / satocha
> fukidasi("a")
> input("b")
> // これで普通にinputがアクティブになりますが、何を求めてます? 


アクティブにはなるけど、両方のウインドウを重ねるとfukidasiの下にmsgboxが隠れてしまいます
こうやれば、両ウインドウの優先順位を変更できます

if param_str[0]="ibox_func"
  sendstr(0,input(param_str[1]))
  exitexit
endif

ibox("メッセージボックス")
mid=getid(,"TUinpBox_uwsc")
fukidasi("吹き出し",status(mid,st_x),status(mid,st_y))
//この1行でメッセージボックスを上に出すことができる
ctrlwin(mid,topmost)

while status( mid, st_isid )
  sleep(0.1)
wend
exitexit
procedure ibox(input_message)
  uws=get_cur_dir + "\" + get_uwsc_name + " "
  uwscexe=GET_UWSC_DIR + "\uwsc.exe "
  cmdline=uwscexe + uws + "ibox_func " + input_message
  exec( cmdline )
  mid=getid(,"TUinpBox_uwsc")
  while !status( mid, st_isid )
  wend
fend

No.802 2020/04/28(Tue) 13:44:40

Re: inputとfukidasiの表示レイヤー順 / satocha
書き忘れ
msgboxじゃなくinputboxなのに入力値を受け取る方法が書かれていませんでした
getstr(0)で受け取れます

ざっとスクリプトを説明すると、
input,msgbox,slctboxなどユーザの入力待ちをする組み込み関数のウインドウを操作したい場合、threadで呼んでも、ユーザが入力を終えるまで処理が帰ってきません

戻ってきたときには、そのウインドウは消えているので、操作する意味がありません

そこでどうするかというと、
自分自身を特別な引数をつけてexecコールすることでこの問題を回避しています

同じような方法でmsgboxなどほかのダイヤログも操作できます

※太田さんへ
inputboxの内容を見せたいだけなら、fukidasiの引数で透明度を設定できますので、下の画面を読むことは可能です。その場合はこんな面倒な方法はいりません。
詳しくはヘルプを参照してください

No.803 2020/04/28(Tue) 14:37:09

Re: inputとfukidasiの表示レイヤー順 / しろまさ
なるほど、重ねて表示してかつInputを上にということですね。
必ずずらすか消してから表示してたので発想できませんでした。ありがとうございます。

No.804 2020/04/28(Tue) 14:50:37

Re: inputとfukidasiの表示レイヤー順 / 太田
satocha様、ありがとうございました。解決しました。
全画面を真っ黒に覆うfukidasiをinputボックスのPWDで解除する、かなり強引なスクリーンセーバーを作成していました(笑
TUinpBox_uwsc、なるほどですねー!

No.805 2020/04/30(Thu) 10:47:27
エクセル / tamatama
EXCELをUWSCで操作するメリット、VBAやマクロでできないことがあればできるだけ多く教えてください。
No.773 2020/03/12(Thu) 07:15:45

Re: エクセル / しろまさ
怠け質問なのでめんどくさくて誰も答えないのだけれども、
放置も可哀想なのでできるだけ親切丁寧に答えてみると、
「自分で試して自分で見極めろ」 です。もう答えませんのであしからず。

No.778 2020/03/23(Mon) 12:35:08

Re: エクセル / sen
私はResを付けるレベルでもありませんが、いつも教えて頂いているのでコメントさせて下さい。

?@エクセルと他のソフトを連続して自動化できる。
?Aマクロの保存先のないcsvファイルを操作しやすい。
?Bインターネットの扱いも簡単。
?Cそれらが私のような素人でも扱えるくらい簡単であるという事が最大の魅力です。

私は仕事でのみUWSCを使用していますが、毎日感謝しかありません。
是非、UWSCの世界を堪能して頂きたいと思います。

No.799 2020/04/22(Wed) 22:55:14
ローカルグループポリシーの自動化について教えてください / きひ
uwscプログラムの書き方について質問です。

Windows10のローカルグループポリシー内の処理を自動化で行いたいのですが、1カ所動かない場所があります。

ローカルグループポリシーエディタ→コンピュータの構成→管理用
テンプレート→システム→資格情報の委任→NTMLのみのサーバー認証で保存された資格情報の委任を許可する

値:有効
サーバを一覧に追加→表示
表示するコンテンツの値にホスト(例:TERMSRV/*)を入力
OK

この動作を自動化したいのですが、表示するコンテンツのウインドウ上がどうしても動きません。

どなたか、構文で教えていただけないでしょうか。

No.794 2020/04/17(Fri) 13:53:13

Re: ローカルグループポリシーの自動化について教えてください / しろまさ
ローカルグループポリシーエディターが管理者実行されているので 
uwsも昇格(管理者実行)の必要があります。

DEF_DLL IsUserAnAdmin():BOOL:shell32  // 実行権限取得
DEF_DLL ShellExecuteA(Long, String, String, String, String, Long): Long: Shell32.dll
Ifb ! IsUserAnAdmin()  //  非昇格実行の場合
  ShellExecuteA(0, "runas", GET_UWSC_DIR + "\uwsc.exe", GET_CUR_DIR + "\" + GET_UWSC_NAME, "", 1)  //  昇格起動
Else           //  昇格実行の場合
// ウィンドウを表示するところまでは省略
  wID = GetID("NTLM のみのサーバー認証で既定の資格情報の委任を許可する")
  ClkItem(wID, "有効")
  ClkItem(wID, "表示...")
  wID = GetID("表示するコンテンツ")
  ScKey(wID, VK_SHIFT, VK_TAB, VK_F2)
  SendKBD("TERMSRV/*")
EndIf
Procedure  SendKBD(a)
  Dim i, n, Key[]  = "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","32","s49","s50","s51","s52","s53","s54","s55","s56","s57","106","107","188","189","190","191","48","49","50","51","52","53","54","55","56","57","186","187","s188","s189","s190","s191","192","s65","s66","s67","s68","s69","s70","s71","s72","s73","s74","s75","s76","s77","s78","s79","s80","s81","s82","s83","s84","s85","s86","s87","s88","s89","s90","219","220","221","222","s226","s192","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","s219","s220","s221","s222"
  If GetKeyState(TGL_CAPSLOCK)  Then KBD_W(VK_SHIFT, VK_CAPITAL)
  For i = 1  To Length(a)
    n = Key[ASC(Copy(a, i, 1))]  ; If ChkNum(n)  Then KBD(n)  Else KBD_W(VK_SHIFT, Copy(n, 2))
  Next
FEnd
Procedure  KBD_W(a_Key1, a_Key2)  // a_Key1 を押しながら a_Key2 押下
  KBD(a_Key1, 1);  KBD(a_Key2);  KBD(a_Key1, 2)
FEnd

No.796 2020/04/17(Fri) 15:16:08

Re: ローカルグループポリシーの自動化について教えてください / きひ
しろまさ様

ありがとうございます。

〉〉ローカルグループポリシーエディターが管理者実行されているので 
〉〉uwsも昇格(管理者実行)の必要があります。

この概念を初めて知りました。
お陰様で動いてくれましたし、別の場所で悩んでいた部分でも
解決できました。
ありがとうございます。

No.798 2020/04/17(Fri) 16:54:32
uwscで直接MySQLにデータを追加する方法 / しすい
MySQLをphpmyadminというツールで利用しているのです。uwscで直接MySQLにデータを追加したいです。
しろまささんサイトにあるpdoをみたりしたのですが、SQLEXPRESSやSQliteの接続でした。
SQLEXPRESSの接続コードが下記なのですが、MySQLにデータを追加をUWSCでダイレクトにできる方法ないでしょうか?

---------------------
//MYSQL接続
$dsn='mysql:dbname=ss71;host=m.star.ne.jp';
$user='ss71';
$password='uv';

$dbh=new pdo($dsn,$user,$password);
$dbh->query('SET NAMES UTF-8');

$nickname=$_POST['nickname'];
$email=$_POST['email'];
$goiken=$_POST['goiken'];


//データ追加
$sql='INSERT INTO anketo (nickname,email,goiken) VALUES("'.$nickname.'","'.$email.'","'.$goiken.'")';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$dbh=null;

---------------------
Const adOpenStatic = 3 // 静的カーソル

Dim Data_Source = "abc"
Dim DB_FileName = "def"
Dim DB_ID = "ghi"
Dim DB_Password = "aaaaa"

Dim Cn = CreateOleObj("ADODB.Connection")
Cn.ConnectionString = _
"Provider=Sqloledb" _
+ ";Data Source=" + Data_Source _
+ ";Initial Catalog=" + DB_FileName _
+ ";user id=" + DB_ID _
+ ";password=" + DB_Password _
+ ";Connect Timeout=15"
Cn.Open() // コネクション(接続)実行

Dim RS = CreateOleObj("ADODB.Recordset")
Dim StrSQL = "Select * From anketo WHERE 1" // %=ワイルドカード
RS.Open(StrSQL, Cn, adOpenStatic) // SQL実行 レコードセット取得

No.793 2020/04/17(Fri) 11:30:10

Re: uwscで直接MySQLにデータを追加する方法 / しろまさ
https://medium.com/pasocafe/excel-mysql%E9%80%A3%E6%90%BA-%EF%BC%95-excel-vba%E3%81%A7mysql%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6crud%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-7098531f8da2

VBAからMySQLに接続してる方の参考URLです。
Ado使えばそのまま出来そうですね。
今のところ需要は無いので私が作成したものはありません。

No.795 2020/04/17(Fri) 15:05:05

Re: uwscで直接MySQLにデータを追加する方法 / しすい
しろまさ様、回答ありがとうございます。
教えて頂いた、URL見てみましたがけっこう複雑ですね。
少しずつやっていきたいと思います。

No.797 2020/04/17(Fri) 15:47:15
アクティブなエキスプローラーで選択しているファイルのフルパスを取得して指定のブラウザーで起動 / しすい
アクティブなエキスプローラーで選択しているファイルのフルパスを取得して指定のブラウザー(chrome)で起動したいのですが、
アクティブなエキスプローラーで選択しているファイルのフルパスを取得方法が分かりません。
下記のようにやろうと思っていますが、pathのフルパスがわかってもchromeでpathで接続になりません。

ご教授願いませんか?


path="ここの取得が分からない"
exe="C:\Program Files (x86)\Google\Chrome\Applicatio#n\chrome.exe"
exec( exe + " " + path )

No.788 2020/04/13(Mon) 16:53:36

Re: アクティブなエキスプローラーで選択しているファイルのフルパスを取得して指定のブラウザーで起動 / stuncloud
> アクティブなエキスプローラーで選択しているファイルのフルパスを取得方法が分かりません。

shell = createoleobj("Shell.Application")
for e in shell.Windows()
 if pos("\Explorer.EXE", e.FullName) > 1 then // Explorerかどうかの判定

  path = e.Document.FocusedItem.Path
  break

  // Explorerのウィンドウが複数ある場合は以下を使って区別してください
  // e.LocationName (開いてるフォルダの名前)
  // e.LocationURL (開いてるフォルダのURL、file:/// から始まる)

 endif
next

msgbox(path)

ファイルが複数選択されている場合には対応できません (いずれか一つのパスのみ返る)

> 下記のようにやろうと思っていますが、pathのフルパスがわかってもchromeでpathで接続になりません。
> exe="C:\Program Files (x86)\Google\Chrome\Applicatio#n\chrome.exe"


typoしているからです
Applicatio#n → Application
あと <#DBL> でくくっといたほうが良いかもしれないです

exec(exe + " <#DBL>" + path + "<#DBL>")

No.789 2020/04/14(Tue) 15:25:06

Re: アクティブなエキスプローラーで選択しているファイルのフルパスを取得して指定のブラウザーで起動 / satocha
すごい
さすがstuncloudさん
さっと書けてしまう

でも、こういうエレガントなことができなくても
uwscは力技で何とかなったりもします

id=getid(,"CabinetWClass")
ctrlwin(id,activate)
kbd(vk_shift,down)
kbd(vk_apps,click)
kbd(vk_shift,up)
kbd(vk_a,click)
sleep(0.1)
msgbox(getstr(0))

No.790 2020/04/14(Tue) 17:25:07

Re: アクティブなエキスプローラーで選択しているファイルのフルパスを取得して指定のブラウザーで起動 / しすい
stuncloud様、ありがとうございます。

>e.Document.FocusedItem.Path
>e.LocationName (開いてるフォルダの名前)
>e.LocationURL (開いてるフォルダのURL、file:/// から始まる)


このような、取得方法があるとは知らなかったです。
さすが、知識のストック量がすごいです。

No.791 2020/04/14(Tue) 18:32:10

Re: アクティブなエキスプローラーで選択しているファイルのフルパスを取得して指定のブラウザーで起動 / しすい
satocha様、ありがとうございます。

このような方法もあるんですね、勉強になります。

No.792 2020/04/14(Tue) 18:33:37

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