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

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
SearchRocketbbs(掲示板DL検索)
(xdomain更新期限 2020.03.31)

Name
Subject
Color
Cookie / Pass
CSVのゴミを無視したい / 藍
いつもお世話になります。
データが読み込めず困っています。

CSVデータの■部分に変な文字が入っているため読み込むと
一行で終了してしまいます。
■部分を無視して読み込む方法があるのでしょうか??

ご教授よろしくお願いします。


DATA.csvの中身
 "001","データ001■" → ■部分は &8200
 "002","データ002"

// CSVファイルの読込
fid_IN = FOPEN("C:\DATA.CSV", F_READ )    // ファイルオープン
行数=fget(fid_IN,F_LINECOUNT)
For 行 = 1 to FGET(fid_IN, -1) // 行数分
  For 列 = 1 to 2 // 2項目分
    atai = FGET(fid_IN, 行, 列) // GET
    print atai
  next
next
FCLOSE(fid_IN)

以上

No.672 2019/12/01(Sun) 11:13:50

Re: CSVのゴミを無視したい NEW / Rayna
>>672 藍 さん

 &8200 が■に対する何か分からなかったので // おそらくChr(8200)
 Chr(8200), 念の為にChr($8200), 制御文字のChr($00)〜Chr($1F) でテストしてみましたが
 2行目が読めない現象が起きるのは Chr($00) のNull文字のみでした
 ( Chr($0D) のCrや Chr($0A) のLfも怪しいですが1行で終了しなかったので除外 )

 Null文字のときになぜ2行目が読めないかというと
 DATA.csv を作成する過程でNull文字が紛れ込み終端文字と認識されて■以降が書き込めてない
 書き込めてない(実体が無い)から読み出せない、という事です

 ■が Chr(8200) の場合、FOpenのモードによっては?に化けはしても表示はできるので
 "読めない" という現象の再現は出来ませんでした
 ちなみに Chr(8200) のスペースはTrimで消えないので Replace(atai, Chr(8200), "") で消します

 何を用いてcsvを作成したか、■が何なのか(&8200が何なのか)、■以降の実体は本当にあるのか 等がわかれば
 もしくは此方で症状が再現できれば、具体的な助言をできるかもしれません

 検証スクリプト
  http://codepad.org/Euoz2Vlb

No.677 2019/12/02(Mon) 21:27:45

Re: CSVのゴミを無視したい NEW / 藍
Rayna様
検証用スクリプトまで作成していただきありがとうございます。
まずはCSVをどのような行程で作成したのか確認してみます。
ありがとうございました。

No.678 2019/12/03(Tue) 21:15:33
chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したい / シスイ
chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したい

chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したいのですが、色々やってはみたのですが分かりません。
DOMや正規表現で抜き出すことを考えました。h3やリンクURLやリンクテキストを単純に抜き出すことはできるのですが、UWSCのサブメニューUWSC 仮 掲示板というように関連付けをしてうまく抜き出すことができません。なにか良い方法ないでしょうか?


正規表現だと、
Pattern1="LAST_MODIFIED=<#DBL>.+<#DBL>>(.+)</H3>" //H3のテキストをサブマッチで抜き出す
Pattern2="<a href=\<#DBL>(.*?)\<#DBL>.*?>(.*?)</a>|mis" //リンクURLとリンク名をサブマッチで抜き出す

DOMだと、下記のようなスクリプトで

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

w_fp="C:\Users\user\Desktop\リンクurl_リンク名取得.txt"
r_fp="C:\Users\user\Documents\bookmarks_2019_11_30.html"

str=COMMON.Read_ALLText(r_fp)

htmlfile = CreateOleObj("htmlfile")
htmlfile.write( str ) // html文をオブジェクトに全文読込

a0=htmlfile.documentElement.document
a1=a0.Links.length

dim utuwa

FOR A = 0 TO (a1 - 1) //h3
utuwa=utuwa+a0.Links(A).innertext+"$"+a0.Links(A).href+"<#CR>"
NEXT

COMMON.Write_ALLText(w_fp,utuwa)


サブメニューの型としては、下記のようにしたいと思っています。
UWSC
{-
UWSC 仮 掲示板
しろまさ関数
UWSC コバヤシ式
-}
2軍
{-
UWSCで環境変数を読み書きする - Qiita
【UWSC】画像認識 超入門編 UWSC 面倒な作業を自動化! - NAVER まとめ
-}
3軍
{-
サイト名1
サイト名2
-}
AutoHotkey
{-
サイト名1a
サイト名1b
-}
2軍
{-
サイト名2a
サイト名2b
-}

[bookmarks_2019_11_30.html]

