CREATEOLEOBJ

構文
  1. Object = CREATEOLEOBJ( COMオブジェクト名 )
引数
COMオブジェクト名
COMオブジェクト名
戻り値

COMオブジェクト

COMからメソッド使用時に引数に値取得(OUT引数)がある場合は、引数の変数の前に Var を付ける

COMオブジェクト一覧

アプリ名 COMオブジェクト名
Internet Explorer InternetExplorer オブジェクト
Shell オブジェクト
CDO.Message
FileSystemObject Scripting.FileSystemObject
WshShell WScript.Shell
Excel Excel オブジェクト
Word Word オブジェクト
Outlook Outlook オブジェクト

プログラム実行例

UWSC.INIよりUWSC本体のウィンドウの幅と高さを取得

DIM WshShell = CREATEOLEOBJ("WScript.Shell")
DIM username = WshShell.ExpandEnvironmentStrings("%USERNAME%")

SELECT TRUE
	// Vista以降
	CASE KINDOFOS() >= 20
		path = "C:\Users\" + username + "\AppData\Roaming\UWSC\UWSC.INI"
	// Windows XP
	CASE KINDOFOS() = 13
		path = "C:\Documents and Settings\" + username + "\Application Data\UWSC"
	DEFAULT
		MSGBOX("UWSC.INIのパスを特定できませんでした。")
		EXIT
SELEND

// SETセクションのPositionキーの値を取得
PRINT READINI("SET", "Position", path)
    (1) (2) (6,9) (12) (17)
解説
  1. 1行目
    DIM WshShell = CREATEOLEOBJ("WScript.Shell")
    WshShellオブジェクトを生成し WshShell に代入します。
  2. 2行目
    DIM username = WshShell.ExpandEnvironmentStrings("%USERNAME%")
  3. 4,14行目
    SELECT TRUE
    	…
    SELEND
  4. 6-7行目
    	CASE KINDOFOS() >= 20
    		path = "C:\Users\" + username + "\AppData\Roaming\UWSC\UWSC.INI"
  5. 9-10行目
    	CASE KINDOFOS() = 13
    		path = "C:\Documents and Settings\" + username + "\Application Data\UWSC"
  6. 11-13行目
    	DEFAULT
    		MSGBOX("UWSC.INIのパスを特定できませんでした。")
    		EXIT

「プログラム」の右クリックメニューの動作項目を取得

CONST ssfPROGRAMS = 2

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfPROGRAMS)
DIM FolderItemVerbs = Folder.Self.Verbs()

FOR FolderItemVerb IN FolderItemVerbs
	PRINT FolderItemVerb.Name
NEXT
    (4)
結果
開く(&O)
クイック アクセスに​​ピン留めする
コピー(&C)

以前のバージョンの復元(&V)


切り取り(&T)
コピー(&C)
ショートカットの作成(&S)
削除(&D)
名前の変更(&M)
プロパティ(&R)

空気の構成成分の割合を円グラフにする(Excel)

CONST xlPie = 5

DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Add()

DIM array[][1] = "窒素", "78.08", "酸素", "20.95", "アルゴン", "0.93", "二酸化炭素", "0.04", "その他", "0"

WITH Excel
	FOR r = 0 TO UBound(array)
		FOR c = 0 TO UBound(array[0])
			.Cells(r+1, c+1) = array[r][c]
		NEXT
	NEXT
	DIM ChartObjects = .ActiveSheet.ChartObjects
	DIM ChartObject = ChartObjects.Add(.Range("C1").Left, .Range("C1").Top, .Range("C1:I22").Width, .Range("C1:I22").Height)
	DIM Chart = ChartObject.Chart
	WITH Chart
		.ChartType = xlPie
		.HasLegend = FALSE
		.SetSourceData(Excel.Range("A1").CurrentRegion)
		.ApplyLayout(4)
	ENDWITH
ENDWITH

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
    (3) (4) (5) (10,11) (12)
  1. Excel.Worksheet.ChartObjects(15)
  2. Excel.ChartObjects.Add(16)
  3. Excel.ChartObjects.Chart(16)
  4. (16,21)
  5. Excel.Range.Left(16)
  6. Excel.Range.Top(16)
  7. Excel.Range.Width(16)
  8. Excel.Range.Height(16)
  9. (16)
  10. Excel.ChartObject.ChartType(19)
  11. Excel.ChartObject.HasLegend(20)
  12. Excel.ChartObject.SetSourceData(21)
  13. (21)
  14. Excel.ChartObject.ApplyLayout(22)

画像ファイルの情報を取得

「ピクチャ\100ANDRO\20210314」にある画像ファイルの情報を出力。

CONST ssfMYPICTURES = 39

HASHTBL iColumn

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfMYPICTURES)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM path = FSO.BuildPath(Folder.Self.Path, "100ANDRO210314")
Folder = Shell.NameSpace(path)
FolderItems = Folder.Items

