日本の情報発信基地

UWSC

2018/10/13
 
UWSC

スポンサーリンク

コンテンツ(CONTENT)

1. EXCELの起動(visible)

CREATEOLEOBJからExcelのCOMオブジェクトを作成し、
visibleプロパティを操作してExcel表示させます

visibleプロパティ
EXCEL.visible = True / False
visibleプロパティ
・True・・・オブジェクトを表示します
・False・・・オブジェクトを非表示にします

EXCELを起動する

さあ、まずはExcelのCOMオブジェクトを生成し、起動させてみましょう。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.Workbooks.add()

上記のスクリプトを実行してみましょう。
するとExcelが画面に表示されます。
冒頭の「EXCEL = CREATEOLEOBJ(“Excel.Application”)」で、
ExcelのCOMオブジェクト(インスタンス)を作成し、EXCELという変数に格納しています。
続いて、そのExcelオブジェクトのvisibleプロパティの値をTrueに設定しています。
visibleとは「可視性」の意味で、オブジェクトの表示/非表示を司ります。
ただし、InternetExplorerとは少し異なり、Workbooks.add()という一文を加えることで、
通常Excelを起動した場合と同じ状況になります。

visibleプロパティの順番を変えてみよう

例えばVisible=Trueを先ではなく、Workbooks.add()の後に行った場合はどうなるでしょうか。
結果は変わらないことが想像できますが、
試しにやってみましょう。
スクリプトは以下になります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.Workbooks.Add()
EXCEL.visible = True

どうでしょうか。
おそらく結果は変わらないでしょう。
ここでお伝えしたいことは、CREATEOLEOBJ(“Excel.Application”)で、
ExcelのCOMオブジェクトを作成した時点で、
利用や取得が可能になるメソッドやプロパティがあるという事です。

スポンサーリンク

 

2. ワークブックの追加(workbooks.add)

ExcelのCOMオブジェクトを作成し、
ワークブックを追加します

workbooks.addメソッド
EXCEL.workbooks.add()
workbooks.add()

EXCELにワークブックを追加する

EXCELにワークブックを追加しましょう。
特に指定、設定をしていなければBook1という名前のワークブックが追加され
3枚のワークシート「Sheet1、Sheet2、Sheet3」が付属しているはずです。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()

上記のスクリプトを実行することで、結果を確認できます。

workbooks.addを複数実行するとどうなるか

workbooks.add()を連続してみましょう。 スクリプトは以下になります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.workbooks.add()
PRINT EXCEL.workbooks.count() + "つのワークブックがあります"

どうでしょうか。
2つのワークブックが追加され、
最後にワークブックの数をworkbooks.count()で取得しています。

スポンサーリンク

3. アクティブワークブックとワークシートの追加(activeworkbook, worksheets.add)

Excelが起動しており、ワークブックが存在する場合に、
activeworkbookで選択しているワークブックを指定します。
そしてそのワークブックにワークシートを追加します。

activeworkbook

worksheets.add
EXCEL.activeworkbook.worksheets.add()
workbooks.add()

選択しているワークブックを指定しEXCELにワークシートを追加する

EXCELにワークシートを追加しましょう。
下記のスクリプトでは4枚のワークシート「Sheet4」が追加されます。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.activeworkbook.worksheets.add()

上記のスクリプトを実行することで、結果を確認できます。

worksheets.addを複数実行し、数をかぞえる

worksheets.add()を連続してみましょう。 スクリプトは以下になります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.activeworkbook.worksheets.add()
EXCEL.activeworkbook.worksheets.add()
PRINT EXCEL.activeworkbook.worksheets.count() + "つのワークシートがあります"

どうでしょうか。
ワークブックにワークシートが追加され、
最後にワークシートの数をworksheets.count()で取得しています。

 

 

4. 既存Excelファイルのオープン(workbooks.open)

Excelファイルが存在する場合に、
そのファイルをオープンする方法を解説します。