<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
It will be read and overwritten.
DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
<DT><H3 ADD_DATE="1519976817" LAST_MODIFIED="1574679307" PERSONAL_TOOLBAR_FOLDER="true">ブックマーク バー</H3>
<DL><p>
</DL><p>
<DT><H3 ADD_DATE="1554610617" LAST_MODIFIED="1574678800">UWSC</H3>
<DL><p>
<DT><A HREF="http://www3.rocketbbs.com/601/siromasa.html" ADD_DATE="1574567147">UWSC 仮 掲示板</A>
<DT><A HREF="http://siromasa.html.xdomain.jp/uwsc/indexRecord.html" ADD_DATE="1574567172">しろまさ関数</A>
<DT><H3 ADD_DATE="1574567226" LAST_MODIFIED="1574567419">2軍</H3>
<DL><p>
<DT><A HREF="https://matome.naver.jp/odai/2142741595874523301" ADD_DATE="1574567313" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAALUlEQVQ4jWNgGAWMLrsZ/lNiABOlLmCBMXa7kOYQ1z2M1HHBwBsw8LEwChgYAIcaBw1aJ9/QAAAAAElFTkSuQmCC">【UWSC】画像認識 超入門編 UWSC 面倒な作業を自動化! - NAVER まとめ</A>
</DL><p>
</DL><p>
<DT><H3 ADD_DATE="1561185922" LAST_MODIFIED="1574566569">AutoHotkey</H3>
<DL><p>
<DT><A HREF="https://so-zou.jp/software/tool/system/auto-hot-key/hotkeys/" ADD_DATE="1574562745">ホットキー | AutoHotKey</A>
<DT><H3 ADD_DATE="1574562979" LAST_MODIFIED="1575107433">2軍</H3>
<DL><p>
<DT><A HREF="https://qiita.com/catfist/items/383833aff7ebe655ef33#%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88send%E3%82%92%E9%96%A2%E6%95%B0%E5%8C%96" ADD_DATE="1574563063">[AutoHotKey]マウスカーソルが非アクティブな指定ウィンドウ上にある場合のホットキー - Qiita</A>
</DL><p>
</DL><p>
</DL>

No.671 2019/12/01(Sun) 06:30:36

Re: chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したい / satocha
dlタグの入れ子でブクマの構造を表現しているみたいなので、
それを利用すればいいのでは。

No.673 2019/12/01(Sun) 11:55:26

Re: chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したい / stuncloud
できた

https://gist.github.com/stuncloud/8e1dbd0e8a1a2e3ac060d651e35823a6

使い方はサンプルを見てください

No.674 2019/12/01(Sun) 12:45:58

Re: chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したい / シスイ
satocha様、コードの書き方が分からなかったんです。
No.675 2019/12/01(Sun) 16:25:29

Re: chromeのブックマークをエクスポートした、htmlファイルをUWSCのpopupmenuのサブメニュー化したい / シスイ
stuncloud様、ありがとうございます。
完璧に希望の通りの処理ができました。
2日間、試行錯誤してもできなかったのに、短時間にこのようなコードが書けるのはすごいです。

No.676 2019/12/01(Sun) 16:27:21
UNIX時間を日付に変換したい / YMK
表題の件です。

あるHPにてタイムスタンプがUNIX時間で得られるのですが、
それを日付に変更したいと思っています。

t = 1575030000 //タイムスタンプ
sc = CreateOleObj("ScriptControl")
Sc.Language = "VBScript"

日付 = Sc.Eval("cdate(((t + 32400) / 86400) + 25569)")

msgbox(日付) // ここで2019年11月29日 21:20:00 を出力して欲しい

よろしくお願いします。

No.663 2019/11/30(Sat) 16:54:48

Re: UNIX時間を日付に変換したい / YMK
自己解決
変数tがダブルクォーテーションに囲まれていただけでした。

t = 1575030000 //タイムスタンプ
sc = CreateOleObj("ScriptControl")
Sc.Language = "VBScript"

t = ((t + 32400) / 86400) + 25569
日付 = Sc.Eval("cdate(" + t + ")")

msgbox(日付) // 2019年11月29日 21:20:00

No.664 2019/11/30(Sat) 18:04:45

Re: UNIX時間を日付に変換したい / yanyan
UWSCの関数で

t = 1575030000
gettime(t/24/3600+9/24,"1970010100000")  //時差
print G_TIME_YY4+"年"+G_TIME_MM2+"月"+G_TIME_DD2+"日"+"<#TAB>"+G_TIME_HH2+":"+G_TIME_NN2+":"+G_TIME_SS2

No.666 2019/11/30(Sat) 20:17:10

Re: UNIX時間を日付に変換したい / YMK
> yanyanさん、有り難うございます。

cdate()だと、実際出力されるのは「2019/11/29 21:20:00」でしたので、
年月日にするために加工処理しなくてはいけなかったのですが、
gettime()だと直接できました。

No.667 2019/11/30(Sat) 21:22:40

Re: UNIX時間を日付に変換したい / Rayna

 ちなみに
 VBS の CDate は変換されたDate型を返しているだけなので
 ScriptControl を使わずに VarType で代替できます
 簡潔にかけるのでおすすめです

 t = 1575030000 //タイムスタンプ
 t = ((t + 32400) / 86400) + 25569
 日付 = VarType(t, VAR_DATE)
 MsgBox(日付) // 2019/11/29 21:20:00

No.669 2019/11/30(Sat) 21:49:43

Re: UNIX時間を日付に変換したい / YMK
>Raynaさん、有り難うございます

VarTypeなる関数を始めて知りました。
もう少し、調べてみます。

No.670 2019/12/01(Sun) 01:29:05
常に保存 / single
お世話になります。
最近、ネットが不安定(同居人が、同じ回線でゲーム三昧が原因かも)で、メールを返信書き中落ちてしまいますので、文字入力中、常に、別保存をメモ記録等していきたいのですが、効率重視であれば、どのような方法がありますか。
GETTIMEで、監視、Threadを動かす等、あまり応用ができないのですが、時間で監視すると、書いていない時も記録してしまうので、簡単で、パソコンの負荷がかからない、最低1文節程度ごとは保存していきたいのです、よろしくご指導ください。

No.658 2019/11/29(Fri) 20:04:31

