XLOPENエクセルオープン関数

ExcelまたはOOoのCalcを起動する関数です。第一引数に読み込むファイル名(新規の場合は省略)、第二引数に起動フラグ、第三引数以降にパラメータ(パスワードや読み込み専用)を指定します。

XLOPEN関数を使うとファイルが既に開かれている場合そのファイルのオブジェクトを取得するので、同じファイルが開かれて[読み取り専用]になるのを防ぐことができます。

構文
  1. Excel = XLOPEN( ファイル名, 起動フラグ, パラメータ, パラメータ, … )
引数
ファイル名 (String)省略可
読み込むファイル名、新規の場合は省略
起動フラグ (Boolean = 0,#xlopen = 0)省略可
0(デフォルト)
起動済みのExcelがある場合はそれを、なければ新規にExcelを起動
XL_NEW, True(1)
既にExcelが存在しても 新規にExcelを起動
XL_BOOK(2)
ExcelにてBOOK単位で制御したい場合(BOOKのオブジェクトを返す)
XL_OOOC(3)
OpenOffice.org / LibreOffice の表計算(Calc)の起動
パラメータ (String)省略可
ファイルオープンに対し追加パラメータがある場合に("password:=1234", "ReadOnly:=True" 等)
Excelのパラメータ
UpdateLinks
リンク更新方法(0:外部参照,リモート参照とも未更新、1:外部更新,リモート未更新、2:リモート更新,外部未更新、3:ともに更新)
ReadOnly
読み取り専用で開く場合にTrueを指定
Format
テキストファイル時の区切り文字(1:タブ、2:カンマ、3:スペース、4:セミコロン)
Password
パスワード保護されたブックを開くのに必要なパスワード
WriteResPassword
書き込み保護されたブックに書き込むのに必要なパスワード
IgnoreReadOnly
「読み取り専用を推奨する」のダイアログを抑止したい場合にTrueを指定
戻り値
ExcelのCOMオブジェクト
(XL_OOOC指定時は OOoのCalc のオブジェクト)

Workbooks.Openでの書き換え

XLOPEN関数はUWSCのPro版限定なので、Free版で使用する場合はWorkbooks.Open メソッド (Excel)で書き換えることで同じように使うことができます。

Book1を「1234」のパスワードを入力して開く。

UWSC
DIM Excel = XLOPEN("D:\Desktop\Book1.xlsx", 0, "Password:=1234")
UWSC
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE

Excel.Workbooks.Open("D:\Desktop\Book1.xlsx",,,, "1234")

Book2を読み取り専用で開く。

UWSC
DIM Excel = XLOPEN("D:\Desktop\Book2.xlsx", 0, "ReadOnly:=True")
UWSC
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE

Excel.Workbooks.Open("D:\Desktop\Book2.xlsx",,TRUE)

Book3を「1234」のパスワードを入力して、読み取り専用で開く。

UWSC
DIM Excel = XLOPEN("D:\Desktop\Book3.xlsx", 0, "Password:=1234", "ReadOnly:=True")
UWSC
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE

Excel.Workbooks.Open("D:\Desktop\Book3.xlsx",,TRUE,, "1234")

自作のXLOPEN関数

Pro版でしか使えないXLOPEN関数をFree版でも使えるように自作しました。

UWSC
FUNCTION XLOPEN(path = "", flg = 0, param1 = EMPTY, param2 = EMPTY, param3 = EMPTY, param4 = EMPTY, param5 = EMPTY, param6 = EMPTY)
	HASHTBL param
	DIM array[] = "UpdateLinks", "ReadOnly", "Format", "Password", "WriteResPassword", "IgnoreReadOnly"
	FOR i = 0 TO UBound(array)
		param[array[i]] = EMPTYPARAM
	NEXT
	i = 1
	FOR i = 1 TO 6
		IF EVAL("param" + i) = EMPTY THEN BREAK
		param[COPY(EVAL("param" + i), 1, POS(":=", EVAL("param" + i)) - 1)] = COPY(EVAL("param" + i), POS(":=", EVAL("param" + i)) + 2)
	NEXT
	IFB flg = XL_OOOC THEN
		DIM WshShell = CREATEOLEOBJ("WScript.Shell")
		Excel = EXEC(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\scalc.exe\"))      // OpenOffice.orgまたはLibreOfficeのCalcのパスを指定
	ELSE
		IFB path = "" THEN
			TRY
				Excel = GETACTIVEOLEOBJ("Excel.Application")
			EXCEPT
				Excel = CREATEOLEOBJ("Excel.Application")
				Excel.Workbooks.Add
			ENDTRY
			Excel.Visible = TRUE
			CTRLWIN(GETID(, "XLMAIN"), ACTIVATE)
		ELSE
			Excel = CREATEOLEOBJ("Excel.Application")
			Excel.Visible = TRUE
			Excel.Workbooks.Open(path, param["UpdateLinks"], param["ReadOnly"], param["Format"], param["Password"], param["WriteResPassword"], param["IgnoreReadOnly"])
		ENDIF
	ENDIF
	SELECT flg
		CASE 0
			RESULT = Excel
		CASE XL_NEW
			RESULT = Excel
		CASE XL_BOOK
			RESULT = Excel.ActiveWorkbook
		CASE XL_OOOC
			RESULT = Excel
	SELEND
FEND

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND

プログラム実行例

気象庁のホームページから一月分の気温を取得しExcelでグラフを作成

UWSC
結果
使用関数

Excelを起動

UWSC
CONST xlUp = -4162
CONST xlLineMarkers = 65

DIM year = 2020
DIM month = 8

DIM IE = IEBoot()
IE.Navigate("https://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=14&block_no=47412&year=" + year + "&month=" + month + "&day=&view=p1")
BusyWait(IE)

DIM array[-1][-1]
DIM element = IE.document.getElementById("tablefix1")
getTableData(element, array)

IE.Quit

DIM Excel = XLOPEN()
DIM SheetName = Excel.ActiveSheet.Name

XLSETDATA(Excel, array, "A1")

DIM row = Excel.Cells(Excel.Rows.Count, 1).End(xlUp).Row
DIM Charts = Excel.Charts.Add

WITH Charts
	.ChartType = xlLineMarkers
	.SeriesCollection.NewSeries
	.HasTitle = TRUE
	.ChartTitle.Text = "札幌 " + year + "年" + month + "月気温"

	WITH .FullSeriesCollection(1)
		.XValues = "=Sheet1!$A$5:$A$35"
		.Name = "=<#DBL>最高気温<#DBL>"
		.Values = "=Sheet1!$H$5:$H$35"
		WITH .Format
			.Fill.ForeColor.RGB = 255
			.Line.ForeColor.RGB = 255
		ENDWITH
	ENDWITH

	WITH .FullSeriesCollection(2)
		.XValues = "=Sheet1!$A$5:$A$35"
		.Name = "=<#DBL>最高気温<#DBL>"
		.Values = "=Sheet1!$I$5:$I$35"
		WITH .Format
			.Fill.ForeColor.RGB = 16711680
			.Line.ForeColor.RGB = 16711680
		ENDWITH
	ENDWITH
ENDWITH

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   needle : 検索する値 
//   haystack : 配列 
// 【戻り値】
//   needleが見つかった場合に配列のキー 
//////////////////////////////////////////////////
FUNCTION arraySearch(needle, haystack[])
	DIM i = 0
	FOR item IN haystack
		IFB item = needle THEN
			RESULT = i
			EXIT
		ENDIF
		i = i + 1
	NEXT
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 数値 : 取得したい<a href="https://uwsc.jp/com/ie/" >InternetExplorer オブジェクト</a>のタイトル・URLもしくは数値を指定 
//   完全一致フラグ : (TRUE : 文字列が完全一致したものを取得、FALSE : 文字列の一部を含むものを取得) 
// 【戻り値】
//   条件に一致する<a href="https://uwsc.jp/com/ie" >InternetExplorer</a> 
//////////////////////////////////////////////////
FUNCTION getIEObj(str, flg = FALSE)
	DIM Shell = CREATEOLEOBJ("Shell.Application")
	DIM ShellWindows = Shell.Windows
	DIM IE[-1]
	FOR i = 0 TO ShellWindows.Count - 1
		TRY
			IFB ShellWindows.Item(i).Name = "Internet Explorer" THEN
				arrayPush(IE, ShellWindows.Item(i))
			ENDIF
		EXCEPT
		ENDTRY
	NEXT
	SELECT CHKNUM(str)
		CASE TRUE
			IFB str = 0 THEN
				RESULT = LENGTH(IE)
			ELSE
				IF str < 0 THEN str = str + LENGTH(IE) + 1
				TRY
					RESULT = IE[str-1]
				EXCEPT
					RESULT = ERR_VALUE
				ENDTRY
			ENDIF
		CASE FALSE
			DIM pattern = IIF(flg, "^" + str + "$", str)
			DIM titleList = SLICE(IE)
			FOR i = 0 TO UBound(titleList)
				titleList[i] = titleList[i].Document.title
			NEXT
			DIM urlList = SLICE(IE)
			FOR i = 0 TO UBound(urlList)
				urlList[i] = urlList[i].Document.URL
			NEXT
			DIM num = ERR_VALUE
			SELECT TRUE
				CASE pregGrep(pattern, titleList) <> FALSE;	num = arraySearch(pregGrep(pattern, titleList)[0], titleList)
				CASE pregGrep(pattern, urlList) <> FALSE;		num = arraySearch(pregGrep(pattern, urlList)[0], urlList)
			SELEND
			TRY
				RESULT = IE[num]
			EXCEPT
				RESULT = ERR_VALUE
			ENDTRY
	SELEND
FEND

//////////////////////////////////////////////////
// 【引数】
//   table : tableエレメント 
//   arr : 取得したデータを格納する配列(参照引数) 
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE getTableData(table, Var arr[][])
	rowMax = table.rows.length - 1
	colMax = 0
	FOR row = 0 TO table.rows.length - 1
		IFB table.rows(row).cells.length - 1 > colMax THEN
			colMax = table.rows(row).cells.length - 1
		ENDIF
	NEXT
	DIM arr[rowMax][colMax]
	FOR row = 0 TO table.rows.length - 1
		FOR col = 0 TO table.rows(row).cells.length - 1
			n = 0
			WHILE arr[row][col + n] <> ""
				n = n + 1
			WEND
			arr[row][col + n] = table.rows(row).cells(col).innerText
			IFB table.rows(row).cells(col).rowSpan > 1 AND table.rows(row).cells(col).colSpan > 1 THEN
				rmax = table.rows(row).cells(col).rowSpan - 1
				cmax = table.rows(row).cells(col).colSpan - 1
				FOR r = 1 TO rmax
					FOR c = 1 TO cmax
						arr[row + r][col + c] = "←"
					NEXT
				NEXT
			ENDIF
			IFB table.rows(row).cells(col).rowSpan > 1 THEN
				n = table.rows(row).cells(col).rowSpan - 1
				WHILE n
					arr[row + n][col] = "↑"
					n = n - 1
				WEND
			ENDIF
			IFB table.rows(row).cells(col).colSpan > 1 THEN
				n = table.rows(row).cells(col).colSpan - 1
				WHILE n
					arr[row][col + n] = "←"
					n = n - 1
				WEND
			ENDIF
		NEXT
	NEXT
FEND

//////////////////////////////////////////////////
// 【引数】
//   InPrivate : InPrivateブラウズ・モードを有効にするときはTRUEを指定 
// 【戻り値】
//   InternetExplorerオブジェクト 
//////////////////////////////////////////////////
FUNCTION IEBoot(InPrivate = FALSE)
	DIM IE
	SELECT InPrivate
		CASE TRUE
			DOSCMD("start iexplore -private")
			GETID("InPrivate - Internet Explorer - [InPrivate]", "IEFrame", -1)
			IE = GETACTIVEOLEOBJ("InternetExplorer.Application","InPrivate - Internet Explorer - [InPrivate]")
		CASE FALSE
			TRY
				IE = CREATEOLEOBJ("InternetExplorer.Application")
				IE.Visible = TRUE
			EXCEPT
				EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
				GETID("Internet Explorer", "IEFrame", -1)
				TRY
					IE = GETACTIVEOLEOBJ("InternetExplorer.Application")	
				EXCEPT
					IE = getIEObj(-1)
				ENDTRY
			ENDTRY
	SELEND
	RESULT = IE
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻り値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   pattern : 検索するパターンを表す文字列 
//   array : 検索される配列 
// 【戻り値】
//   
//////////////////////////////////////////////////
FUNCTION pregGrep(pattern, array[], flags = 0)
	DIM res[-1]
	FOR item IN array
		IF reTest(item, pattern) THEN arrayPush(res, item)
	NEXT
	RESULT = SLICE(res)
FEND

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻り値】
//   正規表現にマッチするかどうか 
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Test(str)
FEND

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
使用関数

LibreOffice Calcを起動

UWSC
DIM Excel = XLOPEN()
//XLCLOSE(Excel, TRUE)
使用関数

Excelでセルに値を代入

UWSC
DIM Excel = XLOPEN(, XL_OOOC)
//XLCLOSE(Excel, TRUE)
使用関数

セルに配列の値を代入

配列の場合、セル位置は必須。

UWSC
DIM Excel = XLOPEN()

FOR row = 1 TO 5
	FOR col = 1 TO 5
		XLSETDATA(Excel, row + ", " + col, row, col)
	NEXT
NEXT

//XLCLOSE(Excel, TRUE)
使用関数

指定したシートをアクティブにする

UWSC
DIM Excel = XLOPEN()
DIM arr[2][1] = 12, 45, 78, 2417, 51, 478

XLSETDATA(Excel, arr, "A1")

//XLCLOSE(Excel, TRUE)
使用関数

指定したセルから値を取得します

UWSC
DIM Excel = XLOPEN()
XLACTIVATE(Excel, "Sheet2")

//XLCLOSE(Excel, TRUE)
使用関数

楽天銀行定期預金の金利をExcelに保存

UWSC
DIM Excel = XLOPEN()
XLSETDATA(Excel, RANDOM(), "A1")
PRINT XLGETDATA(Excel, "A1")

//XLCLOSE(Excel, TRUE)
使用関数

この記事は役に立ちましたか?

はい
いいえ
ご協力ありがとうございます。

関連記事

XLSHEET関数 (スクリプト関数)
Excelシートを追加・削除する。
PageSetup オブジェクト
Excel のシートの印刷設定を表すオブジェクトです。シートの用紙サイズ、余白、方向、印刷タイトルなど、印刷に関連する設定を管理するのに使用されます。
Application オブジェクト
Excel全体を表すオブジェクトです。Excel全体に対しての操作、設定変更をしたい場合に使います。
Border オブジェクト
上下左右一つひとつの罫線を表します。
Borders オブジェクト
RangeオブジェクトまたはStyleオブジェクトの4つの罫線を表す、4つのBorderオブジェクトのコレクションです。
Characters オブジェクト
オブジェクトに含まれる文字列の文字を表します。
Chart オブジェクト
ブック内のグラフを表します。
ChartObjects オブジェクト
指定したグラフ シート、ダイアログ シート、またはワークシート上のすべての ChartObject オブジェクトのコレクション。
Charts オブジェクト
指定されたブックまたは作業中のブックにあるすべてのグラフシートのコレクションです。
Comment オブジェクト
セルに関連付けられたコメントを表します。