2006/11/25

埋め込みグラフを作る その2(グラフ名の取得/設定)

いつも非常に悩むのはこれで,グラフ名を取得もしくは名前をつけられれば…ということが良くあります(複数の埋め込みグラフを作ったときなんかは特にね).そんなときにはこれが良く効きます.

【事例1(Indexを取得)】
Sub graph_make()

With ActiveSheet.ChartObjects.Add(50, 100, 300, 200).Chart
.SetSourceData Sheets("sheet1").Range("A3:D6")
End With

comp = ActiveSheet.ChartObjects.ShapeRange.Name
MsgBox comp

End Sub

【解説1】
上記のようにすると作った埋め込みグラフのIndex名を取得することができます.これで再度グラフをいろいろデコレーションしたい場合にも使いまわししやすいので良いです.完璧.

【事例2(グラフ名を設定して取得する)】
Sub graph_make()

With ActiveSheet.ChartObjects.Add(50, 100, 300, 200).Chart
.SetSourceData Sheets("sheet1").Range("A3:D6")
End With

ActiveSheet.ChartObjects.ShapeRange.Name = "test"

With ActiveSheet.ChartObjects("test").Chart
.ChartType = xlLineMarkers
End With

End Sub

【解説2】
上記のようにするとグラフ名を"test"として設定できますのでこれもまた,いろいろと使いまわすのに非常に便利となります(ちなみに上記の例題では,グラフ名を取得してそれを用いて棒グラフから折れ線グラフに変更しています).ぜひぜひお試しを。。。

埋め込みグラフを作る その1(基本グラフ作成)

ついにこの禁断のお題に足を踏み入れてしまいました。その?まで続くのか楽しみ(すぐ終わってしまったりして…).まずは,基本的な埋め込みグラフの作り方から.


【事例】
以下のデータを使用してグラフを作ることを考えます.シート名はsheet1と仮定します.






Sub graph_make()


With ActiveSheet.ChartObjects.Add(50, 100, 300, 200).Chart
.SetSourceData Sheets("sheet1").Range("A3:D6") , PlotBy:=xlRows
End With


End Sub


【解説】
埋め込みグラフ作成には,ChartObjectsコレクションのAddメソッドを使うとできます.Addの後の4つの数字は(Left, Top, Width, Height)を表しています.これだけだととってもシンプルですねぇ.グラフってとっても奥が深いように感じられて…これからどんどん複雑になっていきます.

ちなみに,上記のマクロがうまく動くと以下のようなグラフが書けると思います.






ちなみに,.SetSourceDateのところの(Source, Plotby)のところのSourceはグラフの元データのセル範囲,Plotbyはデータ系列を行列のどちらにとるかを示します.列方向はxlolumns, 行方向はxlRowsとします.

ワークシート名の変更

これも基本ですがいろいろ使えて便利.

【事例】
Sub Add_sheet()

Worksheets.Add Before:=Worksheets(1)
ActiveSheet.Name = Format(Date, "mm月dd日")

End Sub

【解説】
左から1つ目のシートの前に1枚付け加えて,名前を今日の日付で名前変更されるマクロとなります.ダイレクトに名前を入れても全然問題なし(ただし,その場合名前をダブルクォーテーションで囲む).

2006/11/22

Excel VBAからShellを実行

時々,DOSのシェルが起動できれば…というときがあります.そんな時は以下のようにするとできます.

【事例】
Sub shell_exe()

Shell("mspaint.exe",vbNormalFocus)

End Sub

【解説】
上記のようにすると”ペイント”アプリケーションが起動されます.そのうちもっと詳しい説明をしていきたいとは思ってます.今日はとっても眠いので…これで

クリップボートの中身を削除

以下の命令を使うとクリップボードの中身を削除してくれるので動作が軽くなります.

【事例】
Application.CutCopyMode = False

【説明】
ちなみに,Trueとするとクリップボートの中身を残したままにできるのでクリップボードの中身を別のアプリケーションやマクロに使用する場合にはTrueとして使えます.ただし,クリップボードの中身が大きいと処理に時間が掛かってしまう可能性がありますのでご注意を.

Excelマクロ自動起動・終了 その4(警告・質問等表示しない)

このマクロの自動起動・終了のシリーズの最後として自動で全てをやろうとしたときExcel様の小さな親切大きなお世話として勝手に警告などを表示してExcelマクロが途中中断してしまう場合があり非常に困る場合があります.そういった場合には以下のようなコマンドを実行してやると警告等を無視することができます.

【事例】
Sub warning()

Application.DisplayAlerts = False '警告を出さない

'心置きなく警告が発生してしまうようなマクロを書く

Application.DisplayAlerts = True '警告を出す設定に戻す

End Sub

【解説】
上記の命令で,警告のOn, Offができます.Falseが警告を出さない.Trueが警告を出すようになります.注意としては,あまり良い命令ではないと思うので必要なところだけで局所的に使うのが良いでしょう.マクロ全体で警告を出さないようにしてしまうとようにするといろいろ弊害も出てしまう可能性も考えられるので.

Excelマクロ自動起動・終了 その3(ファイルをセーブせず閉じる)

その2で自動で閉じる命令を実施しましたがそのとき,セーブせずにファイルを閉じたい場合がありますがその場合は次のような命令を使います.

【事例】
ActiveWorkbook.Saved = True

【解説】
上記のような命令を書くとファイルを自動で閉じる場合もセーブしますか?という内容は聞かれずファイルを閉じることができます(つまり,この命令はExcelファイルにセーブさせたふりをさせるようだ).ちなみに,セーブして閉じる場合はActiveWorkbook.SAVEなどとして上書き保存できます(老婆心ながら複数ファイル開いている場合は,ActiveWorkbookの部分がブック名などとなるのでご注意を).

