Vol.576 21.Apr.2009
L
リンクはいつかは切れるもの/マクロ実行時の障害
by 山古事記
お久しぶり、にもかかわらず、皆様方にとってはくだらない、独り言(備忘録)です。
三つの暴露地(射水[富山県]、菅平[長野県]、与那国[沖縄県])での塗装寿命と気候の関係を解析するために、塗装試料ごとの気候データの集計をしています。なんでかというと、塗装暴露試験も5年が経ち、結果を解析して実績報告しないとまずいかなと思うからです。当初、寿命が短いと言われていますヨーロッパで開発された自然塗料の塗装寿命を日本の代表的気候環境で実暴露して、塗装寿命を確かめるためいろいろな種類の塗料を試してみようくらいに考えていました。試験の実行は、追い風・逆風入り交じる乱気流の中なんとか耐えて、ここまで続けてきました。
途中2004年6月には、EN(ヨーロッパ規格)主導のISO16053という木材塗装の実暴露試験法が公表され、規定されている内部標準(ヨーロッパで入手しやすい塗料と木材の組合せ)の塗装系を日本流にアレンジする必要があると感じました。塗装寿命として長短2種類(短:約9ヶ月[日本エンバイロケミカルス/キシラデコール/ピニー]、長:約24ヶ月[リボス/タヤ・エクステリア/パイン])の塗装系を日本での内部標準にと考えるようになりました。塗装基材木材は、オウシュウアカマツ辺材から、日本国内では、耐朽性の基準材にもなっています、スギ辺材が受け入れられやすいでしょう。これらの国内の内部標準として受け入れは、暴露環境気候に対する特徴を把握しておかないと、むつかしいだろうと考えるようになりました。
どの気候要素が塗装寿命に大きな作用をしているか見極めた後、できれば気象観測データと地理・地形データから重回帰推定手法によって、富山県、日本の劣化マップを作るのが最終到達目標です。将来、いろいろな塗料の暴露データを蓄積して同様に解析して、寿命を求める計算式化あるいは寿命マップ化することによって、施工地別の塗装系の選択や再塗装を含む維持管理計画の作成ができます。さらに、酸性雨の影響は予測できませんが、都市気候のヒートアイランド化や異常気象の塗装寿命に及ぼす影響を予測できればと思っています。
現時点での一番の泣き所は、解析にかけられるだけのデータセット(レコード)数がないことです。つまり、重回帰分析では、データセット数は説明変数の数に20ほど加えた数(つまり残渣の自由度20)はほしいところです。つまり、同じ塗装系で暴露箇所や時期をかえての約30回の暴露試験繰り返しは、尋常では行えません。とくに、塗装寿命が2年前後の長さの塗装系では、かなりつらいものがあります。ここでは、無塗装基材の耐用期間(塗装寿命に当たるもの)と内部標準とする予定の塗装系の塗装寿命についてだけ、10〜16個のデータセット数があるにすぎません。
このために三つのマクロを組みました。目的は、塗装系(塗料と基材樹材種の組合せ)ごとの塗装寿命を、塗り回数、塗布量そして暴露気候環境(暴露:水平ないし正南5゜)から重回帰推定するためのデータ表を準備することです。気候環境は、降水量、気温、日照時間、風速など様々ですが、塗装寿命(単位:月)は0.5ヶ月刻みで求めなければいけないほど短いものもあり、暴露開始日付も様々ですので耐用限界に至るまでの気候環境も当然異なりますので、暴露開始日と求めた塗装寿命(月)から、いったん耐用限界に到達した日付を求め(マクロT)、これら二つの日付から月単位で各気候要素の積算値を求めます(マクロU)。これらの計算や操作は、Excelの基本操作の積み重ねでは間違いやすいし、気が遠くなりますので、マクロを組むに限ります。
二つめのマクロ(マクロU)は、塗装系試料ごとの暴露開始日から耐用限界に達した日までの、つまり耐用期間中の降水量、降水日数、積雪日数、気温、日照時間などを耐用限界基準(例えば表面欠陥率30%、カビ汚染率10%、割れ率10%など)ごとに、月単位で積算値を求めるものです。塗装寿命も耐用限界基準別に10種類あるので、塗装寿命と各気候要素の月単位積算値をどう整理するかが問題になります。気候要素の種類の分だけ、このワークシートをコピーしてセルの並びを合わせ、10種類の塗装寿命に対応するその気候要素の月単位積算値を整理することにしました。
三つめのマクロ(マクロV)は、マクロUで求めた月単位積算値を塗装寿命とともに串刺し集計するものです。ここでも塗装寿命が10種類あるので、塗装寿命のワークシートを10回コピーしてセルの並びを合わせ、最初の塗装寿命の列位置にターゲットの塗装寿命を転記し、残る9個の列位置に寿命に至るまでの9気候要素の月単位積算値を転記することにしました。
重回帰分析にかけるには、これらの積算値にもう一ひねり加える必要があります。目的変数を塗装寿命にして、説明変数に先ほどの月単位積算値を気候劣化外力強度にするために耐用期間で割り戻す必要があります。これはExcelで簡単にできます。
下に紹介するのは、マクロVの一つ(10種ある耐用限界基準のなかの1つ)で、汚染率10%基準の塗装寿命に続けて、9つの気候要素別ワークシートで同じセル位置の積算値を取り出して9つ横並びにまとめるものです。中身の操作は簡単なのに、意外とトラブルがありました。そのひとつは、リンク貼り付けつまり式と値の両方をもつセルのうちリンクが切れているセルでマクロの実行が中断することでした。暴露試験の結果として寿命データがまだ確定していない場合の対応として、別ブックとのリンク貼り付けにしたものでした。他のブックとのリンク貼り付けは、いつかは場所関係が変わってリンクが切れてしまいやすいので、最初から使わない方が、後々トラブルの発生が少なくて済みます。これは、ボタン天国200(SOURCENEXT)の「数式の抽出/編集」ボタンがリストアップしてくれるので助かりました。ボタンが出力したリスト(専用ワークシートに出力される)を見ながら、そのセルを探して、式を消し数値(文字を含む)だけを打ち込みました。幸いリンクを貼ったセルは少なかったので、助かりました
Sub Macro23()
' マクロ記録日 : 2009/4/15 ユーザー名 : Mas
' Keyboard Shortcut: Ctrl+
Dim RowsCount As Integer
Dim c As Integer
Dim cOfs As Integer
Dim r As Integer
Dim sit As Integer
Dim ShtLbl As String
Dim ir As Integer
Dim rs As Integer
Dim re As Integer
ShtLbl = "汚染(スギ)" '基準の塗装寿命
cOfs = 9 '基準の塗装寿命のカラム・オフセット値
Worksheets(ShtLbl).Activate
Range("A1").CurrentRegion.Select
RowsCount = Selection.Rows.Count
r = 2
Do While r <= RowsCount
For c = 12 To 36 Step 12 '3暴露地の塗装寿命カラム位置
Select Case c
Case Is >= 24
GoTo Pass1
End Select
Count1:
If r > RowsCount Then GoTo End1 'スルー・オーバーフロー防止
Select Case Len(Cells(r, c))
Case Is = 0
r = r + 1: GoTo Count1
End Select
rs = r + 2
r = rs
Count2:
Select Case Len(Cells(r, c))
Case Is > 0
r = r + 1: GoTo Count2
End Select
re = r - 1
Pass1:
r = rs - 1
Range(Cells(r, c + cOfs), Cells(re, c + cOfs)).Select
Selection.Copy
Range(Cells(r, c), Cells(re, c)).Select
ActiveSheet.Paste
Range(Cells(r, c + 1), Cells(re, c + 9)).Select
Selection.ClearContents
Selection.Interior.ColorIndex = xlNone
Cells(r, c + 1).Value = "降水量(スギ)"
Cells(r, c + 2).Value = "降水日数(スギ)"
Cells(r, c + 3).Value = "積雪日数(スギ)"
Cells(r, c + 4).Value = "平均気温(スギ)"
Cells(r, c + 5).Value = "最高気温(スギ)"
Cells(r, c + 6).Value = "最低気温(スギ)"
Cells(r, c + 7).Value = "日照時間(スギ)"
Cells(r, c + 8).Value = " (スギ)"
Cells(r, c + 9).Value = "平均風速(スギ)"
ir = r
For r = rs To re
If IsNumeric(Cells(r, c)) Then
For j = 1 To 9
Worksheets(Cells(ir, c + j).Value).Select
Cells(r, c + cOfs).Select
Selection.Copy
Worksheets(ShtLbl).Select
Cells(r, c + j).Select
ActiveSheet.Paste
Next j
Else
End If
Escape1:
Next r
Next c
r = re + 1
Loop
End1:
End Sub