FOR n = 0 TO 350
	iColumn[Folder.GetDetailsOf(EMPTYPARAM, n)] = n
NEXT

DIM temp = uniqueFilename(FSO.BuildPath(path, "Info.csv"))
FSO.CreateTextFile(temp, FALSE, FALSE)

DIM FID = FOPEN(temp, F_READ OR F_WRITE)

DIM array[] = "ファイル名", "撮影日時", "幅", "高さ", "サイズ", "ビットの深さ", "パス", "焦点距離", "向き"

FOR i = 1 TO UBound(array)
	FPUT(FID, array[i], 1, i)
NEXT

DIM row = 2
DIM extensions[] = ".jpg", ".jpeg", ".png", ".bmp"

FOR FolderItem IN FolderItems
	FUKIDASI(row + "/" + FolderItems.Count)
	IF inArray(Folder.GetDetailsOf(FolderItem, iColumn["ファイル拡張子"]), extensions) = FALSE THEN CONTINUE
	FOR i = 1 TO UBound(array)
		FPUT(FID, Folder.GetDetailsOf(FolderItem, iColumn[array[i]]), row, i)
	NEXT
	row = row + 1
NEXT

FCLOSE(FID)

//////////////////////////////////////////////////
// 【引数】
//   needle : 探す値 
//   haystack : 配列 
//   strict 
// 【戻値】
//   TRUE : 配列中に指定した値が存在する、FALSE : 配列中に指定した値が存在しない 
//////////////////////////////////////////////////
FUNCTION inArray( needle, haystack[], strict = FALSE)
	DIM res = FALSE
	FOR item IN haystack
		IFB needle = item THEN
			res = TRUE
			BREAK
		ENDIF
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   path : ファイルのパス 
// 【戻値】
//   重複しないファイル名 
//////////////////////////////////////////////////
FUNCTION uniqueFilename(path)
	DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
	IFB FSO.FileExists(path) THEN
		DIM fol = FSO.GetParentFolderName(path)
		DIM filename = FSO.GetBaseName(path)
		DIM extension = FSO.GetExtensionName(path)
		DIM i = 2
		WHILE FSO.FileExists(FSO.BuildPath(fol, filename + " (" + i + ")." + extension))
			i = i + 1
		WEND
		RESULT = FSO.BuildPath(fol, filename + " (" + i + ")." + extension)
	ELSE
		RESULT = path
	ENDIF
FEND
    (5,7) (6,9) (8) (10) (16) (17) (19) (23,33) (24,34) (31) (32) (32) (39)

表の最終データの下のセルを選択

CONST xlDown = -4121

DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Open("C:\Users\Owner\Downloads\東京月別平均気温(2000-2019年).xlsx")

Excel.Range("B4").End(xlDown).Offset(1).Select
    (3) (4) (5) (7) (7) (7)

ワークブックの数と名前を取得

DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE

FOR i = 1 TO 3
	Excel.Workbooks.Add()
NEXT

DIM Workbooks = Excel.Application.Workbooks

PRINT "ブック数:" + Excel.Workbooks.Count
PRINT "-----"

FOR Workbook IN Workbooks
	PRINT "ブック名:" + Workbook.Name
NEXT

SLEEP(3.00)

Excel.Application.Quit
    (1) (2) (5) (8)
  1. Excel.Workbooks.Count(10)
  2. Excel.Workbooks.Items(13)
  3. Excel.Workbook.Name(14)
  4. (17) (19)
結果
ブック数:3
-----
ブック名:Book1
ブック名:Book2
ブック名:Book3

指定したフォルダ内の拡張子とファイルの種類を返す

DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
DIM folderspec = "D:\Desktop\"
DIM Files = FSO.GetFolder(folderspec).Files

FOR File IN Files
	PRINT FSO.GetExtensionName(File.Name) + ":" + File.Type
NEXT
    (1) (3)
  1. FSO.Folder.Files(3)
  2. FSO.Files.Item(5)
  3. (6) (6) (6)

オフライン作業取得

DIM WshShell = CREATEOLEOBJ("WScript.Shell")

TRY
	// Ver11以上
	DIM version = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\svcVersion")
EXCEPT
	// Ver10以下
	version = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version")
ENDTRY

IFB VAL(TOKEN(".", version)) <= 10 THEN
	// Ver10以下
	DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
	IE.Visible = TRUE
	IFB IE.Offilne = TRUE THEN
		PRINT "オフライン作業中です"
	ELSE
		PRINT "オフライン作業中ではありません"
	ENDIF
	IE.Quit
ELSE
	// Ver11以上
	PRINT "オフライン作業は利用できません"	
ENDIF
    (1,13) (5,8) (11) (11) (14) (15)
  1. IE.Quit(20)
結果
オフライン作業は利用できません

指定期間のメールを日毎に集計(Outlook)

CONST olFolderIndex = 6

DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderIndex)
DIM Items = Folder.Items

