QSORT

タグ: ,

配列の中身をソートします。キー配列と連動させる配列は次元の違う同じ配列名を指定することできます。

構文
  1. void = 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 array[] = “あ”, “ん”, “ア”, “ン”, “ア”, “ン”, “A”, “Z”, “A”, “Z”, “a”, “z”, “a”, “z”, “0”, “9”, “0”, “9”, “亜”
DIM sorts[] = QSRT_A, QSRT_D, QSRT_UNICODEA, QSRT_UNICODED, QSRT_NATURALA, QSRT_NATURALD

FOR sort IN sorts
	QSORT(array, sort)
	DIM str = “”
	FOR item IN array
		str = str + item + “ ”
	NEXT
	PRINT str
NEXT
結果
0 9 A Z a z あ ん ア ン 亜 0 9 A Z a z ア ン 
ン ア z a Z A 9 0 亜 ン ア ん あ z a Z A 9 0 
0 0 9 9 a a A A z z Z Z ア ア あ ン ン ん 亜 
亜 ん ン ン あ ア ア Z Z z z A A a a 9 9 0 0 
0 0 9 9 A a A a z Z Z z ア ア あ ン ン ん 亜 
亜 ん ン ン あ ア ア Z z z Z A a A a 9 9 0 0 

昇順(QSRT_A)

値が小さい順に並べます。

0 9 A Z a z あ ん ア ン 亜 0 9 A Z a z ア ン

  1. 半角数字
  2. 半角英字(大文字)
  3. 半角英字(小文字)
  4. ひらがな
  5. カタカナ
  6. 漢字
  7. 全角数字
  8. 全角英字(大文字)
  9. 全角英字(小文字)
  10. 半角カタカナ

降順(QSRT_D)

値が大きい順に並べます。

ン ア z a Z A 9 0 亜 ン ア ん あ z a Z A 9 0

  1. 半角カタカナ
  2. 全角英字(小文字)
  3. 全角英字(大文字)
  4. 全角数字
  5. 漢字
  6. カタカナ
  7. ひらがな
  8. 半角英字(小文字)
  9. 半角英字(大文字)
  10. 半角数字

Unicode昇順(QSRT_UNICODEA)

Unicodeの文字コード昇順で並べます。

0 0 9 9 a a A A z z Z Z ア ア あ ン ン ん 亜

数値ではなく数字(文字)として先頭から1文字ずつ比較され並び替えが行われるので、1,2,3,4,5,10,11,12の場合、1,10,11,12,2,3,4,5という並びになってしまいます。

数字を小さい順に並べるには、桁数に合わせてゼロ埋め(2桁の場合は01、3桁の場合は001のように)するか、自然順でソートします。

DIM array[] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

QSORT(array, QSRT_UNICODEA)

FOR item IN array
	PRINT item
NEXT
結果
0
1
10
11
12
2
3
4
5
6
7
8
9

Unicode降順(QSRT_UNICODED)

Unicodeの文字コード降順で並べます。

亜 ん ン ン あ ア ア Z Z z z A A a a 9 9 0 0

自然順昇順(QSRT_NATURALA)

アルファベット順を基本とし、複数桁の数字を単一文字として昇順で並べます。

0 0 9 9 A a A a z Z Z z ア ア あ ン ン ん 亜

  1. 数字(半角→全角)
  2. 英字(半角→全角)
  3. ひらがな・カタカナ
  4. 漢字

自然順でないソートする場合、先頭から1文字ずつ大きさを比較し並び替え、1文字目が同じ場合2文字目の大きさを比較し並び替えるという手順でソートされます。

6 12 34 15 1 27 17

1文字目を比較し、小さい順に並び替える

12 15 1 17 27 34 6

2文字目を比較し、小さい順に並び替える。

1 12 15 17 27 34 6

このような手順のため数字は値の小さい順になりません。

一方自然順でソートする場合、12は1文字目が1だからとかではなく12と数字の塊で比較するので自然な並び方になります。

DIM array[] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