Re: 常に保存 / stuncloud
> メールを返信書き中落ちてしまい
状況がよくわからないですが、メールソフトが意図せず終了していると仮定したスクリプトを考えてみました
変換の確定時や改行時にEnterが押された際に内容を保存しておき、メールソフトが落ちたらテキストに書き出すという仕組みです


// Enterキーが押される度に保存処理を行われるようにする
sethotkey(VK_RETURN, 0, "SaveText")

// 対象メールソフト起動時にスケジューラから実行させる
public id = getid(GET_SCHEDULE_WIN)
// テキスト一時保存用変数
public text
// 保存先ファイル
file = "mailbackup.txt"

// メールソフトが消えたらテキストを保存してスクリプトを終了する
while status(id, ST_ISID)
 sleep(1)
wend
fid = fopen(file, F_WRITE)
fput(fid, text, F_ALLTEXT)
fclose(fid)
// sethotkey解除
sethotkey(VK_RETURN)

// Enterキー押下時に実行される関数
procedure SaveText(id, )
 // 対象ウィンドウ以外では実行させない
 if status(id, ST_ACTIVE) then
  // sethotkeyが入力を奪ってしまっているので対象ウィンドウにエンターキーの入力を渡す
  sckey(id, VK_RETURN)
  // 保存するテキストを取得
  // 仮の処理なので状況に応じて修正してください
  text = getstr(id, ※ここは適宜変更してください)
 endif
fend

# ちょっと書き直しました

No.659 2019/11/29(Fri) 21:06:59

Re: 常に保存 / single
stuncloudさん、ありがとうございます、こちら説明不足でした。
メール書きは、メールソフトではなく、ここのような掲示板サイトですが、idを取得したり、サイトやエクセルなどのソフトにこだわらず、打っているキーを別途に保存したいのですが、ただそれだけだと現在の自分の力では、ただアルファベット保存になってしまいます。
何か簡単な方法がありますでしょうか、便利なソフトがあればいいのですが、uwscなら何か方法があるかと思いご相談させていただきました。

No.660 2019/11/30(Sat) 00:30:52

Re: 常に保存 / stuncloud
ブラウザ上の話であれば、僕ならtampermonkey等でuserscriptを使って保存や復元ができるようにしますね
UWSCは使いませんしある程度JavaScriptが書ける必要がありますが、任意のwebサイトに自分好みの機能を追加できる手段なのでオススメです

> 何か簡単な方法がありますでしょうか
お察しかもしれませんが大した手間を掛けずにできるような簡単さはこの件では期待できないと思います
というかそこまで簡単なら人に聞くまでないよねっていう

No.661 2019/11/30(Sat) 10:20:20

Re: 常に保存 / Rayna
>>660 single さん
 >> ソフトにこだわらず、打っているキーを別途に保存したい
  キーロガーを作りたいんだったら、API使えば実装できます
  ただ悪用もできるので作りたいなら具体的なことは自分で調べてください

  そうでなく文章の内容を保存することが目的なら
  stuncloudさんの方法 や 難しいなら自動保存機能付きのエディターを下書きに使う手があります
  Windows付属のメモ帳 に自動保存機能を拡張することも出来ますが
  そこまでするなら他のソフト使ったほうが早いしお手軽です
  私は サクラエディタ の自動保存機能を下書きに使ってます
  サクラエディタ に以外にも下書きに特化したソフトはいくらでもあるので調べてみるのもいいかもです

No.662 2019/11/30(Sat) 14:37:28

Re: 常に保存 / single
stuncloudさん、Raynaさん、いつもながら惜しげもない広範な知識、参考になりました。
No.665 2019/11/30(Sat) 19:38:59
連想配列でピポットテーブル風に項目別の最小値を出したい / sen
いつもお世話になっております。
連想配列でピポットテーブル風に項目別の最小値を出したいのです。
全体は1ヶ月が2万行くらいで、12ヶ月あります。
動いたのですが、少し時間が掛かります。
こんなものでしょうか?
もう少し早くなりませんでしょうか?
何卒宜しくお願い致します。

dim 元ファイル=input("在庫帳.csv")
dim 新ファイル="最小値_営業所在庫.CSV"

GETTIME()
print G_TIME_NN+" "+G_TIME_SS

Pピポット風最小値(元ファイル,新ファイル,2,7)

GETTIME()
print G_TIME_NN+" "+G_TIME_SS

PROCEDURE Pピポット風最小値(元ファイル,新ファイル,梱包列,梱包数列)
 dim 梱包,年月
 hashtbl キー,在
 元 = fopen(元ファイル)
 新 = fopen(新ファイル,F_READ or F_WRITE)
  年月 = input("年月を入力:'1912")
  For i = 3 to fget(元,-1)
   梱包 = STRCONV(trim(fget(元,i,梱包列)),SC_HALFWIDTH)
   キー[梱包] = fget(元,i,梱包数列)
  next
  fput(新,"梱包",1,1)
  fput(新,"数",1,2)
  For i = 3 to fget(元,-1)
   for s = 0 to Length(キー)-1
    IFB キー[s,HASH_KEY] = trim(fget(元,i,梱包列)) then
     ifb キー[キー[s,HASH_KEY]] > fget(元,i,梱包数列) then
      キー[キー[s,HASH_KEY]] = fget(元,i,梱包数列)
     endif
     if fget(元,i,梱包列) <> fget(元,i+1,梱包列) then break
    ENDIF
   NEXT
  next
  for s = 0 to Length(キー)-1
   fput(新,キー[s,HASH_KEY] + "," + キー[s,HASH_VAL]) + "," + 年月
   //print s +" = "+ キー[s, HASH_KEY] + " = " + キー[s, HASH_VAL]
  next
 fclose(元)
 fclose(新)
