ぴよ

'グラフ出力位置
Set gdp = wwb.Worksheets("グラフ").Range("A2")
'グラフシートをアクティブ化して出力
wwb.Worksheets("グラフ").Activate
wwb.Worksheets("グラフ").Shapes.AddChart(Left:=gdp.Width, Top:=gdp.Top).Select
Set graph = ActiveChart
graph.ChartType = xlXYScatterLines
graph.SetSourceData Source:=Range(hoge)

graph.Axes(xlValue).MinimumScale = 84
graph.Axes(xlValue).MaximumScale = 92
graph.Axes(xlValue).MajorUnit = 1
graph.Axes(xlValue).MinorUnit = 0.2
graph.Axes(xlValue).MinimumScale = 83

wwb.Worksheets("グラフ").Shapes(Mid(graph.name, 5)).IncrementTop t
wwb.Worksheets("グラフ").Shapes(Mid(graph.name, 5)).IncrementLeft l
l = l + 380
If l = 380 * 3 Then
l = 0
t = t + 250
End If
graph.HasTitle = True

Select Case i
Case Is = 1
graph.Parent.name = wdp.Cells(1, 1) & "100"
graph.ChartTitle.Text = wdp.Cells(1, 1) & "100"
Case Is = 2
graph.Parent.name = wdp.Cells(1, 1) & "200"
graph.ChartTitle.Text = wdp.Cells(1, 1) & "200"
Case Is = 3
graph.Parent.name = wdp.Cells(1, 1)
graph.ChartTitle.Text = wdp.Cells(1, 1)
End Select

VT250 SPADA チェーン調整

しばらくエントリ書いてなかったのでバイクネタの投下です。
スパーダのチェーン調整についてです。
日常整備だし、とくに珍しいこともない気がするけどもメモ。

まず今回使った工具はこちら。
f:id:yutechi25:20121225100648j:plain
17と24のロングストレート、14と12のスパナを使いました。(ロングストレートは普通のオフセットめがね、最悪スパナでもなんとか代用可。14と12のスパナはストレートめがねならOKです。こっちはオフセットだと難しいと思います。)非力な私にとってロングストレートはとても使い勝手よくて助かります。14と12のスパナは普通は車載工具に含まれているのかな。

本当はリアタイヤを持ち上げたいのですが、センタースタンドもメンテナンススタンドもないので少し強引ではありますが、そのままやっちゃいます。

まずはリアタイヤを固定しているボルトを緩めます。
右手に24
f:id:yutechi25:20121225100750j:plain
左手に17
f:id:yutechi25:20121225100813j:plain

これで両方を交差する方向にまわして緩めていきます。

ある程度緩んだらチェーンのテンションを確認して、
f:id:yutechi25:20121225100924j:plain
左手に14、右手に12のスパナを持って締めるor緩める。
スパーダちゃんはこの部分がダブルナットになっているので、ちょうどいいテンションになったら左手の14を固定して右手側のナットを締めます。
サイドスタンドだけでチェーンの調整をしてしまっているので、タイヤがまっすぐになっているか確認しながら締めてください。

で、よければタイヤを固定していたボルトを締め直します。再度チェーンのテンションを確認。よさげな仕上がりになるまで頑張ります。数10メートルくらい走ってみて、タイヤの角度を見ながら、緩くないか、キツくなりすぎてないか確かめてください。

私はいいテンションを維持するのって難しいと思いました。
キツくなりすぎたり、緩くなりすぎたり、整備慣れの問題かもしれないですが。

VBAでグラフに任意の名前をつける場合

VBAでグラフに名前をつけるときの注意点など。

ActiveSheet.ChartObjects(1).Name = "温度変化のグラフ"

だけではなくて、

ActiveChart.Parent.Name = "温度変化のグラフ"

というように書くこともできる。なにが便利か、ってグラフを生成しながら名前をつけていく場合に便利。グラフに与えられる番号がわからなくなってしまう場合でも、現在操作しているActiveChartから指定できるのがいい。

ちなみに、ChartObjectsオブジェクトのややこしいところは、その下位にChartというオブジェクトがあるところ。ChartObjectはグラフの枠全体を示し、その下位オブジェクトにあたるChartではグラフそのものを示していると覚えておくとよい。
もっと言えばChartにもName属性はあるが、Chart.Nameでは値を受け取るだけで書き込むことができない。

Application.WorksheetFunctionで範囲をCellsで指定したい、でももっと簡単に指定したい。

Application.WorksheetFunctionについては以前、このブログのApplication.WorksheetFunctionで他ブックやシートを参照する方法 - 早起きはyutechiの得「ブック名・シート名・セル範囲を明記する」というようなことを書いたけれど、もうひとつメモすることが。