QSORT(array, QSRT_NATURALA)

FOR item IN array
	PRINT item
NEXT
結果
0
1
2
3
4
5
6
7
8
9
10
11
12

自然順降順(QSRT_NATURALD)

アルファベット順を基本とし、複数桁の数字を単一文字として降順で並べます。

亜 ん ン ン あ ア ア Z z z Z A a A a 9 9 0 0

昇順

DIM array[] = 19, 5, 68, 13, 6, 99, 70, 64, 39, 30 

QSORT(array, QSRT_A)

DIM str = “”
FOR item IN array
	str = str + item + “, ”
NEXT
結果
5, 6, 13, 19, 30, 39, 64, 68, 70, 99,

降順

DIM array[] = 19, 5, 68, 13, 6, 99, 70, 64, 39, 30 

QSORT(array, QSRT_D)

DIM str = “”
FOR item IN array
	str = str + item + “, ”
NEXT

PRINT str
結果
99, 70, 68, 64, 39, 30, 19, 13, 6, 5,

Unicode昇順

DIM array[] = 19, 5, 68, 13, 6, 99, 70, 64, 39, 30 

QSORT(array, QSRT_UNICODEA)

DIM str = “”
FOR item IN array
	str = str + item + “, ”
NEXT

PRINT str
結果
13, 19, 30, 39, 5, 6, 64, 68, 70, 99,

Unicode降順

DIM array[] = 19, 5, 68, 13, 6, 99, 70, 64, 39, 30 

QSORT(array, QSRT_UNICODED)

DIM str = “”
FOR item IN array
	str = str + item + “, ”
NEXT

PRINT str
結果
99, 70, 68, 64, 6, 5, 39, 30, 19, 13,

プログラム実行例

都道府県別の人口・面積を人口降順で連動してソート

population配列(人口)を降順(大きい順)に、pref配列(都道府県)とarea配列(面積)の関係性を保ったまま並び替える。

データは【都道府県】人口ランキング・面積ランキング・人口密度ランキングを参照。
DIM pref[] = "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"
DIM population[] = "5228885", "1238730", "1211206", "2303487", "960113", "1068696", "1834198", "2868554", "1934016", "1940333", "7346836", "6287034", "14064696", "9240411", "2202358", "1035612", "1133294", "767433", "810427", "2049683", "1979781", "3635220", "7546192", "1771440", "1414248", "2579921", "8842523", "5469184", "1325437", "923033", "553847", "671602", "1889607", "2801388", "1342987", "719704", "951049", "1335694", "692065", "5138891", "812013", "1313103", "1739211", "1124597", "1070213", "1589206", "1468410"
DIM area[] = "78421.39", "9645.64", "15275.01", "7282.29", "11637.52", "9323.15", "13784.14", "6097.39", "6408.09", "6362.28", "3797.75", "5157.57", "2194.03", "2416.11", "12583.96", "4247.58", "4186.21", "4190.52", "4465.27", "13561.56", "10621.29", "7777.35", "5173.07", "5774.49", "4017.38", "4612.20", "1905.32", "8401.02", "3690.94", "4724.65", "3507.14", "6707.89", "7114.33", "8479.65", "6112.54", "4146.75", "1876.78", "5676.19", "7103.63", "4986.51", "2440.69", "4130.98", "7409.46", "6340.76", "7735.22", "9187.06", "2282.59"

QSORT(population, QSRT_NATURALD, pref, area)

PRINT "都道府県,人口,面積"

FOR i = 0 TO UBound(pref)
	PRINT pref[i] + "," + population[i] + "," + area[i]
NEXT

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
  1. QSORT