workbooks.open
EXCEL.workbooks.open(ファイル)
workbooks.open()

Excelファイルをオープンする

例えばデスクトップにいくつかのExcelファイルが並んでいるとしましょう。

その中の一つ(yes.xls)をオープンします。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.open("C:\Users\root\Desktop\yes.xls")

上記のスクリプトを実行することで、結果を確認できます。

複数ファイルをオープンする

openを連続してみましょう。

デスクトップに3ファイル(yes.xls、no.xls、unknown.xls)が並んでいる場合
スクリプトは以下になります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.open("C:\Users\root\Desktop\yes.xls")
EXCEL.workbooks.open("C:\Users\root\Desktop\no.xls")
EXCEL.workbooks.open("C:\Users\root\Desktop\unknown.xls")
FOR A = 1 TO EXCEL.workbooks.count()
PRINT EXCEL.workbooks(A).name
NEXT

どうでしょうか。
3ファイルがオープンされ、ファイル名が出力されます。

 

 

5. ワークシートの追加、ワークシートの選択と名前取得

ワークシートの追加、
および選択と名前取得をする方法を解説します

worksheets.add
worksheets(N).name

ワークシートの追加、選択、名前取得を実行

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.activeworkbook.worksheets.add()
FOR A = 1 TO Excel.activeworkbook.worksheets.count
PRINT Excel.activeworkbook.worksheets(A).name
NEXT

上記のスクリプトを実行することで、結果を確認できます。

複数のシートを追加し、シート名を変更する

シートの名前は変更することができます。複数のワークシートを処理する以下のスクリプトを見てみましょう。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR A = 1 TO 10
EXCEL.activeworkbook.worksheets.add()
NEXT
FOR B = 1 TO Excel.activeworkbook.worksheets.count
Excel.activeworkbook.worksheets(B).name = "Rename_" + B
NEXT

ワークブックにワークシートが10枚追加され、全てが「Rename_」で始まる名前になりました。

6. セルの位置を取得する

セルの位置を取得する

address([列絶対参照、行絶対参照])
//引数はTRUE/FALSEで指定

新規ワークブックを追加した際の現在のセル位置を取得する

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
PRINT "絶対参照:"   + EXCEL.ActiveCell.Address()

上記のスクリプトを実行することで、結果を確認できます。
ワークブックを新規追加すると、
A1の位置にセルが置かれています。
そのため結果が「$A$1」となります。

絶対参照、相対参照でセル位置を取得する

パラメータを利用することで、取得時に絶対参照か相対参照か選ぶことができます

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
PRINT "絶対参照:"   + EXCEL.ActiveCell.Address()
PRINT "列相対参照:" + EXCEL.ActiveCell.Address(FALSE)
PRINT "行相対参照:" + EXCEL.ActiveCell.Address(TRUE,FALSE)
PRINT "相対参照:"   + EXCEL.ActiveCell.Address(FALSE,FALSE)

それぞれ、絶対参照、列や行の相対参照、相対参照でセル位置を取得できました。

 

 

7. セルの行や列の位置を取得する

セルの行や列の位置を取得する

Row //行
Column //列

新規ワークブックを追加した際の現在のセルの行や列の位置を取得する

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
PRINT "列の位置:"   + EXCEL.ActiveCell.Row
PRINT "行の位置:"   + EXCEL.ActiveCell.Column

上記のスクリプトを実行することで、結果を確認できます。
ワークブックを新規追加すると、
A1の位置にセルが置かれています。
行は行番号となり、
列の場合はAから採番されているので、対応する数値が返ります。

セルの位置を変更してから取得してみる

上記のサンプルだと、結果がどちらも1となります。分かりやすい様にセルの位置を変えてから、再度取得してみましょう
サンプルは下記のようになります。

 

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
PRINT "列の位置(初回時):"   + EXCEL.ActiveCell.Row
PRINT "行の位置(初回時):"   + EXCEL.ActiveCell.Column
//セル位置を移動してから再取得
//行を10、列を15移動する
EXCEL.ActiveCell.Offset(10,15).Select
PRINT "列の位置(変更後:"   + EXCEL.ActiveCell.Row
PRINT "行の位置(変更後):"   + EXCEL.ActiveCell.Column

