arrayFilter

コールバック関数を使用して、配列の要素をフィルタリングします。

構文
arrayFilter( var array[], callback )
引数
array
一次元配列
callback
コールバック関数。callback内で配列の値は「%val%」で使うことができます。
戻値
callback関数によりフィルタ処理が行われた arrayの全ての要素を含む配列を返します。

プログラム

//////////////////////////////////////////////////
// 【引数】
//   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

プログラム実行例

配列の中から偶数のみ抽出

DIM arr[] = 42, 64, 6, 67, 43, 96, 29, 84, 79, 11

arrayFilter(arr, "%val% MOD 2 = 0")

FOR item IN arr
	PRINT item
NEXT

//////////////////////////////////////////////////
// 【引数】
//   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
  1. arrayfilter
結果
42
64
6
96
84

内部リンクを取得

DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IE.Navigate("http://example.com")
BusyWait(IE)

DIM links[-1]

FOR n = 0 TO IE.document.links.length - 1
	arrayPush(links, IE.document.links[n].href)
NEXT

arrayFilter(links, "POS(<#DBL>" + IE.document.domain + "<#DBL>, %val%)")

FOR item IN links
	PRINT item
NEXT

IE.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

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   IE : IEオブジェクト 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE BusyWait(Var IE)
	SLEEP(0.500)
	DIM t = GETTIME()
	TRY
		REPEAT
			DIM tm = GETTIME() - t
			FUKIDASI("BusyWait:" + tm)
			SLEEP(0.010)
			IF tm >= 60 THEN BREAK
		UNTIL !IE.Busy AND IE.readyState = 4
	EXCEPT
		IE = getIEObj(-1)
		PRINT IE.document.URL + " のIEオブジェクトを取得しました。"
		BusyWait(IE)
	ENDTRY
	FUKIDASI()
FEND

//////////////////////////////////////////////////
// 【引数】
//   文字列 or 数値 : 取得したいIEオブジェクトのタイトル・URLもしくは数値を指定 
//   完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得) 
// 【戻値】
//   Internet Explorerオブジェクト 
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
	DIM Shell = CREATEOLEOBJ("Shell.Application")
	SELECT CHKNUM(str)
		CASE TRUE
			DIM cnt = 0
			SELECT TRUE
				CASE str > 0
					FOR n = 0 TO Shell.Windows.Count - 1
						TRY
							IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
								cnt = cnt + 1
								IFB str = cnt THEN
									RESULT = Shell.Windows.Item(n)
									EXIT
								ENDIF
							ENDIF
						EXCEPT
						ENDTRY
					NEXT
				CASE str < 0
					FOR n = Shell.Windows.Count - 1 TO 0 STEP -1
						TRY
							IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
								cnt = cnt + 1
								IFB ABS(str) = cnt THEN
									RESULT = Shell.Windows.Item(n)
									EXIT
								ENDIF
							ENDIF
						EXCEPT
						ENDTRY
					NEXT
				CASE str = 0
					FOR n = 0 TO Shell.Windows.Count - 1
						TRY
							IF Shell.Windows.Item(n).Name = "Internet Explorer" THEN cnt = cnt + 1
						EXCEPT
						ENDTRY
					NEXT
					RESULT = cnt
					EXIT
			SELEND
		CASE FALSE
			DIM t = GETTIME()
			REPEAT
				FOR n = 0 TO Shell.Windows.Count - 1
					TRY
						DIM targetObj = Shell.Windows.Item(n)
						IFB targetObj.Name = "Internet Explorer" THEN
							SELECT flg
								CASE TRUE
									IFB targetObj.document.title = str OR targetObj.LocationURL = str THEN
										RESULT = Shell.Windows.Item(n)
										EXIT
									ENDIF
								CASE FALSE
									IFB POS(str, targetObj.document.title) OR POS(str, targetObj.LocationURL) THEN
										RESULT = Shell.Windows.Item(n)
										EXIT
									ENDIF
							SELEND
						ENDIF
					EXCEPT
					ENDTRY
				NEXT
			UNTIL GETTIME() - t >= 5
	SELEND
	RESULT = ERR_VALUE
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
  1. CREATEOLEOBJ
  2. IE.Visible
  3. IE.Navigate
  4. IE.document
  5. Document.links
  6. Document.links.length
  7. arrayPush
  8. Document.links.href
  9. arrayFilter
  10. Document.domain
  11. IE.Quit

外部リンクを取得

DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IE.Navigate("http://example.com")
BusyWait(IE)