fend

//在庫帳.csv

//在庫帳,,,,,,,
//営業所CD,製品記号,月日,備考,入荷,出荷,残高,注番
//7,TEST1,'10/01,繰越,0,0,1,
//7,TEST2,'10/01,繰越,0,0,2,
//7,TEST2,'10/01,繰越,0,0,3,
//7,TEST3,'10/28,移動,1,0,3,23999
//7,TEST3,'10/30,中部,0,1,4,18011
//7,TEST3,'10/01,繰越,0,0,5,

製品記号は一応ソートされています。

No.621 2019/11/03(Sun) 16:03:00

Re: 連想配列でピポットテーブル風に項目別の最小値を出したい / Rayna
>>621 sen さん

>>こんなものでしょうか?
 わかんないです。
 そちらの環境でどのぐらい時間かかったかはsenさんしか知りません。

 以下のコメントに気をつければ 1/3 以下の時間で処理することができます
 サンプル: 240000行 単純コピペ ソート済み
 Pピポット風最小値_V1_Fixed: 101.972 秒
 Pピポット風最小値_V2   : 29.080 秒

///////////////////////////////////////////////////////////////////////////////////

 Dim 元ファイル=Input("", "在庫帳.csv")
 Dim 新ファイル="最小値_営業所在庫.CSV"

 Dim tm = Val(GetTime()+"."+G_TIME_ZZ)
 Pピポット風最小値_v1_Fixed(元ファイル,新ファイル,2,7)
 Print "Pピポット風最小値_v1_Fixed: "+Round(Val(GetTime()+"."+G_TIME_ZZ)-tm, -3)+" 秒"

//tm = Val(GetTime()+"."+G_TIME_ZZ)
//Pピポット風最小値_V2(元ファイル,新ファイル,2,7)
//Print "Pピポット風最小値_V2   : "+Round(Val(GetTime()+"."+G_TIME_ZZ)-tm, -3)+" 秒"

 Procedure Pピポット風最小値_V1_Fixed(元ファイル,新ファイル,梱包列,梱包数列)
  Dim 梱包, 年月
  HashTbl キー, 在 //| 連想配列 '在' 使われていない
  元 = FOpen(元ファイル)
  新 = FOpen(新ファイル, F_READ Or F_WRITE) //| F_READ 不要
   年月 = Input("年月を入力:'1912")
 //| Forループ1
 //| ・上書きしてるのでコストの割に意味がないループ
 //| ・せっかく何万行も読みに行くので獲得比較代入はここのループで済ます
   For i = 3 To FGet(元,-1)
    梱包 = StrConv(Trim(FGet(元,i,梱包列)),SC_HALFWIDTH)
    キー[梱包] = FGet(元,i,梱包数列)
   Next
   FPut(新, "梱包", 1, 1)
   FPut(新, "数", 1, 2)
 //| Forループ2
 //| ・何万行回もファイルをまた読みに行くので当然時間がかかる
 //| ・前ループで獲得できたものをここで獲得する意味がない
 //| ・FGetとIfのしすぎで処理時間がかかる
 //| ・連想配列のネストで読みにくい
 //|   簡略化例
 //|    For i = 3 To FGet(元, -1)
 //|     For 梱包 In キー
 //|      IFB 梱包 = Trim(FGet(元, i, 梱包列)) Then
 //|       If キー[梱包]>FGet(元,i,梱包数列) Then キー[梱包]=FGet(元,i,梱包数列)
 //|       If FGet(元,i,梱包列)<>FGet(元,i+1,梱包列) Then Break
 //|      EndIf
 //|     Next
 //|    Next
 //| ・Forループ1で事足りるのでそもそも不要
   For i = 3 To FGet(元, -1)
    For s = 0 To Length(キー)-1
     IFB キー[s, HASH_KEY] = Trim(FGet(元, i, 梱包列)) Then
      IfB キー[キー[s, HASH_KEY]]>FGet(元,i,梱包数列) Then
       キー[キー[s, HASH_KEY]] = FGet(元,i,梱包数列)
      EndIf
      If FGet(元,i,梱包列) <> FGet(元,i+1,梱包列) Then Break
     EndIf
    Next
   Next
 //| Forループ3
 //| ・エラー出て動かなかったので推測ですが修正(検証出来ないため)
 //|   FPut(新, キー[s,HASH_KEY]+","+キー[s,HASH_VAL])+","+年月
 //|    → FPut(新, キー[s,HASH_KEY]+","+キー[s,HASH_VAL]+","+年月)
   For s = 0 To Length(キー)-1
    fput(新,キー[s,HASH_KEY] + "," + キー[s,HASH_VAL] + "," + 年月)
    Print " " + キー[s,HASH_KEY] + "," + キー[s,HASH_VAL] + "," + 年月
   Next
  FClose(元)
  FClose(新)
 FEnd
 

No.628 2019/11/06(Wed) 21:01:44

Re: 連想配列でピポットテーブル風に項目別の最小値を出したい / sen
返礼遅れまして済みません。
早く処理できるようになりました。

いつもエクセルを使用して処理するのがよいのか、
エクセルを使わずに処理の方が良いのか、
どちらも不出来なので困ります。

それでもソフトとソフトを自由に繋げて活躍する
uwscの魅力は他のソフトに代えることが出来ません。