Items = Items.Restrict("[ReceivedTime] >= '2020/12/01' AND [ReceivedTime] < '2020/12/31'")

HASHTBL dates = HASH_SORT

FOR MailItem IN Items
	DIM datetime = MailItem.ReceivedTime
	GETTIME(0, datetime)
	DIM date = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
	dates[date] = dates[date] + 1 
NEXT

FOR i = 0 TO LENGTH(dates) - 1
	PRINT dates[i, HASH_KEY] + "<#TAB>" + dates[i, HASH_VAL]
NEXT
    (3) (4) (5) (6) (8) (12) (13) (14) (19)
結果
2020/12/05	78
2020/12/06	60
2020/12/07	72
2020/12/08	82
2020/12/09	75
2020/12/10	91
2020/12/11	82
2020/12/12	77
2020/12/13	63
2020/12/14	71
2020/12/15	104
2020/12/16	84
2020/12/17	80
2020/12/18	93
2020/12/19	78
2020/12/20	66
2020/12/21	67
2020/12/22	75
2020/12/23	82
2020/12/24	73
2020/12/25	87
2020/12/26	73
2020/12/27	56
2020/12/28	65
2020/12/29	69
2020/12/30	44
2020/12/31	1

タスクバーにある時計の秒を非表示にする

PC再起動後に適用されます。

DIM WshShell = CREATEOLEOBJ("WScript.Shell")

DIM name = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowSecondsInSystemClock"
DIM value = 0
DIM type = "REG_DWORD"

WshShell.RegWrite(name, value, type)

//DOSCMD("shutdown /r /t 0")

//////////////////////////////////////////////////
// 【引数】
//   serial : 時間を表すシリアル値を指定 
// 【戻値】
//   
//////////////////////////////////////////////////
FUNCTION Second(serial)
	RESULT = REPLACE(FORMAT(INT(serial * 86400) MOD 60, 2), " ", "0")
FEND
    (1) (7) (9)

予定データをExcelから読み込み追加する(Outlook)

CONST xlUp = -4162
CONST olAppointmentItem = 1

HASHTBL reminders
reminders["なし"] = -1;       reminders["0分"] = 0;       reminders["5分"] = 5
reminders["10分"] = 10;       reminders["15分"] = 15;     reminders["30分"] = 30
reminders["1時間"] = 60;      reminders["2時間"] = 120;   reminders["3時間"] = 180
reminders["4時間"] = 240;     reminders["5時間"] = 300;   reminders["6時間"] = 360
reminders["7時間"] = 420;     reminders["8時間"] = 480;   reminders["9時間"] = 540
reminders["10時間"] = 600;    reminders["11時間"] = 660;  reminders["0.5日"] = 720
reminders["18時間"] = 1080;   reminders["1日"] = 1440;    reminders["2日"] = 2880
reminders["3日"] = 4320;      reminders["4日"] = 5760;    reminders["1週"] = 10080
reminders["2週"] = 20160

DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
DIM Workbook = Excel.Workbooks.Open("D:\Desktop\予定一覧.xlsx")

DIM MaxRow = Excel.Cells(Excel.Rows.Count, 1).End(xlUp).Row

DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM AppointmentItem = Outlook.CreateItem(olAppointmentItem)

FOR row = 2 TO MaxRow
	PRINT row
	WITH AppointmentItem
		.Subject = Excel.Cells(row, 2).Value        // 件名
		.Location = Excel.Cells(row, 3).Value       // 場所
		.Start = Excel.Cells(row, 4).Value          // 開始時刻
		.End = Excel.Cells(row, 5).Value            // 終了時刻
		IF Excel.Cells(row, 6).Value = "○" THEN .AllDayEvent = TRUE     // 終日
		IFB reminders[Excel.Cells(row, 7).Value] <> -1 THEN
			.ReminderSet = TRUE
			.ReminderMinutesBeforeStart = reminders[Excel.Cells(row, 7).Value]     // リマインダー
		ELSE
			.ReminderSet = FALSE
		ENDIF
		.BusyStatus = 1                             // 公開方法
		.Body = Excel.Cells(row, 8).Value           // 本文
		.Save
	ENDWITH
NEXT

MSGBOX((MaxRow - 1) + "件の予定を登録しました。")

Outlook.Quit
Excel.Quit

//////////////////////////////////////////////////
// 【引数】
//   serial : 時間を表すシリアル値を指定 
// 【戻値】
//   
//////////////////////////////////////////////////
FUNCTION Minute(serial)
	RESULT = REPLACE(FORMAT(INT(serial * 1440) MOD 60, 2), " ", "0")
FEND
    (15,21) (16) (17) (19) (22) (26) (27)
  1. Outlook.AppointmentItem.Location(28)
  2. (29) (30) (31) (33,36) (34)
  3. Outlook.AppointmentItem.BusyStatus(38)
  4. (39) (40) (44)
  5. Outlook.Application.Quit(46)
  6. (47)