DIM links[-1]

FOR n = 0 TO IE.document.links.length - 1
	arrayPush(links, IE.document.links[n].href)
NEXT

arrayFilter(links, "!POS(<#DBL>" + IE.document.domain + "<#DBL>, %val%)")

FOR item IN links
	PRINT item
NEXT

IE.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

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   IE : IEオブジェクト 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE BusyWait(Var IE)
	SLEEP(0.500)
	DIM t = GETTIME()
	TRY
		REPEAT
			DIM tm = GETTIME() - t
			FUKIDASI("BusyWait:" + tm)
			SLEEP(0.010)
			IF tm >= 60 THEN BREAK
		UNTIL !IE.Busy AND IE.readyState = 4
	EXCEPT
		IE = getIEObj(-1)
		PRINT IE.document.URL + " のIEオブジェクトを取得しました。"
		BusyWait(IE)
	ENDTRY
	FUKIDASI()
FEND

//////////////////////////////////////////////////
// 【引数】
//   文字列 or 数値 : 取得したいIEオブジェクトのタイトル・URLもしくは数値を指定 
//   完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得) 
// 【戻値】
//   Internet Explorerオブジェクト 
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
	DIM Shell = CREATEOLEOBJ("Shell.Application")
	SELECT CHKNUM(str)
		CASE TRUE
			DIM cnt = 0
			SELECT TRUE
				CASE str > 0
					FOR n = 0 TO Shell.Windows.Count - 1
						TRY
							IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
								cnt = cnt + 1
								IFB str = cnt THEN
									RESULT = Shell.Windows.Item(n)
									EXIT
								ENDIF
							ENDIF
						EXCEPT
						ENDTRY
					NEXT
				CASE str < 0
					FOR n = Shell.Windows.Count - 1 TO 0 STEP -1
						TRY
							IFB Shell.Windows.Item(n).Name = "Internet Explorer" THEN
								cnt = cnt + 1
								IFB ABS(str) = cnt THEN
									RESULT = Shell.Windows.Item(n)
									EXIT
								ENDIF
							ENDIF
						EXCEPT
						ENDTRY
					NEXT
				CASE str = 0
					FOR n = 0 TO Shell.Windows.Count - 1
						TRY
							IF Shell.Windows.Item(n).Name = "Internet Explorer" THEN cnt = cnt + 1
						EXCEPT
						ENDTRY
					NEXT
					RESULT = cnt
					EXIT
			SELEND
		CASE FALSE
			DIM t = GETTIME()
			REPEAT
				FOR n = 0 TO Shell.Windows.Count - 1
					TRY
						DIM targetObj = Shell.Windows.Item(n)
						IFB targetObj.Name = "Internet Explorer" THEN
							SELECT flg
								CASE TRUE
									IFB targetObj.document.title = str OR targetObj.LocationURL = str THEN
										RESULT = Shell.Windows.Item(n)
										EXIT
									ENDIF
								CASE FALSE
									IFB POS(str, targetObj.document.title) OR POS(str, targetObj.LocationURL) THEN
										RESULT = Shell.Windows.Item(n)
										EXIT
									ENDIF
							SELEND
						ENDIF
					EXCEPT
					ENDTRY
				NEXT
			UNTIL GETTIME() - t >= 5
	SELEND
	RESULT = ERR_VALUE
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
  1. CREATEOLEOBJ
  2. IE.Visible
  3. IE.Navigate
  4. IE.document
  5. Document.links
  6. Document.links.length
  7. arrayPush
  8. Document.links.href
  9. arrayFilter
  10. Document.domain
  11. IE.Quit

総段落数を取得

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. Word.Documents
  12. Word.Documents.Item
  13. Word.Document.Activate
  14. Word.Application.ActiveDocument
  15. Word.Document.Paragraphs
  16. Word.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. Word.Documents.Item
  10. Word.Document.Activate
  11. Word.Application.ActiveDocument
  12. Word.Document.Content
  13. Word.Range.SetRange
  14. Word.Range.Find
  15. Word.Find.Text
  16. Word.Find.Forward
  17. Word.Find.Wrap
  18. Word.Find.Execute
  19. Word.Range.Expand
  20. Word.Range.Underline
  21. Word.Range.Collapse
  22. Word.Documents.Close
  23. Word.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. Word.Application.ActiveDocument
  10. Word.Range
  11. Word.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. Word.Application.ActiveDocument
  10. Word.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. Word.Selection.Range
  11. Word.Range.Start
  12. Word.Range.Paragraphs.Count