質問して良いかどうかもいつも迷いますが、
丁寧に対応して頂いて、感謝の念でいっぱいです。
ありがとうございました。

No.657 2019/11/25(Mon) 20:47:42
配列 / ojin
いつも丁寧に教えていただき感謝しております。
他の方の質問が、あまりないようですので、誰か配列の基本を教えていただきたくお願いいたします。
以下、サンプルで、4行目、5行目は、オーバーで、できません、何故でしょうか。
//dim dat[2][2] = "a",2
//dim dat[2][2] = 1,2, 4,5
//dim dat[2][2] = 1,2, 4,5,3
//dim dat[2][2] = 1,2,3,4,5,6,7, 7,8,9,9
//dim dat[2][2] = 1,2,3,4, 4,5,6,7, 7,8,9,9
dim dat[2][2] = 1,2,3, 4,5,6, 7,8,9
for s in dat
  print s         
next

No.641 2019/11/21(Thu) 18:45:47

Re: 配列 / トンボ
回答として、各要素1つ1つは収納箱のようなもので、物品の数が箱の数(=要素数)を上回るため、エラーになります。
二次元配列の角カッコ内の要素番号が2と2の場合、それぞれの要素数は3個(0〜2)となり、縦3個 * 横3個 = 合計9個が上限になります。

蛇足な配列の教育ですが、縦の要素番号を省略することで要素番号が自動で設定される方法もあります。
スクリプトの記入が容易になりますが、横の要素番号の省略はエラーになります。

dim dat[] = 1,2,3,4,5,6,7,8,9,10  // OK、縦10個
print "縦の要素数:" + length(dat) + " 要素番号:0〜" + (length(dat) - 1)

for s in dat
   print "[" + s + "]"
next
print

dim dat2[][2] = 1,2,3, 4,5,6, 7,8,9, 10  // OK、縦1〜*個、横3個
//dim dat2[2][] = 1,2,3, 4,5,6, 7,8,9, 10  // 省略不可エラー
//dim dat2[][] = 1,2,3, 4,5,6, 7,8,9, 10  // 省略不可エラー

print "縦の要素数:" + length(dat2) + " 要素番号:0〜" + (length(dat2) - 1)
print "横の要素数:" + length(dat2[0]) + " 要素番号:0〜" + (length(dat2[0]) - 1)
print "合計:" + (length(dat2) * length(dat2[0]))

buf = ""
for y = 0 to (length(dat2) - 1)
  for x = 0 to (length(dat2[0]) - 1)
    buf = buf + "[" + dat2[y][x] + "]"
  next
  buf = buf + "<#CR>"
next
print buf

No.642 2019/11/22(Fri) 07:16:57

Re: 配列 / ojin
初心者の質問にお付き合いいただき、ありがとうございます、とても分かりやすいです、ただ、一つ疑問がでました。
以下、5行目に、data[1][1]="B",2,とした場合
1行目で、宣言していて、要素数は2個(0〜1)のはずですが、型が合っていないと出ます、理由はどこにありますでしょうか。

dim data[1][1]
dim data[1][4]
dim dat2a[4]
data[0][0]=5; data[1][0]="A"; dat2a[0]="V"
data[0][1]=3; data[1][1]="B",2,; dat2a[1]="W"
data[0][2]=9; data[1][2]="C"; dat2a[2]="X"
data[0][3]=2; data[1][3]="D"; dat2a[3]="Y"
data[0][4]=6; data[1][4]="E"; dat2a[4]="Z"

No.647 2019/11/22(Fri) 18:13:52

Re: 配列 / トンボ
>data[1][1]="B",2,;
複数の箱が縦横に並べてあり、data[1][1]の場合だと上から2つ目で左から2つ目にある1つの箱を指していて、箱1つにつき収納できる物品は1つまでです。

さらに複数の箱に複数の物品を収納できるのは、dimによる配列宣言時ですので、式が間違っている方面でエラーになっています。(多分データ型が合わないは一切無関係です。)

vba側の配列とか調べてみましたが、大体そんな感じでした。

多分これも誤解の元だと思うんですが、配列以外の変数ならdimを省略できるが、実際は1つ目の変数のみ暗黙的な宣言がされていて、それ以降は宣言になりません。
buf = 1  // 一見値の代入だけに見えるが、同時にdimによる宣言になっている
buf = 2  // 宣言ではない
buf = 3  // 宣言ではない

もしややこしいなら、しばらくはOPTIONを利用して、dimやpublicの記入に慣れていくのもよいでしょう。
OPTION EXPLICIT

No.648 2019/11/22(Fri) 20:35:31

Re: 配列 / ojin
申し訳ございません、箱の認識が理解できていないのですが、以下、3行目がエラーで、5行、6行は、OKになります、どう考えたらよろしいでしょうか。

dim data[1][1]
data[1][1]="B"; //OK
//data[1][1]="B",2,; //NG

dim dat[1][1]="B" //OK
//dim dat[1][1]="B",2 //OK
//dim dat[1][1]="B",2, //OK

No.649 2019/11/22(Fri) 23:45:25

Re: 配列 / トンボ
変数宣言はざっくりに言えば、こんな容器(または箱)を用意すると表明して実際に行う事です。
値の代入は容器に中身(値)を入れる事です。
(水や物を持ち歩くにはコップや段ボールなどの容器が"必須"です。)

@宣言時(dim有り)の要素番号は、y方向とx方向に用意する箱の数になります。
 (方眼紙だと複数マスの面です。)
 dim data[(yの個数 - 1)][(xの個数 - 1)]

