2023年7月26日水曜日

ある日、Windowsパソコンを共有することになり、一番困ったのは、無人運転の夜間バッチや早朝バッチがうまく動かなかった場合のトラシューが難しくなったことだ。

或る日、突然、Windowsパソコンを共有することになった。
これまでは、夜間や早朝に無人運転していたバッチは、ログインしたままなので、エラーが起きた場合、その画面を見ることができた。
しかし、共有することになって、以降は、当然、ログインしたままにできない。
つまり、バッチは、ログインしていなくても実行できるようにした。そして、実行できた。
エラーが起きたら、プログラムはそのエラー画面を出したまま、止まっていた。だから、そのエラー画面を見ることができたのだった。
ところが、バッチで動かしたaccess、excelといったプログラムは、ログインしていないため(システムが動かしているため)、エラーが起こった場合にその画面を見ることができない。
すなわち、表からは見えないシステムの空間で実行されるので、実行中の画面もエラーで止まっている画面も全く見ることができないのである。
どうするかといえば、エラーの原因解明のための情報をログとして吐き出し、プログラムをキチンと終わらせておく必要がある。
つまり、On Error GoTo Error_Handlerをモジュールの先頭で宣言し、エラーの原因究明のじょうほうをログとして出力する、適切なError_Handler(msgbox)を書いておく。 或いは、システムが起動したプログラムを捕まえる方法は、あるのだろうか?

2023年7月11日火曜日

vbaでシートをコピーし、名前を付けて保存するコードを書くためには、excelの微妙な癖を踏まえる必要がある。それが流儀だ。

vbaでシートをコピーし、名前を付けて保存するコードは、excelのクセを踏まえた上で、コードを書いていく。

Sub CopyandSaveFile()
Dim file1 as String
    'menuシートのBxxセルにあるファイル名をゲットしておく。
    file1 = Worksheets("menu").Range("Bxx").Value
    'まず、新しいブックを作成する。即ち、新しいファイルをオープンしておく。
    Workbooks.add
    'シートをコピーする。
    Worksheet("table").Range("A1:G4").Copy
    'シートを貼り付ける。
    ActiveSheet.Range("A1:G4").PasteSpecialAll
    '式を値にする。
    ActiveSheet.Range("A2:G4").Value = ActiveSheet.Range("A2:G4").Value  
    '列幅を整える。
    ActiveSheet.Range("A:G").Autofit
    '名前を付けて保存する。
    ActiveWorkbook.Saveas fileNmaes:=file1
    'ファイルをクローズする。
    ActiveWorkbook.Close                              
end Sub
 Workbooks.addしたら、ActiveSheetは、新たに作成した空のファイルのシートになる。それがExcelの癖。そして、最後にファイルをクローズしておくのもexcelの癖に合わせるためだ。