これまで、すごくめんどくさいと思いつつも、Application.WorksheetFunctionを使うときには必ず絶対番地指定で書いてきました。
ループを回して順番に計算させたいときも、

  1. 対象のCells.Addressをとって、
  2. Len()でAddressの長さを判定し、
  3. それをもとにInstr()で列名の場所をとり、
  4. Mid()で列名だけ切り出す。。

う~ん、非常にめんどくさい!なにかもっとうまい方法はないかなぁと常々思っていました。
セルの扱いでは超基本なのですが、Resizeを使います!

例えば、
f:id:yutechi25:20121205115023p:plain
このようなデータがあったとして、B列からD列にかけて存在するA値、B値、C値、それぞれの最大値をB7からD7に入力したいとします。この場合は

Set dp = Range("B2")
for i = 1 to 3
    dp.Cells(6,i) = Application.WorksheetFunction.Max(dp.Cells(1,i).Resize(5))
next i

と記述します。便利!
もちろん、resizeの引数を数値から変数にしてあげれば指定範囲を変更させながらのループ処理が行えます。素敵。
基本的にCells(行,列)指定のようにResize(行,列)で指定しますので出力セル位置を変えて範囲指定をResize(,5)のようにすれば行ループで1行目、2行目の計算結果を縦に結果を出したいようなときにも応用可能です。


ちなみにResizeの使い方については
これだけはおさえるセル操作(2)−Resizeで自由自在:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
こちらのページがわかりやすくまとまっています。参考にしてます。ありがとうございます。

同じワークシートを連続で多回数コピーした場合のエラー回避

ExcelのVBAマクロで、計算、グラフ描画等々の、様々な処理をするときに、元の計算書式となるようなワークシートをコピーして処理をさせるというような場合は多くあると思う。
このときに、for文などで繰り返し処理をかける際、毎回コピーをさせていくが故にランタイムエラーが発生することがある。

実行時エラー1004:ワークシートクラスのコピーに失敗しました。

このメッセージが表示され、いままで普通に行えていたworksheets.copyが突如失敗するという、初見ではなにがなんだかわからずビビってしまうエラーが発生する。
これを防ぐには、コピー回数が一定回数を超えたら自動的にブックを保存すればよい。

thisworkbook.save

マクロと同一ブックに対象のワークシートがあるならこれだけ。マクロのあるブックと処理している対象のブックが違うのであれば、対象のワークシートがあるブックをこまめにsaveすること。


見てみたらきちんとMicrosoft様のサポートページにも記述されていましたね。
[Excelで、プログラムを使用してワークシートをコピーする際、ランタイム エラー 1004 が発生する。http://support.microsoft.com/kb/210684/ja]

(追記)
グラフを大量に生成するときも、ランタイムエラーが発生することがあるらしいです。その際にも、こまめにworkbook.saveしておけばエラーを避けられるとのこと。

Wordで本気になって論文を書く

卒業研究も少しずつ進み、そろそろ論文を書くための構成も考えなければと思っていたころのこと。Excelは毎日のようにVBAを使ってマクロに関してはそれなりに頑張っているのですが、Wordを本気で使ってみたことがないと気づきました。もったいない!
WordだってMicrosoft様の作品なのですから、超高機能です。表紙、目次、序論、研究計画、ほげほげ、結論、参考資料、謝辞と、きれいに書くためにいろいろな機能が詰まっているはずなのです。問題はそれをユーザーが使い切れていないだけで。

まずは、準備です。ファイルオプションからリボンのユーザー設定を選択。
「開発」タブを挿入しましょう。Excelでもおなじみの開発タブが現れました。
やはりMicrosoft様のパッケージを本気になって使うにはまずここから。

この隠れた機能、ツールボックスがすごくかっこいい、便利。
これからはExcelのみならず、Wordとも仲良く接していこうとおもいます。

UserFormでFrameを使う意味

VBAに限らないのだけれど、UserFormでFrameを使う意味がわからずにいた。けどこれすごく便利。当然のような使い方なので恥ずかしいレベルなのだけれど、今更きづいたので記しておく。
FrameのプロパティでVisibleをFalseにしておくとFrameのなかにある要素をすべて隠しておくことができる。
f:id:yutechi25:20121119143704p:plain
これを、例えば以下のように任意のボタンを押す、等のプロシージャでVisibleをTrueにすることで起動させることができる。

Private Sub 設定_Click()
    Frame_menu.Visible = True
End Sub

f:id:yutechi25:20121119144325p:plain
なんだかイケイケな感じでかっこいい。