眠いなー.そろそろ寝たい.

2006/11/21

Excelマクロ自動起動・終了 その2(自動終了)

前回のExcelファイル起動後自動マクロ実行をしたら、最後マクロ終了後自動で終了してくれる命令があると…といった場面に出くわすと思います.そんなときは以下の命令で可能です.

【事例】
Sub auto_open()

'マクロをいろいろ書きます

Application.Quit

End Sub

【使い方】
上記のようにマクロの最後のところにApplication.Quitとすると自動でExcelファイルが終了します.このモジュールとWindowsについている「タスク」機能を使えば簡単に定期的にエクセルマクロを実行終了ができるのでいわゆるUnixでいうところのShellとcronのようなことがWindowsでもなんとなくできます(多少の不自由はあるのですが).そのうちタスク機能についても触れられればとは思うのですが一応このブログはExcel VBAとしているので書くべきかどうか迷ってます.違うブログを起こしたほうが良いのではないかと思ってます.

Excelマクロ自動起動・終了 その1(自動起動)

かなり基本的な内容ですが,久しぶりにマクロを書くとついうっかり忘れてしまって”どうやるんだっけ?”となってしまうので一応記入しておこう…

【事例】
sub auto_open()
'以下にマクロを記入します

end sub

【使い方】
マクロ名をauto_openとすることでExcelファイルを開くと同時にその中に書かれているマクロが自動実行されます.

CellやRangeの指定方法のいろいろ

いきなり難易度が低くなったようにも見えますが,自分が意外と苦労するとこにこのことがあります.いろいろあると思うので思いついたときに付け加えていこうと思います。簡単なのから順に

【事例】
cells(1,2).select 'B1を選択
Range(Cells(1, 2), Cells(2, 3)).Select 'B1-C2までを選択

最終列の取得

以前最終行を取得するマクロを作成したが,やっぱり最終列を取得するマクロもほしいなと…多分これは2種類の表示方法があると思う.通常のシート表示だとH1のcellのような表示の場合列としてはH列として取得したいし,R1C1のような表示だとH1の場合Hは8列目のため"8"を取得したいです.

【例題Excelシート】


【事例1(Hを取得する)】
Sub last_col()
Range("A1").SelectSelection.End(xlToRight).Select
endcel = ActiveCell.Address
cellend = Mid(endcel, 2, 1)
MsgBox "このシートの最終セル:" & cellend
End Sub

【事例2(8を取得する)】
Sub last_col()
cellend = Range("A1").CurrentRegion.Columns.Count
MsgBox "このシートの最終セル:" & cellend
End Sub

【解説】
基本的には最終行を取得する方法を応用することで実現できます.

【注意】
注意としては、列の表示方法として事例1と事例2では得られる値が違うので自分がほしい値で使い分けよう.

2006/11/20

ステータスバーに文字を表示するには(その2:ステータスバーにカウンター表示)

その1を応用すると,ステータスバーにマクロの進行状況を表示することができます.つまり,VBAにはFor文を多用するかと思いますがこれを使用すればよいと思います。たとえば以下のようなコードで…

【事例】
Sub status_display()
Count = 10000
Application.StatusBar = True
For i = 1 To 10000
Application.StatusBar = "ステータスバーに表示中です" & i & "/" & Count
k = k + 1
Next
Application.StatusBar = False
MsgBox "終了"
End Sub

【説明】
その1で書いたマクロを使用してさらにFor文の中に繰り返し数をステータスバーに表示させることによってマクロの進行状況が表示できるようになります.ナイスアイデーア.

ステータスバーに文字を表示するには(その1:ステータスバーに表示するだけ)

ステータスバーに文字を表示(特にfor現在のマクロの進行状況などを表示したい場合なんかありませんか?)する方法が結構簡単にできます。

【事例】
Sub status_display()
Application.StatusBar = True
Application.StatusBar = "ステータスバーに表示中です"
for i=1 to 10000000
k=k+1
next
Application.StatusBar = False
MsgBox "終了"
End Sub

【注意点】

Application.StatusBar = True で表示できるようになります。どうもいきなりApplication.StatusBar = "ステータスバーに表示中です"としても良いようだ。

Falseで表示を消すことができる.

2006/11/19

Excelマクロ実行中の画面をとめる

Excelマクロを実行していると絶えず,画面が命令通りに動作しています.これはこれでおもしろいのですが早く結果が知りたいときにはちょっといらいらします.そんなときには,画面の動きを止めてマクロの結果出力の高速化を計れるおまじないがあります。

【事例】
Sub stop_macro_screen()
Application.ScreenUpdating = False 'これで画面が止まります

'??????いろんなマクロを動作させます?????

Application.ScreenUpdating = True 'これで画面が動きます
End Sub

【使い方】
Application.ScreenUpdatingで画面の動作をコントロールできるようです。Falseで止まって,Trueで動き出すみたいです.良かったよかった(これでマクロがサクサク動く).

埋め込みグラフをgifファイルで保存する

今日は,埋め込みグラフをgifファイルで保存する方法を書きます.これは,Webでエクセルファイルを公開したい場合に重宝しています.タスクとかで埋め込みグラフをgifファイルで吐き出すマクロを実行すればリアルタイムに最新グラフを吐き出すことができるのでとてもよいです.

【事例】
Sub gif_save()
ActiveSheet.ChartObjects(1).Chart.Export "c:\temp\test.gif"
End Sub

【注意点】
ChartObjects(1)の1はグラフの番号を記入します(そのうちこの辺の番号の取得方法などもやっていきたいと思ってますが…できるか?).また,hoge.gifとなっているところをjpgとするとjpgとして保存されるようです.対応しているのは,このほかtifにも対応しているようです(拡張子の部分を変えるだけでOKのようです.とっても便利.).