QSORT

タグ: ,
構文
QSORT( varキー配列, [順列, var配列, var配列, ...] )
引数
キー配列
ソートされる配列変数名
順列
QSRT_A(0)
昇順 (デフォルト)
QSRT_D(1)
降順
QSRT_UNICODEA(2)
UNICODE文字比較 昇順
QSRT_UNICODED(3)
UNICODE文字比較 降順
QSRT_NATURALA(4)
自然順ソート 昇順
QSRT_NATURALD(5)
自然順ソート 降順
配列
配列変数名、キー配列のソートと連動
戻値

プログラム実行例

サービスをすべて取得し、そのサービスをユーザーが開始・停止できるかどうかをブール値で返す

DIM Shell = CREATEOLEOBJ("Shell.Application") DIM str = DOSCMD("sc query state=all | findstr /B <#DBL>SERVICE_NAME:<#DBL>") DIM Matches = reExecute(str, "SERVICE_NAME: (.*?)\r\n") DIM services[Matches.Count] FOR n = 0 TO Matches.Count - 1 DIM service = Matches.Item(n).SubMatches(0) services[n] = service + ":" + Shell.CanStartStopService(service) NEXT QSORT(services, QSRT_UNICODEA) FOR service IN services PRINT service NEXT ////////////////////////////////////////////////// // 【引数】 // str : 正規表現による検索の対象となる文字列 // Pattern : 正規表現で使用するパターンを設定 // IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse // Global : 文字列全体を検索する場合はTrue、しない場合はFalse // 【戻値】 // 正規表現で検索した結果をMatchesコレクションとして返します。 ////////////////////////////////////////////////// FUNCTION reExecute(str, Pattern, IgnoreCase = TRUE, Global = TRUE) DIM re = CREATEOLEOBJ("VBScript.RegExp") re.Pattern = Pattern re.IgnoreCase = IgnoreCase re.Global = Global RESULT = re.Execute(str) FEND
結果
AarSvc_4de65:False
AdobeARMservice:False
AJRouter:False
ALG:False
ALUpdateService:False
(中略)
WwanSvc:False
XblAuthManager:False
XblGameSave:False
XboxGipSvc:False
XboxNetApiSvc:False

配列の中身を昇順で並び替える

DIM arr[] = 674, 8, 957, 254, 6014, 36, 378 QSORT(arr, QSRT_A) FOR item IN arr PRINT item NEXT
結果
8
36
254
378
674
957
6014

配列の中身を降順で並び替える

DIM arr[] = 586, 36, 7528, 61, 872, 3695, 142 QSORT(arr, QSRT_D) FOR item IN arr PRINT item NEXT
結果
7528
3695
872
586
142
61
36

多次元配列を一次元配列として昇順で並び替える

DIM arr[1][7] arr[0][0] = 25; arr[1][0] = 37; arr[0][1] = 49; arr[1][1] = 76; arr[0][2] = 25; arr[1][2] = 38; arr[0][3] = 2; arr[1][3] = 23; arr[0][4] = 11; arr[1][4] = 6; arr[0][5] = 11; arr[1][5] = 23; arr[0][6] = 48; arr[1][6] = 25; arr[0][7] = 73; arr[1][7] = 23; QSORT(arr, 0) FOR item IN arr PRINT item NEXT
結果
2
6
11
11
23
23
23
25
25
25
37
38
48
49
73
76

二次元配列を昇順で並び替える

DIM arr[1][7] arr[0][0] = 25; arr[1][0] = 37; arr[0][1] = 49; arr[1][1] = 76; arr[0][2] = 25; arr[1][2] = 38; arr[0][3] = 2; arr[1][3] = 23; arr[0][4] = 11; arr[1][4] = 6; arr[0][5] = 11; arr[1][5] = 23; arr[0][6] = 48; arr[1][6] = 25; arr[0][7] = 73; arr[1][7] = 23; QSORT(arr[0], 0, arr[1]) FOR n = 0 TO UBound(arr[0]) PRINT arr[0][n] + "," + arr[1][n] NEXT ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND
結果
2,23
11,6
11,23
25,38
25,37
48,25
49,76
73,23

総段落数を取得