結果
都道府県,人口,面積
東京都,14064696,2194.03
神奈川県,9240411,2416.11
大阪府,8842523,1905.32
愛知県,7546192,5173.07
埼玉県,7346836,3797.75
千葉県,6287034,5157.57
兵庫県,5469184,8401.02
北海道,5228885,78421.39
福岡県,5138891,4986.51
静岡県,3635220,7777.35
茨城県,2868554,6097.39
広島県,2801388,8479.65
京都府,2579921,4612.20
宮城県,2303487,7282.29
新潟県,2202358,12583.96
長野県,2049683,13561.56
岐阜県,1979781,10621.29
群馬県,1940333,6362.28
栃木県,1934016,6408.09
岡山県,1889607,7114.33
福島県,1834198,13784.14
三重県,1771440,5774.49
熊本県,1739211,7409.46
鹿児島県,1589206,9187.06
沖縄県,1468410,2282.59
滋賀県,1414248,4017.38
山口県,1342987,6112.54
愛媛県,1335694,5676.19
奈良県,1325437,3690.94
長崎県,1313103,4130.98
青森県,1238730,9645.64
岩手県,1211206,15275.01
石川県,1133294,4186.21
大分県,1124597,6340.76
宮崎県,1070213,7735.22
山形県,1068696,9323.15
富山県,1035612,4247.58
秋田県,960113,11637.52
香川県,951049,1876.78
和歌山県,923033,4724.65
佐賀県,812013,2440.69
山梨県,810427,4465.27
福井県,767433,4190.52
徳島県,719704,4146.75
高知県,692065,7103.63
島根県,671602,6707.89
鳥取県,553847,3507.14

都道府県別の人口・面積を人口降順で連動してソート(多次元配列)

array[0][i]は都道府県名、array[1][i]は人口で単位は「人」、array[2][i]は面積で単位は「km2」。

データは【都道府県】人口ランキング・面積ランキング・人口密度ランキングを参照。
DIM array[][46] = "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県", + _
					"5228885", "1238730", "1211206", "2303487", "960113", "1068696", "1834198", "2868554", "1934016", "1940333", "7346836", "6287034", "14064696", "9240411", "2202358", "1035612", "1133294", "767433", "810427", "2049683", "1979781", "3635220", "7546192", "1771440", "1414248", "2579921", "8842523", "5469184", "1325437", "923033", "553847", "671602", "1889607", "2801388", "1342987", "719704", "951049", "1335694", "692065", "5138891", "812013", "1313103", "1739211", "1124597", "1070213", "1589206", "1468410", + _
					"78421.39", "9645.64", "15275.01", "7282.29", "11637.52", "9323.15", "13784.14", "6097.39", "6408.09", "6362.28", "3797.75", "5157.57", "2194.03", "2416.11", "12583.96", "4247.58", "4186.21", "4190.52", "4465.27", "13561.56", "10621.29", "7777.35", "5173.07", "5774.49", "4017.38", "4612.20", "1905.32", "8401.02", "3690.94", "4724.65", "3507.14", "6707.89", "7114.33", "8479.65", "6112.54", "4146.75", "1876.78", "5676.19", "7103.63", "4986.51", "2440.69", "4130.98", "7409.46", "6340.76", "7735.22", "9187.06", "2282.59"

QSORT(array[1], QSRT_NATURALD, array[0], array[2])

PRINT "都道府県,人口,面積"

FOR i = 0 TO 46
	DIM str = ""
	FOR j = 0 TO 2
		str = str + array[j][i] + ","
	NEXT
	PRINT str
NEXT
  1. QSORT