移動前と後で数値が変化しているのがわかると思います。

 

 

 

8. セルを絶対移動、相対移動する

セルを絶対移動、相対移動する

Range(セル位置).Select //絶対移動(例:A100、AC32)
ActiveCell.Offset(行, 列).Select //現在位置から相対移動

セルを移動してみる

絶対移動で行のアルファベット、列の数字を組み合わせたセル位置を入力し、Selectすることで該当場所へ移動できます。
ActiveCell.Offsetで行の数字、列の数字を入力し、Selectすることで該当場所へ移動できます。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
//絶対移動
EXCEL.Range("A30").Select
//相対移動
EXCEL.ActiveCell.Offset(1,2).Select
NEXT

上記のスクリプトを実行することで、セルの移動結果を確認できます。
まずはA30の位置に移動、
そしてそこから下行に1つ、右列に2つ相対移動します。

セルの位置を確認しながら実行する

上記のサンプルだと、一瞬のうちに移動してしまうので確認がしづらいです。
分かりやすい様にメッセージを出しながら実行してみましょう。

スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
//絶対移動
EXCEL.Range("A30").Select
MSGBOX(EXCEL.ActiveCell.Address() + "に移動しました")
EXCEL.Range("BC130").Select
MSGBOX(EXCEL.ActiveCell.Address() + "に移動しました")
EXCEL.Range("A1").Select
MSGBOX(EXCEL.ActiveCell.Address() + "に移動しました")
//相対移動
MSGBOX("相対移動します")
FOR A = 1 TO 10
//現在位置から、下行に1つ、右列に2つ移動することを10回繰り返す
EXCEL.ActiveCell.Offset(1,2).Select
PRINT A + "回目:" + EXCEL.ActiveCell.Address()
SLEEP(0.3) //視覚的に分かりやすいように待ち時間
NEXT

視覚的にセル移動を確認できたと思います。

 

 

9. 対象セルを含む領域の終端を取得する

対象セルを含む領域の終端を取得する

end(-4121).Address() //下終端セルのアドレス情報
end(-4161).Address() //右終端セルのアドレス情報
end(-4159).Address() //左終端セルのアドレス情報
end(-4162).Address() //上終端セルのアドレス情報

終端を取得する

下記のサンプルでは3 × 3の範囲で値を入力した範囲の終端のアドレスを取得しています

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR A = 0 TO 2
EXCEL.ActiveCell.Offset(A,0).value = RANDOM(30)
FOR B = 0 TO 2
EXCEL.ActiveCell.Offset(A,B).value = RANDOM(30)
NEXT
NEXT
PRINT "下終端:" + EXCEL.ActiveCell.End(-4121).Address()
PRINT "右終端:" + EXCEL.ActiveCell.End(-4161).Address()
PRINT "左終端:" + EXCEL.ActiveCell.End(-4159).Address()
PRINT "上終端:" + EXCEL.ActiveCell.End(-4162).Address()
NEXT

上記のスクリプトを実行することで、終端の情報が取得できます。
冒頭の例や、サンプルスクリプトではAddressで位置情報を取得していますが、
Selectによる移動、Valueによる値取得も行えます。

30 × 30の範囲で終端のアドレス、値を取得する

上記のサンプルより規模を大きくし、
かつ位置情報以外にもセル移動や値取得をしてみましょう。

スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR A = 0 TO 30
EXCEL.ActiveCell.Offset(A,0).value = RANDOM(30)
FOR B = 0 TO 30
EXCEL.ActiveCell.Offset(A,B).value = RANDOM(30)
NEXT
NEXT
PRINT "下終端:" + EXCEL.ActiveCell.End(-4121).Address()
PRINT "右終端:" + EXCEL.ActiveCell.End(-4161).Address()
PRINT "左終端:" + EXCEL.ActiveCell.End(-4159).Address()
PRINT "上終端:" + EXCEL.ActiveCell.End(-4162).Address()
PRINT "下終端の値:" + EXCEL.ActiveCell.End(-4121).value
PRINT "右終端の値:" + EXCEL.ActiveCell.End(-4161).value
PRINT "左終端の値:" + EXCEL.ActiveCell.End(-4159).value
PRINT "上終端の値:" + EXCEL.ActiveCell.End(-4162).value
MSGBOX("各終端へ移動します")
EXCEL.ActiveCell.End(-4121).Select
SLEEP(0.5)
EXCEL.Range("A1").Select
EXCEL.ActiveCell.End(-4162).Select
SLEEP(0.5)
EXCEL.Range("A1").Select
EXCEL.ActiveCell.End(-4161).Select
SLEEP(0.5)
EXCEL.Range("A1").Select
EXCEL.ActiveCell.End(-4159).Select

終端を検知できるため、繰り返し処理の時にどこまで実行すればよいのか把握するのに便利です。

 

 

10. 特定の範囲を検索する

特定の範囲を検索する

Find(keyword)

文字列を指定し、検索に合致するセルに移動する