A値の代入時など宣言以外(dim無し)の要素番号は、どの箱を指すのかというx,y座標になります。
 (方眼紙だと1マスの点です。)
 data[y座標][x座標]

>3行目がエラーで、
>//data[1][1]="B",2,; //NG

Aの理由で対象が1箱(x=1、y=1)だが、2つ以上の値を強引に代入しようとして、エラーになります。
   0  1
 0[ ][ ]
 1[ ]["B"] ← "B"は代入できても2はどこに代入すればいいの?座標自体が無い…。

 OKにしたいなら5行目のようにするか、下記にします。
 data[1][1]="B"; data[*][*]=2  //*の部分は0か1にする

>6行は、OKになります
>//dim dat[1][1]="B",2, //OK

@の理由で対象が4箱なので、1〜4つの値の一括代入が可能であり、OKになります。
   0  1
 0["B"][ 2 ] ← 左上から順に1つ目の"B"、2つ目の2は代入できます。
 1[  ][  ] ← 3つ目は2の右に,を入れているが、値の指定が無いので空になります。
         (検証困難ですが、空としてそのまま代入しているかも。空に空は無意味ですが。)
          4つ目は値の指定が無いので空になります。(代入すらしない。)

5行目は6行目に似ているため、説明は省略とします。

No.650 2019/11/23(Sat) 09:42:29

Re: 配列 / Rayna
>>649 ojinさん
 トンボさん(>>650) の
  >> 3つ目は2の右に,を入れているが ...
 以降についての補足です

 比較式や代入式の右辺を省略したときもそうなんですけど
 UWSCは省略したものを 空文字列 や EMPTY と解釈することがあります
  // 右辺を空文字列として解釈する例
   Print ""= // True
  // 右辺をEMTPYと解釈する例
   p1()
   Procedure p1(vArg=) // ←初期値代入の省略
    Print VarType(vArg) = VAR_EMPTY // True
   FEnd
 試しに Dim a1[1][1] の 1次元目の省略してみるとEMPTYが代入されている事がわかります
  Dim a1[][1] = "B",2
  Print Length(a1) // 1
  // 3つ目4つめ の代入がないので a1[1][0] は存在しない

  Dim a2[][1] = "B",2,
  Print Length(a2) // 2
  Print VarType(a2[1][0])=VAR_EMPTY // True

  Dim a3[][1] = "B",2,EMPTY
  Print Length(a3) // 2
  Print VarType(a3[1][0])=VAR_EMPTY // True

 a1 は3つ目の代入がないので1次元目の長さは1(内容、大きさは以下と同じ)
  Dim a1x[0][1] = _
   "B", 2
 a2 は3つ目の代入をEMPTYとして解釈しているので1次元目の長さは2
  Dim a2x[1][1] = _
   "B", 2, _
   EMPTY, EMPTY // 1つ目は代入されたEMPTY, 2つ目は配列の初期値のEMPTY

 理解してあえて書いているのでなければ
 バグにつながるので a1,a3 のように省略しないで書くことをおすすめします

--------------------------------------
 >> dim data[1][1]
 >> dim data[1][4]
 これ多重宣言エラーにならないんですね
 知らなかったので検証してみました(既出だったらすみません)

 要素数の変更だけされてるみたいですけど
 VBSのReDimみたいな使用法を想定してたんですかね
 //| test.uws |/////////////////////////////////
 Option //Explicit // 挙動変わらず
  //| 1次元配列
   Dim a1D[1] = 1, 2
   Dim a1D[0]; Print Length(a1D) // 1
   Dim a1D[1]; Print Length(a1D) // 2
   Dim a1D[0]; Print Length(a1D) // 1
   Dim a1D[-1], a1D[-1] // 続けて書いてもスルー
 // Dim a1D[1] = 1, 2 // 再代入は不可 // ERRMSG: '変数: A1D は既に宣言されています'
  //| 2次元配列
   Dim a2D[1][1] = 1,2, 3,4
   Dim a2D[0][0]; Print Length(a2D)+","+Length(a2D[0]) // 1,1
   Dim a2D[0][1]; Print Length(a2D)+","+Length(a2D[0]) // 1,2
   Dim a2D[0][0]; Print Length(a2D)+","+Length(a2D[0]) // 1,1
   Dim a2D[1][0]; Print Length(a2D)+","+Length(a2D[0]) // 2,1
   Dim a2D[0][0], a2D[0][0] // 続けて書いてもスルー
 // Dim a2D[1][1] = 1,2, 3,4 // 再代入は不可 // ERRMSG: '変数: A2D は既に宣言されています'
 ///////////////////////////////////////////////

No.651 2019/11/23(Sat) 13:09:10

Re: 配列 / ojin
箱の数宣言とx,y座標の2つがあったのですね、ありがとうございました。
ネットでも調べてもようやくわからず、甘えてしまいましたが、これは、たぶん、自分で調べては、一生わからず死んでしまう内容でした。
トンボさん、あたらめて、感謝申し上げます。
Raynaさんの内容は、1日にらめっこしていますが、各行すべてx,y座標のことという認識で間違いございませんでしょうか。
また、次元配列は、どのような場合に使うというものがありますでしょうか、基礎がないトンチンカンな質問でまったく申し訳ないです。
Dim a1[][1] = "B",2
Dim a2[][1] = "B",2,
Dim a3[][1] = "B",2,EMPTY
Dim a1D[1] = 1, 2
Dim a1D[0]
Dim a1D[1]
Dim a1D[0]
Dim a1D[-1], a1D[-1]
Dim a2D[1][1] = 1,2, 3,4
Dim a2D[0][0]
Dim a2D[0][1]
Dim a2D[0][0]
Dim a2D[1][0]