結果
都道府県,人口,面積
東京都,14064696,2194.03,
神奈川県,9240411,2416.11,
大阪府,8842523,1905.32,
愛知県,7546192,5173.07,
埼玉県,7346836,3797.75,
千葉県,6287034,5157.57,
兵庫県,5469184,8401.02,
北海道,5228885,78421.39,
福岡県,5138891,4986.51,
静岡県,3635220,7777.35,
茨城県,2868554,6097.39,
広島県,2801388,8479.65,
京都府,2579921,4612.20,
宮城県,2303487,7282.29,
新潟県,2202358,12583.96,
長野県,2049683,13561.56,
岐阜県,1979781,10621.29,
群馬県,1940333,6362.28,
栃木県,1934016,6408.09,
岡山県,1889607,7114.33,
福島県,1834198,13784.14,
三重県,1771440,5774.49,
熊本県,1739211,7409.46,
鹿児島県,1589206,9187.06,
沖縄県,1468410,2282.59,
滋賀県,1414248,4017.38,
山口県,1342987,6112.54,
愛媛県,1335694,5676.19,
奈良県,1325437,3690.94,
長崎県,1313103,4130.98,
青森県,1238730,9645.64,
岩手県,1211206,15275.01,
石川県,1133294,4186.21,
大分県,1124597,6340.76,
宮崎県,1070213,7735.22,
山形県,1068696,9323.15,
富山県,1035612,4247.58,
秋田県,960113,11637.52,
香川県,951049,1876.78,
和歌山県,923033,4724.65,
佐賀県,812013,2440.69,
山梨県,810427,4465.27,
福井県,767433,4190.52,
徳島県,719704,4146.75,
高知県,692065,7103.63,
島根県,671602,6707.89,
鳥取県,553847,3507.14,

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

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
  1. CREATEOLEOBJ
  2. DOSCMD
  3. reExecute
  4. CanStartStopService メソッド
  5. QSORT
結果
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
  1. QSORT
結果
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
  1. QSORT
結果
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
  1. QSORT
結果
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
  1. QSORT
結果
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
  1. GETALLWIN
  2. arrayPush
  3. arrayFilter
  4. STATUS
  5. arrayMap
  6. REPLACE
  7. QSORT
  8. GETACTIVEOLEOBJ
  9. MSGBOX
  10. SLCTBOX
  11. Documents オブジェクト
  12. Documents.Item メソッド
  13. Document.Activate メソッド
  14. Application.ActiveDocument プロパティ
  15. Document.Paragraphs プロパティ
  16. Paragraphs.Count プロパティ