範囲を指定(Range(X:X)し、Findを実行することで、該当キーワードに一致するセルの位置情報を取得できます。

以下のサンプルにおいて、「a」と入力してから、セルの移動を行い、その後でFindで見つけた位置を選択しています。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "a"
EXCEL.ActiveCell.Offset(10,10).Select
A = EXCEL.Range("A1:J10").Find("a").Select

検索にヒットした箇所の背景色を変えてみる

上記のスクリプトでは、一瞬のうちに処理が完了してしまうので、本当に挙動したかわかりにくいです。
次のスクリプトで、メッセージによる処理のコメントや、検索結果セルの背景色の変更を実施してみます。
これで処理の流れがわかりやすくなると思います。
スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "a"
EXCEL.ActiveCell.Offset(10,10).Select
MSGBOX("いったん、セルを別の箇所に移動します")
MSGBOX("検索結果のセル位置を表示します")
PRINT EXCEL.Range("A1:J10").Find("a").Address
MSGBOX("検索結果のセル位置を赤色にします")
EXCEL.Range("A1:J10").Find("a").Interior.ColorIndex = 3

該当のセルが赤色になりました。

 

 

11. 検索を繰り返す

検索を繰り返す

after = Find(keyword) //検索の返り値
FindNext(after) //次を検索:検索の返り値を引数にする
FindPrevious(after) //前を検索

検索を繰り返す

「特定の範囲を検索する」で、検索の方法について説明しました。
この記事では複数検索にヒットする状況の場合の、繰り返し方法を説明します。

複数の検索条件に合致するセルがあった場合に、次のセル、次のセルと移動する処理を実現するためFindNextやFindPreviousを使います。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR i = 0 TO 3
EXCEL.ActiveCell.value = "a" + i
EXCEL.ActiveCell.Offset(1,0).Select
NEXT
After = EXCEL.Range("A1:A10").Find("a")
EXCEL.Range("A1:A10").Find("a").Select
EXCEL.Range("A1:A10").FindNext(After).Select
EXCEL.Range("A1:A10").FindPrevious(After).Select

メッセージを出しながら検索を繰り返す

上記のスクリプトでは、一瞬のうちに処理が完了してしまうので、挙動しているのか確認が難しいです。
次のスクリプトで、メッセージによる処理のコメント、背景色の変更が行われるので、検索の繰り返しがわかりやすく確認できます。
スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR i = 0 TO 10
EXCEL.ActiveCell.value = "a" + i
EXCEL.ActiveCell.Offset(1,0).Select
NEXT
After = EXCEL.Range("A1:A10").Find("a")
FOR i = 10 TO 1 STEP -1
MSGBOX("次を検索(あと" + i + "回)")
EXCEL.Range("A1:A10").FindNext(After).Interior.ColorIndex = (i MOD 2) + 3 //交互に色変更
After = EXCEL.Range("A1:A10").FindNext(After)
NEXT
FOR i = 10 TO 1 STEP -1
MSGBOX("前を検索(あと" + i + "回)")
EXCEL.Range("A1:A10").FindPrevious(After).Interior.ColorIndex = (i MOD 2) + 5 //交互に色変更
After = EXCEL.Range("A1:A10").FindPrevious(After)
NEXT

繰り返し「次」「前」と検索できることが確認できました。

 

 

12. セル内の値を数式や文字列で取得する

セル内の値を数式や文字列で取得する

Formula //数式
Text //文字列

数式や文字列を取得する

valueの場合、セルに格納されている情報を取得しますが、
数式や、実際に表示されている値を取得する場合には上記の方法を使います。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "=rand()"
PRINT EXCEL.ActiveCell.Formula
PRINT EXCEL.ActiveCell.Text

数式のまま、あるいは表示文字列で取得できました。

valueとの違いを見てみる

続いて、valueにより取得した値も並べて表示し、違いを見て見ましょう

スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "=rand()"
PRINT "値:" + EXCEL.ActiveCell.value
PRINT "数式:" + EXCEL.ActiveCell.Formula
PRINT "表示:" + EXCEL.ActiveCell.Text

実現したい処理に応じて、取得する値の形式を分けてることができます。

 

 

13. オートフィルを実行する

オートフィルを実行する

AutoFill(Rangeオブジェクト, Type)
Rangeオブジェクト・・・Range(範囲)で取得できる範囲オブジェクト
Type・・・連続値の場合は2、最適値の場合は0、日付の場合は5、曜日は6を指定
※数値はxlFillSeriesクラスの定数を指定している

1と入力したセルの下に2、3、4・・・と連続させる

AutoFillメソッドで呼ばれるオートフィルという機能は
Excelでも重宝する機能です。
連続した数値の範囲を選択し、ドラッグすると連続した値を自動で埋めてくれます。
これをスクリプトで実現すると下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = 1  //開始値を入力
RNG = EXCEL.Range("A1:A10"//範囲を取得
EXCEL.ActiveCell.AutoFill(RNG , 2) //連続する値でオートフィル

1に続いて2~10までの値がオートフィルされました。

日付や曜日、適切な値の場合も見てみる

オートフィルのタイプに様々なタイプを指定してみましょう。
サンプルは下記の通りとなります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.Offset(0,0) = "連続値"
EXCEL.ActiveCell.Offset(0,1) = "適切な値"
EXCEL.ActiveCell.Offset(0,2) = "日付"
EXCEL.ActiveCell.Offset(0,3) = "曜日"
EXCEL.ActiveCell.Offset(1,0) = 1
EXCEL.ActiveCell.Offset(1,1) = 100
EXCEL.ActiveCell.Offset(2,1) = 110
EXCEL.ActiveCell.Offset(1,2) = "2012/1/1"
EXCEL.ActiveCell.Offset(1,3) = "Sunday"
RNG1 = EXCEL.Range("A2:A10")
RNG2 = EXCEL.Range("B2:B10")
RNG3 = EXCEL.Range("C2:C10")
RNG4 = EXCEL.Range("D2:D10")
EXCEL.ActiveCell.Offset(1,0).AutoFill(RNG1 , 2) //Type=2、連続値
EXCEL.Range("B2:B3").AutoFill(RNG2 , 0) //Type=0、適切な値
EXCEL.ActiveCell.Offset(1,2).AutoFill(RNG3 , 5) //Type=5、日付
EXCEL.ActiveCell.Offset(1,3).AutoFill(RNG4 , 6) //Type=6、曜日

それぞれ、任意のオートフィルで値が展開されています。

 

 

14. 色を指定する

色を指定する

Color = 16進数
ColorIndex = 0~56

ColorもしくはColorIndexで色を指定する

Colorは16進数での色指定、ColorIndexはあらかじめ決められた色セットの数値(57色)から選択指定します。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.Interior.Color = $808000
EXCEL.ActiveCell.Offset(1,0).Interior.ColorIndex = 13

ColorIndexの一覧を見てみる

実際はColorで16進数指定する事は煩雑なため、
ColorIndexを使うケースが多いです。
下記のスクリプトでColorIndexの一覧を出力してみましょう。

スクリプトは以下のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR A = 0 TO 56
EXCEL.ActiveCell.value = A
EXCEL.ActiveCell.Offset(0,1).Interior.ColorIndex = A
EXCEL.ActiveCell.Offset(1,0).Select
NEXT

ColorIndexの一覧とその番号を確認できました。3=赤、5=青、46=オレンジなどを知っておくと便利です。

 

 

15. 特定の範囲を置換する

特定の範囲を置換する

Find(keyword)

文字列を指定し、検索で合致するセルを置換する

範囲を指定(Range(X:X)し、Replaceを実行することで、該当キーワードに一致するセルの文字列を指定文字列に置換できます。

以下のサンプルにおいて、「おにぎり」と入力し、セルの移動を行い、その後でReplaceで「パン」に置換しています。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "おにぎり"
EXCEL.ActiveCell.Offset(10,10).Select
A = EXCEL.Range("A1:J10").Replace("おにぎり","パン")

複数の箇所が置換されるか確認する

上記のスクリプトでは、一瞬のうちに処理が完了してしまうので、本当に挙動したかわかりにくいです。
次のスクリプトで、メッセージによる処理のコメントを行い、複数セルの一斉処理が出来るか確認してみましょう
これで処理の流れがわかりやすくなると思います。
スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "a"
EXCEL.ActiveCell.Offset(10,10).Select
MSGBOX("いったん、セルを別の箇所に移動します")
MSGBOX("検索結果のセル位置を表示します")
PRINT EXCEL.Range("A1:J10").Find("a").Address
MSGBOX("検索結果のセル位置を赤色にします")
EXCEL.Range("A1:J10").Find("a").Interior.ColorIndex = 3

該当のセルが赤色になりました。

 

 

16. [ファイルを開く]を表示する

[ファイルを開く]を表示する

FindFile

[ファイルを開く]を表示する

ユーザが指定してファイルを開くようにすることができます。
ファイルを開いた後もスクリプトの作業は継続できます。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.FindFile

ファイルを開いたかを判定する

FindFileはTRUE/FALSEの値を返すので、ファイルを開いたか、開いていないか判定しましょう。
下記のスクリプトのようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
IF EXCEL.FindFile
EXCEL.ActiveCell.value ="ファイルを開きました"
ELSE
MSGBOX("ファイルを開きませんでした")
ENDIF

ファイルを開くことができました。

 

 

17. 再計算を実行する

再計算を実行する

Calculate

計算式を再実行する

セルの値を再計算します。

例えば”=Now()”という関数が埋め込まれたセルは現在時間を表示します。再計算を実行することでまた最新の時間に更新されます。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
EXCEL.ActiveCell.value = "=Now()"
MSGBOX("時間を更新します")
EXCEL.calculate

ランダム値を更新する

上のスクリプトでは、時間の経過が確認しずらいかもしれません。
代わりに乱数を使って、いっせいに再更新するスクリプトを実行してみます。
10×10の範囲内に”=RAND()”関数を挿入し、0~1の間のランダムな数が表示されます。
そこで再計算を実行することで、ランダムな値が一斉に変わるようになります。 スクリプトは下記のようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
FOR A = 0 TO 9
FOR B = 0 TO 9
EXCEL.ActiveCell.Offset(A,B) = "=Rand()"
NEXT
NEXT
FOR C = 1 TO 3
MSGBOX( C + "/3回目:再計算を実行します")
EXCEL.calculate
NEXT

再計算が実行されました

 

 

18. [ファイルを開く]からファイル名を取得する

[ファイルを開く]からファイル名を取得する

GetOpenFileName

[ファイルを開く]を表示して、選択されたファイル名を取得する

このメソッドは、ファイルを開くのではなく、選択されたファイルの名称を取得します

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
PRINT EXCEL.GetOpenFileName

ファイルを開いたかを判定する

選択されなかった場合はFALSEの値を返すので、ファイルを開いたか、開いていないか判定しましょう。
下記のスクリプトのようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
FileName = EXCEL.GetOpenFileName
IF FileName = FALSE
MSGBOX("ファイルを開きませんでした")
ELSE
PRINT FileName
ENDIF

ファイルを開くことができました。

 

 

19. ワークブック名、シート名を取得・選択する

ワークブック名、シート名を取得・選択する

ActiveWorkbook.name
ActiveWorksheet.name
Sheets.count
Sheets(N).Select

ワークブック名、シート名を取得・選択する

ワークブックの名前やシートの名前をNameで取得することが出来ます。
またSheetsオブジェクトに対してCountをすることでシート数を取得できます。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
PRINT "ワークブック名:" + EXCEL.ActiveWorkbook.name
PRINT "ワークシート名:" + EXCEL.ActiveSheet.Name
PRINT "シート数:" + EXCEL.Sheets.count
sName = EXCEL.ActiveSheet.Name
EXCEL.Sheets(sName).Select

全てのシート名を取得する

上のスクリプトで、ワークブック名、ワークシート名、シート数を取得できました。
これらのパーツを組み合わせて、現在選択しているワークブックの全てのシート名を取得、選択してみましょう。
下記のスクリプトのようになります。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
PRINT "ワークブック名:" + EXCEL.ActiveWorkbook.Name
PRINT "ワークシート名:" + EXCEL.ActiveSheet.Name
PRINT "シート数:" + EXCEL.Sheets.Count
FOR A = 1 TO EXCEL.Sheets.count
PRINT EXCEL.Sheets(A).name
EXCEL.Sheets(A).Select
NEXT

シートの取得、選択を順番に行うので、最後のシートが選択されて終了していることでしょう。

20. ブックを保存し閉じる

ブックを保存し閉じる

ActiveWorkbook.Save
ActiveWorkbook.SaveAs(ファイル名)
ActiveWorkbook.Saved
ActiveWorkbook.Close

ブックを保存し閉じる

ブックを上書き保存(Save)、別名で保存(SaveAs)をすることができます。
またブックの変更後に保存されたか否かをSavedで取得することができます。
最後にCloseとすることでブックが閉じられます。

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.Workbooks.add()
EXCEL.ActiveWorkbook.Save
EXCEL.ActiveWorkbook.SaveAS("C:\myBook.xls")
PRINT "保存済み? "EXCEL.ActiveWorkbook.Saved
EXCEL.ActiveWorkbook.Close

上記のスクリプトを実施すると、ブックの保存やクローズが確認できます。
なお、上書き保存時に保存されるパスはご自身のマシンにより異なります。
※例えばマイドキュメントに保存されます

保存状況に応じて保存する

Savedを使うことにより、未保存時はFalse、保存時はTrueが返ります。
条件分岐に使用し、未保存ならば上書き、保存済みならば別名で保存をするようにしてみます。
スクリプトは下記のとおりです。

 

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.Workbooks.add()
IF EXCEL.ActiveWorkbook.Saved = False
  //未保存なら上書き
  EXCEL.ActiveWorkbook.Save
ELSE
  //保存済みならC:\myObject.xlsとして保存
  EXCEL.ActiveWorkbook.SaveAS("C:\myObject.xls")
ENDIF
MSGBOX("保存しました")
EXCEL.ActiveWorkbook.Close

シートの取得、選択を順番に行うので、最後のシートが選択されて終了していることでしょう。

 

スポンサーリンク

- Comments -

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Copyright© ヒカルの情報ブログ , 2018 All Rights Reserved.