No.652 2019/11/23(Sat) 16:33:00

Re: 配列 / トンボ
>各行すべてx,y座標のことという認識で間違いございませんでしょうか。
値の代入も同時に行えますが、dim有りは変数宣言なので、箱の数(-1)の方になります。

>また、次元配列は、どのような場合に使うというものがありますでしょうか
Excelの表内のように多数のデータを扱いたい場合に使います。
//1次元配列の例 名前
dim data1[] =_
 "山田", _
 "花子", _
 "田中"

//2次元配列の例 名前 性別
dim data2[][1] = _
 "山田", "男", _
 "花子", "女", _
 "田中", "男"

>VBSのReDimみたいな使用法を想定してたんですかね
raynaさん、本家掲示板検索ツールで軽く調べましたが、正式ルールか不具合かは不明でした…。うーん。
ojinさん、同一の配列名で再宣言(dim)は避けることを推奨します。redimならまだしもdimなので記述的にも処理的にも混乱しやすく、ヘルプに多重宣言は掲載されてないので、私なら控えますね…。

No.654 2019/11/24(Sun) 20:07:48

Re: 配列 / ojin
とても分かりやすく教えていただき、ありがとうございました。
No.655 2019/11/24(Sun) 22:14:13

Re: 配列 / Rayna
>>652 ojinさん

 質問についてはトンボさんが答えてくださったので省きます
 ありがとうございます

 破線以降はあくまでも検証なので
 Dimの本来の使い方とは異なりますし
 トンボさんと同じ理由で避けるべきだと思ってます
 なので無視して大丈夫です

 スレッド変えるべきでしたね

No.656 2019/11/25(Mon) 20:18:13
名前を付けて保存中の判定 / y
職場内のDWHから、サイズの大きなファイル foo.csv を出力
(名前を付けて保存)して、出力が完了したら加工処理に
進むスクリプトを書いています。

出力(保存)が完了したかどうかの判定を次のようにしていて、
一応うまくいくのですが、もっとよい書き方がありそうな気がして、
ご意見いただけないかと思い投稿しました。


//--------------------

While True

ret = DOSCMD("rename E:\foo.csv E:\dummy.csv")

if pos("プロセスはファイルにアクセスできません。", ret) > 0 then

DOSCMD("rename E:\foo.csv E:\dummy.csv")

Break

endif

Sleep(1)

Wend

//------以上

この方法は、ネットで見つけた「DOSコマンドの rename 命令が
失敗する間は保存中であると判断できる」という情報に基づきます。

当方の環境では、rename命令に失敗すると、コマンドライン出力に、
「プロセスはファイルにアクセスできません」(※)という文字列が
出力されるようなので、それを失敗判定に使っています。

・失敗時のメッセージは必ず (※) なのか不安
・ファイル名を変えて、また戻すという処理の気持ち悪さ

が不満です。

No.643 2019/11/22(Fri) 09:06:11

Re: 名前を付けて保存中の判定 / y
すみません、スクリプトのサンプルが間違っていたので訂正します

//--------------------

While True

 ret = DOSCMD("rename E:\foo.csv E:\dummy.csv")

 if pos("プロセスはファイルにアクセスできません。", ret) > 0 then

  DOSCMD("rename E:\dummy.csv E:\foo.csv")

  Break

 endif

Sleep(1)

Wend

//------以上

No.644 2019/11/22(Fri) 09:10:33

Re: 名前を付けて保存中の判定 / satocha
昔書いたのがありました。
https://plaza.rakuten.co.jp/satocchia/diary/201411180000/

やっていることはrenと変わりませんが、ファイルをwriteモードでオープンしてエラーになれば使用中と判断しています。

No.645 2019/11/22(Fri) 10:40:19

Re: 名前を付けて保存中の判定 / y
> satocha様

ありがとうございます。
こちらの書き方のほうがはるかにスマートですね。

No.646 2019/11/22(Fri) 16:52:52

Re: 名前を付けて保存中の判定 / しろまさ
uwscのfopenで排他モード指定があるので、
開けなかったら・・・はそれで出来ると思いますよ。

No.653 2019/11/24(Sun) 06:28:43
立ち上げ確認 / ojin
お世話になっております。
デスクトップに、予めUWSCを起動させておいて、指定のエクセルファイルやアプリを立ち上げた場合、メッセージを出したいのですが、GETIDとifを駆使するのだろうとしか検討がつきません、このような場合、どのようなスクリプトを組んでいく形になるかご教授ください。

No.636 2019/11/14(Thu) 20:38:29

Re: 立ち上げ確認 / satocha
スクリプトはたった1行
msgbox("出したいメッセージ")
です。
これを例えば
c:\folder\showmessage.uws
に保管したとして話を進めると、
uwscのアイコン右クリック→設定→スケジュール設定をする
と進んでスケジュール設定ウインドウを開きます。

空欄のスクリプト欄にc:\folder\showmessage.uwsを入力。

次にタイマー欄をクリックするとタイマー設定ウインドウが開きます。
ラジオボタンの一番下、「指定ウインドウが現れたとき」をチェック。
ウインドウタイトルとクラスに、エクセル画面のタイトルとウインドウクラスを入力してください。