指定したキーワードに下線を引く(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
  1. GETALLWIN
  2. arrayPush
  3. arrayFilter
  4. arrayMap
  5. QSORT
  6. GETACTIVEOLEOBJ
  7. MSGBOX
  8. SLCTBOX
  9. Documents.Item メソッド
  10. Document.Activate メソッド
  11. Application.ActiveDocument プロパティ
  12. Document.Content プロパティ
  13. Range.SetRange メソッド
  14. Range.Find プロパティ
  15. Find.Text プロパティ
  16. Find.Forward プロパティ
  17. Find.Wrap プロパティ
  18. Find.Execute メソッド
  19. Range.Expand メソッド
  20. Range.Underline プロパティ
  21. Range.Collapse メソッド
  22. Documents.Close メソッド
  23. Application.Quit メソッド

文字数を出力

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
  1. arrayPush
  2. arrayFilter
  3. STATUS
  4. arrayMap
  5. QSORT
  6. GETACTIVEOLEOBJ
  7. MSGBOX
  8. SLCTBOX
  9. Application.ActiveDocument プロパティ
  10. Range オブジェクト
  11. Range.ComputeStatistics メソッド
結果
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
  1. arrayPush
  2. arrayFilter
  3. STATUS
  4. arrayMap
  5. QSORT
  6. GETACTIVEOLEOBJ
  7. MSGBOX
  8. SLCTBOX
  9. Application.ActiveDocument プロパティ
  10. Document.CheckGrammar メソッド

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

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
  1. arrayPush
  2. arrayFilter
  3. STATUS
  4. arrayMap
  5. REPLACE
  6. QSORT
  7. GETACTIVEOLEOBJ
  8. MSGBOX
  9. SLCTBOX
  10. Word.Selection.Sentences.Text

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

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
  1. arrayPush
  2. arrayFilter
  3. STATUS
  4. arrayMap
  5. REPLACE
  6. QSORT
  7. GETACTIVEOLEOBJ
  8. MSGBOX
  9. SLCTBOX
  10. Selection.Range プロパティ
  11. Word.Range.Start
  12. Word.Range.Paragraphs.Count

関連記事

bubbleSort
引数に指定した配列をバブルソートで並び替えます。
shakerSort
シェーカーソートは、ソートのアルゴリズムの一つです。バブルソートを改良したもの。双方向バブルソート、改良交換法とも言われます。バブルソートではスキャンを一方向にしか行わないのに対し、シェーカーソートでは交互に二方向に行います。
combSort
コムソートではソートの初期段階では離れた要素を比較交換します。そして徐々に2つの要素間の距離を縮めて、最後に直接隣接している要素どうしの比較交換を行います。
gnomeSort
ノームソートはソートアルゴリズムの一つです。挿入ソートに似ているが、要素の移動は挿入ではなくバブルソートのような一連の交換で行います。
heapSort
引数に指定された配列をヒープソートで並び替えます。
oddEvenSort
奇偶転置ソートは、ソートのアルゴリズムの一つで、バブルソートを改良したもの。バブルソートではスキャンを一方向に順次行うのに対し、奇偶転置ソートでは組ごとに行います。
shearSort
シェアソートはソートアルゴリズムの一つで、データを長方形に並べた上で各行・各列ごとにソートを行ないます。
selectionSort
選択ソートは、ソートのアルゴリズムの一つ。配列された要素から、最大値やまたは最小値を探索し配列最後の要素と入れ替えを行うことでソートします。
insertionSort
挿入ソートは、ソートのアルゴリズムの一つ。整列してある配列に追加要素を適切な場所に挿入します。
shellSort
シェルソートは挿入ソートが改良された整列アルゴリズムです。リストにおいてあらかじめ離れている要素を交換しておき、最終的に挿入ソートを実行します。
mergeSort
マージソートは整列されていないリストを2つのリストに分割して、それぞれを整列させた後、それらをマージして整列済みのひとつのリストを作ります。
quickSort
問題を小さな部分問題に分割していく分割統治法を利用した手法で、データから適当に基準値を決めこれより大きいグループと小さいグループに分けるという手順を、分けた小さなグループに対しても再帰的に繰り返していきます。
bogoSort
要素をランダムに並べ替えることで偶発的な一致を試みる整列アルゴリズムです。
Sort オブジェクト (Excel)
データの並べ替えを表します。
CALCARRAY (スクリプト関数)
配列の合計値・最小値・最大値・平均値を求めます。
GETALLWIN (スクリプト関数)
全ウィンドウのIDを取得します。
JOIN (スクリプト関数)
引数に指定した配列を結合し文字列を返します。
POPUPMENU (スクリプト関数)
ポップアップメニューを表示し、引数に指定した配列の中から選択された項目の要素番号を取得します。選択された項目を取得したい場合は、POPUPMENUの戻値を引数に指定した配列の要素番号として指定します。
RESIZE (スクリプト関数)
配列のサイズを変更します。第二引数を省略した場合はサイズを取得します。
SETCLEAR (スクリプト関数)
配列のすべての要素を任意の値で埋めます。
SHIFTARRAY (スクリプト関数)
配列を指定した値だけシフトします。プラス値で後方、マイナス値で前方にシフトします。
SPLIT (スクリプト関数)
SPLIT関数は、引数に指定された文字列を区切文字列で区切り配列に格納します。区切文字列を省略した場合、スペースが区切文字列となります。戻値は配列でsafearray型です。
UBound
配列の最大インデックスを返します。
連想配列
連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の変わりに名前をつけることでわかりやすく管理することができます。
SLICE (スクリプト関数)
SLICE関数は、配列の中を指定範囲の配列で返す関数です。第一引数に配列を指定し、第二引数に開始位置、第三引数に終了位置を指定します。第二・第三引数は省略可能で、省略した場合は配列全体を返します。戻値はsafearray型です。
FOR-IN-NEXT
配列やコレクションなどのグループの各要素に対して繰り返し処理を行います。
inArray
divisors
引数に指定した数値の約数をリストを配列で返します。
arraySearch
配列の中から指定した要素が見つかった場合、その要素がある最初のインデックスを返します。
arrayReverse
引数に指定した配列を逆順にして返します。