CONST wdDoNotSaveChanges = 0 CONST wdSaveChanges = -1 DIM arr[-1] FOR n = 0 TO GETALLWIN() - 1 arrayPush(arr, ALL_WIN_ID[n]) NEXT arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)") arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr) QSORT(arr, QSRT_A) TRY DIM Word = GETACTIVEOLEOBJ("Word.Application") EXCEPT MSGBOX("操作する文書を開いてださい。") EXIT ENDTRY DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr) IFB res = -1 THEN MSGBOX("ファイル名が選択されなかったので終了します。") EXIT ENDIF Word.Documents(res).Activate PRINT Word.ActiveDocument.Paragraphs.Count ////////////////////////////////////////////////// // 【引数】 // array : 一次元配列 // callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 // 【戻値】 // callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。 ////////////////////////////////////////////////// PROCEDURE arrayFilter(var array[], callback) DIM n = 0 DIM tmp[-1] FOR %val% IN array IFB EVAL(callback) THEN RESIZE(tmp, n) tmp[n] = %val% n = n + 1 ENDIF NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // callback : 配列の各要素に適用するコールバック関数 // array : コールバック関数を適用する配列 // 【戻値】 // callback関数を適用した後、 適用後の要素を含む配列 ////////////////////////////////////////////////// PROCEDURE arrayMap(callback, var array[]) DIM tmp[RESIZE(array)] DIM n = 0 FOR %val% IN array tmp[n] = EVAL(callback) n = n + 1 NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // array : 要素を追加する配列(参照引数) // str : 追加する要素 // 【戻値】 // 処理後の配列の中の要素の数 ////////////////////////////////////////////////// FUNCTION arrayPush(var arr[], str) DIM res = RESIZE(arr, UBound(arr) + 1) arr[res] = str RESULT = res + 1 FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND

指定したキーワードに下線を引く(Word)

CONST wdDoNotSaveChanges = 0 // 保留中の変更を保存しない CONST wdSaveChanges = -1 // 保留中の変更をユーザーに確認しないで自動的に保存する CONST wdPromptToSaveChanges = -2 // 保留中の変更を保存するかどうかをユーザーに確認する CONST wdFindStop = 0 CONST wdCharacter = 1 CONST wdUnderlineSingle = 1 CONST wdCollapseEnd = 0 DIM arr[-1] // すべてのIDをarr変数に格納 FOR n = 0 TO GETALLWIN() - 1 arrayPush(arr, ALL_WIN_ID[n]) NEXT // クラス名がOpusApp、通常の表示状態であるものを抽出 arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)") // IDからタイトルを取得し、そのタイトルから「 - Microsoft Word」を削除 arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr) QSORT(arr, QSRT_A) TRY DIM Word = GETACTIVEOLEOBJ("Word.Application") EXCEPT MSGBOX("操作する文書を開いてください。") EXIT ENDTRY DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr) IFB res = -1 THEN MSGBOX("ファイル名が選択されなかったので終了します。") EXIT ENDIF Word.Documents(res).Activate DIM Document = Word.Application.ActiveDocument DIM Range = Document.Content // 下線を引くキーワード DIM keywords[] = "ギャラリー", "オプション", "テーマ" FOR item IN keywords Range.SetRange(0, 0) WITH Range.Find .Text = item .Forward = TRUE .Wrap = wdFindStop WHILE .Execute = TRUE WITH Range .Expand(wdCharacter) // 範囲 .Underline = wdUnderlineSingle // 下線を引く .Collapse(wdCollapseEnd) ENDWITH WEND ENDWITH NEXT //Word.Documents.Close(wdSaveChanges) //Word.Quit ////////////////////////////////////////////////// // 【引数】 // array : 一次元配列 // callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 // 【戻値】 // callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。 ////////////////////////////////////////////////// PROCEDURE arrayFilter(var array[], callback) DIM n = 0 DIM tmp[-1] FOR %val% IN array IFB EVAL(callback) THEN RESIZE(tmp, n) tmp[n] = %val% n = n + 1 ENDIF NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // callback : 配列の各要素に適用するコールバック関数 // array : コールバック関数を適用する配列 // 【戻値】 // callback関数を適用した後、 適用後の要素を含む配列 ////////////////////////////////////////////////// PROCEDURE arrayMap(callback, var array[]) DIM tmp[RESIZE(array)] DIM n = 0 FOR %val% IN array tmp[n] = EVAL(callback) n = n + 1 NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // array : 要素を追加する配列(参照引数) // str : 追加する要素 // 【戻値】 // 処理後の配列の中の要素の数 ////////////////////////////////////////////////// FUNCTION arrayPush(var arr[], str) DIM res = RESIZE(arr, UBound(arr) + 1) arr[res] = str RESULT = res + 1 FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND

文字数を出力

CONST wdStatisticWords = 0 DIM arr[-1] // すべてのIDをarr変数に格納 FOR n = 0 TO GETALLWIN() - 1 arrayPush(arr, ALL_WIN_ID[n]) NEXT // クラス名がOpusApp、通常の表示状態であるものを抽出 arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)") // IDか[]らタイトルを取得し、そのタイトルから「 - Microsoft Word」を削除 arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr) QSORT(arr, QSRT_A) TRY DIM Word = GETACTIVEOLEOBJ("Word.Application") EXCEPT MSGBOX("操作する文書を開いてください。") EXIT ENDTRY DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr) IFB res = -1 THEN MSGBOX("ファイル名が選択されなかったので終了します。") EXIT ENDIF DIM Range = Word.ActiveDocument.Range PRINT Range.ComputeStatistics(wdStatisticWords) ////////////////////////////////////////////////// // 【引数】 // array : 一次元配列 // callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 // 【戻値】 // callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。 ////////////////////////////////////////////////// PROCEDURE arrayFilter(var array[], callback) DIM n = 0 DIM tmp[-1] FOR %val% IN array IFB EVAL(callback) THEN RESIZE(tmp, n) tmp[n] = %val% n = n + 1 ENDIF NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // callback : 配列の各要素に適用するコールバック関数 // array : コールバック関数を適用する配列 // 【戻値】 // callback関数を適用した後、 適用後の要素を含む配列 ////////////////////////////////////////////////// PROCEDURE arrayMap(callback, var array[]) DIM tmp[RESIZE(array)] DIM n = 0 FOR %val% IN array tmp[n] = EVAL(callback) n = n + 1 NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // array : 要素を追加する配列(参照引数) // str : 追加する要素 // 【戻値】 // 処理後の配列の中の要素の数 ////////////////////////////////////////////////// FUNCTION arrayPush(var arr[], str) DIM res = RESIZE(arr, UBound(arr) + 1) arr[res] = str RESULT = res + 1 FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND
結果
469

文章校正をする

CONST wdDoNotSaveChanges = 0 // 保留中の変更を保存しない CONST wdSaveChanges = -1 // 保留中の変更をユーザーに確認しないで自動的に保存する CONST wdPromptToSaveChanges = -2 // 保留中の変更を保存するかどうかをユーザーに確認する DIM arr[-1] // すべてのIDをarr変数に格納 FOR n = 0 TO GETALLWIN() - 1 arrayPush(arr, ALL_WIN_ID[n]) NEXT // クラス名がOpusApp、通常の表示状態であるものを抽出 arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)") // IDからタイトルを取得し、そのタイトルから「 - Microsoft Word」を削除 arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr) QSORT(arr, QSRT_A) TRY DIM Word = GETACTIVEOLEOBJ("Word.Application") EXCEPT MSGBOX("操作する文書を開いてください。") EXIT ENDTRY DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr) IFB res = -1 THEN MSGBOX("ファイル名が選択されなかったので終了します。") EXIT ENDIF DIM Document = Word.Application.ActiveDocument Document.CheckGrammar //Word.Documents.Close(wdSaveChanges) //Word.Quit ////////////////////////////////////////////////// // 【引数】 // array : 一次元配列 // callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 // 【戻値】 // callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。 ////////////////////////////////////////////////// PROCEDURE arrayFilter(var array[], callback) DIM n = 0 DIM tmp[-1] FOR %val% IN array IFB EVAL(callback) THEN RESIZE(tmp, n) tmp[n] = %val% n = n + 1 ENDIF NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // callback : 配列の各要素に適用するコールバック関数 // array : コールバック関数を適用する配列 // 【戻値】 // callback関数を適用した後、 適用後の要素を含む配列 ////////////////////////////////////////////////// PROCEDURE arrayMap(callback, var array[]) DIM tmp[RESIZE(array)] DIM n = 0 FOR %val% IN array tmp[n] = EVAL(callback) n = n + 1 NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // array : 要素を追加する配列(参照引数) // str : 追加する要素 // 【戻値】 // 処理後の配列の中の要素の数 ////////////////////////////////////////////////// FUNCTION arrayPush(var arr[], str) DIM res = RESIZE(arr, UBound(arr) + 1) arr[res] = str RESULT = res + 1 FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND

カーソル位置の文章を取得

DIM arr[-1] FOR n = 0 TO GETALLWIN() - 1 arrayPush(arr, ALL_WIN_ID[n]) NEXT arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)") arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr) QSORT(arr, QSRT_A) TRY DIM Word = GETACTIVEOLEOBJ("Word.Application") EXCEPT MSGBOX("操作する文書を開いてださい。") EXIT ENDTRY DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr) IFB res = -1 THEN MSGBOX("ファイル名が選択されなかったので終了します。") EXIT ENDIF PRINT Word.Selection.Sentences(1).Text ////////////////////////////////////////////////// // 【引数】 // array : 一次元配列 // callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 // 【戻値】 // callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。 ////////////////////////////////////////////////// PROCEDURE arrayFilter(var array[], callback) DIM n = 0 DIM tmp[-1] FOR %val% IN array IFB EVAL(callback) THEN RESIZE(tmp, n) tmp[n] = %val% n = n + 1 ENDIF NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // callback : 配列の各要素に適用するコールバック関数 // array : コールバック関数を適用する配列 // 【戻値】 // callback関数を適用した後、 適用後の要素を含む配列 ////////////////////////////////////////////////// PROCEDURE arrayMap(callback, var array[]) DIM tmp[RESIZE(array)] DIM n = 0 FOR %val% IN array tmp[n] = EVAL(callback) n = n + 1 NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // array : 要素を追加する配列(参照引数) // str : 追加する要素 // 【戻値】 // 処理後の配列の中の要素の数 ////////////////////////////////////////////////// FUNCTION arrayPush(var arr[], str) DIM res = RESIZE(arr, UBound(arr) + 1) arr[res] = str RESULT = res + 1 FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND

カーソル位置の段落番号を取得

DIM arr[-1] FOR n = 0 TO GETALLWIN() - 1 arrayPush(arr, ALL_WIN_ID[n]) NEXT arrayFilter(arr, "STATUS(%val%, ST_CLASS) = <#DBL>OpusApp<#DBL> AND STATUS(%val%, ST_VISIBLE)") arrayMap("REPLACE(STATUS(%val%, ST_TITLE), <#DBL> - Microsoft Word<#DBL>, <#DBL><#DBL>)", arr) QSORT(arr, QSRT_A) TRY DIM Word = GETACTIVEOLEOBJ("Word.Application") EXCEPT MSGBOX("操作する文書を開いてださい。") EXIT ENDTRY DIM res = SLCTBOX(SLCT_RDO OR SLCT_STR, 0, "操作する文書を選択", arr) IFB res = -1 THEN MSGBOX("ファイル名が選択されなかったので終了します。") EXIT ENDIF DIM Range = Word.Selection.Range Range.Start = 0 PRINT Range.Paragraphs.Count ////////////////////////////////////////////////// // 【引数】 // array : 一次元配列 // callback : コールバック関数。callback内で配列の値は「%val%」で使うことができます。 // 【戻値】 // callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。 ////////////////////////////////////////////////// PROCEDURE arrayFilter(var array[], callback) DIM n = 0 DIM tmp[-1] FOR %val% IN array IFB EVAL(callback) THEN RESIZE(tmp, n) tmp[n] = %val% n = n + 1 ENDIF NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // callback : 配列の各要素に適用するコールバック関数 // array : コールバック関数を適用する配列 // 【戻値】 // callback関数を適用した後、 適用後の要素を含む配列 ////////////////////////////////////////////////// PROCEDURE arrayMap(callback, var array[]) DIM tmp[RESIZE(array)] DIM n = 0 FOR %val% IN array tmp[n] = EVAL(callback) n = n + 1 NEXT RESIZE(array, RESIZE(tmp)) FOR n = 0 TO RESIZE(tmp) array[n] = tmp[n] NEXT FEND ////////////////////////////////////////////////// // 【引数】 // array : 要素を追加する配列(参照引数) // str : 追加する要素 // 【戻値】 // 処理後の配列の中の要素の数 ////////////////////////////////////////////////// FUNCTION arrayPush(var arr[], str) DIM res = RESIZE(arr, UBound(arr) + 1) arr[res] = str RESULT = res + 1 FEND ////////////////////////////////////////////////// // 【引数】 // 配列 : 上限値を求める配列 // 【戻値】 // 配列の上限値 ////////////////////////////////////////////////// FUNCTION UBound(array[]) RESULT = RESIZE(array) FEND