ウインドウのタイトル、クラスの確認は眠たい詩人さんの「UWSCコードの断片生成器」を使うのが簡単です。
と書いたところで、眠たい詩人さんのサイトが閉鎖されていることに気付きました。
インターネットアーカイブのアドレスを記しておきます。
https://web.archive.org/web/20160822063220/http://nem.symphonic-net.com/uwsct/fcuc.uws.txt

ほかのツールでは
autoitのAu3Info.exeが使いやすいです。
https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.zip

No.637 2019/11/15(Fri) 06:23:53

Re: 立ち上げ確認 / ojin
スケジュール設定ができるんですね、ありがとうございます。
エクセルのウインドウのタイトル、クラスの確認をしようと断片生成器を動かしてみましたが、28/48で停止したまま動きませんでしたので、取得することができませんでした。
また、autoitは、英語なのでわからずです、申し訳ありませんが、スケジュール設定でないもので作成する方法はございますでしょうか。
While Wendで監視する形が良さそうというのは、HELPでわかりましたので、その先は、タイトル、クラスの確認さえわかればなんとかなるような気がしています。

No.638 2019/11/15(Fri) 23:05:25

Re: 立ち上げ確認 / satocha
>スケジュール設定でないもので作成する方法はございますでしょうか。
どんなやり方でもウインドウタイトルとクラスは必須です。逆にそれがわかれば、スケジュール設定が一番簡単だということです。

>タイトル、クラスの確認さえわかればなんとかなるような気がしています。
str=""
for id in getallwin()
 str=str+"title="+status(id,st_title)+"<#CR>"
 str=str+"class="+status(id,st_class)+"<#CR>"
 str=str+"--------------------------------<#CR>"
next
sendstr(exec("notepad"),str)

これで開いている全ウインドウのタイトルとクラスを列挙できます

No.639 2019/11/16(Sat) 02:13:51

Re: 立ち上げ確認 / ojin
スケジュールできました!satochaさん、感謝申し上げます。
こんなことまで、うみうみさん、準備していてくれたとは、いまさら驚きです。

No.640 2019/11/16(Sat) 06:34:55
スクリプト実行中の文字化け / 佐助
お世話になります。
スクリプトが実行中に文字化けしてしまいエラーを度々起こすのですが、当方の環境の問題なのでしょうか?

本日はFALSEが「FA<SE」と読まれてしまったようで、
実行中に「変数:FA<SEが定義されていません」というエラーが出てしまい
スクリプトが停止してしまいました。

化ける文字列は毎回決まったものではなく、変数名であったり関数であったりと様々です。

何か回避策などご存じの方がいらっしゃいましたら教えていただきたいです…。

No.629 2019/11/09(Sat) 01:11:45

Re: スクリプト実行中の文字化け / satocha
そのスクリプトを普段遣いとは別のエディタで開いてみても正常(falseのまま)なら、メモリエラーの可能性があります。メモリチェッカで調べ、おかしかったら交換してください。ツールと参考サイトを挙げておきます。

memtest86
https://pctrouble.net/software/memtest86.html

memtest86+
https://pctrouble.net/software/memtest86p.html

windowsのメモリチェッカ
https://pc-karuma.net/windows-7-run-memory-diagnostic/
https://www.atmarkit.co.jp/ait/articles/1810/01/news015.html

No.630 2019/11/09(Sat) 09:02:02

Re: スクリプト実行中の文字化け / 佐助
satochaさん

別のエディタで開いても、falseで間違いないようです。
memtest86+も4周ほどさせてみましたが、エラーは発生しませんでした。

エラーは相変わらず発生箇所を変えて出ており、原因の特定ができないですね…。

No.634 2019/11/13(Wed) 07:43:29

Re: スクリプト実行中の文字化け / satocha
メモリ以外の可能性となると、UWSC.exeファイルがおかしくなっているぐらいでしょうか。
現在のuwsc.exeをリネームし、別途、uwsc.exeをダウンロードして実行してみてください。

No.635 2019/11/13(Wed) 15:39:06
functionの引数に配列は入れられない? / ある
表題の通りで、「次元数が合いません」エラーとなります。

VBAだと引数、戻り値に配列は使えた記憶があるのですが、
uwscだと出来ないんでしたっけ?

No.631 2019/11/10(Sun) 03:03:21

Re: functionの引数に配列は入れられない? / stuncloud
できますよ

// 引数では配列、連想配列、SafeArrayを受けられる

dim arr[] = 1,2,3
hashtbl hash
hash[1] = 1
hash[2] = 2
hash[3] = 3
safe = split("1 2 3")

func1(arr)
func1(hash)
func1(safe)

procedure func1(arr[]) // []を付けて配列だと明示する
 print join(arr)
fend

// 戻り値はSafeArrayのみ

safe = func2()
print join(safe)

function func2()
 result = split("1 2 3")
fend

// 例外
// SafeArrayしか受けないという場合は[]がなくても良い

safe = split("1 2 3")
func3(safe) // エラーにならない

procedure func3(safe) // []なし
 print join(safe)
fend

No.632 2019/11/10(Sun) 10:54:02

Re: functionの引数に配列は入れられない? / ある
stuncloudさん

基本は明示的に[]を付ける必要があるのですね。

ヘルプを見ても書いてありましたね。
今後、書き込む前にヘルプ見る癖つけます。

解決しました。
ありがとうございます!

No.633 2019/11/10(Sun) 13:10:46

SearchRocketbbs(掲示板DL検索)

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

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

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

Rocket Board Type-X (Free) Rocket BBS