2016年8月31日水曜日

Excel VBA 素早くクリックすると反応してしまう

【不具合点】
シート上に設けたボタン(OLEObject)をクリックすると、そのイベント処理の間に素早くクリックを繰り返すと、その処理が終わった後も、2,3回再実行されてしまう不具合。

【原因】
3秒間程度のイベント処理は、計測機器の制御を伴う為 sleep が多用されておりボタンクリックのイベントも受け付けるからでは。

【対策/効果無し】
  1. 処理の先頭で、ボタンをディスエーブルする(グレー表示になる)
  2. 表示されているセルに"BUSY"を書き込んでフラグと兼ねた表示にする②
  3. ②ではダメなので、ステータスバーに"BUSY"を表示しフラグとして使う
  4. 表示させることがまずいと考え、純粋にフラグを使うも効果なし

【採用した方法】
  • 「無かったことにする」・・・マウスバッファをクリアする
    Win32 API PeekMessage 関数を使用して実現



2016年8月30日火曜日

ユーザー プロファイル サービスのログオンに失敗しました

永くパソコンを使ってきたが、初めてお目にかかった。朝電源オン後、「ユーザー プロファイル サービスのログオンに失敗しました」のメッセージがでて、Windows7 にログインできない。
前日の夜、「終了後シャットダウンする」設定をしてエンコードさせたソフトが、一時間程度フルパワーで動作したであろうことが、きっかけと思われる。
  • ふたつのアカウント(どちらも管理者権限)のログアウトしてあった方が壊れた
  • 正常なアカウントから全て見ることが出来たので被害は最小限だ
  • デスクトップに貼り付けてあったが進行中の作業をまず移動した
  • ブラウザのお気に入りが使えない、ATOK辞書がサラの状態、で困った
  • ネットで調べると、新しいアカウントを作りコピーするしかないみたい
3つ目のアカウントを作り、
  • C:\Users\xxxxxx\AppData
    を全てコピーした。3千個460MBくらいの容量があった
  • ATOKの辞書も上書きコピーできた
  • 幸いマイドキュメントのフォルダ内はデスクトップ背景用の画像くらいしか使っていなかったので、マイドキュメントのフォルダのコピーはすぐだった
  • 膨大な仕事用のデータフォルダはそのままなので、バックアップ用ソフトのフォルダ指定の書換えも一部で済んだ
  • DropBoxは自動でインストール、ログインし直す必要があった
  • itunes Music プレイリストもそのまま使えた
  • Googleなど再設定/これは仕方ない
一週間経過するが、ほぼ元の操作感で使用できる状態に戻った。(Cromeのフォントが気に入らないが)
  • アカウントをふたつ設けてあったこと
    (アカウント作成にセーフモード云々が不要)
  • マイドキュメント下はアカウント別のデータしか入れてなかった
次のパソコンもこうしないと。
そろそろ買い換え時のサインかも。こまめにバックアップを。

2016年8月26日金曜日

ヘッドルーペ

15年位前にルーペ専門店から購入し、基板を組み立てるときに愛用していた。1.7倍・2倍・2.5倍などレンズ交換できる。ライトが装着できるが、装着して使ったことは殆ど無い。
暗い現場の作業用にアウトドア用のヘッドライトを購入した。それにちょうどいい隙間があって、そこにアクリル板を押し込むことにした。いい角度にアクリル板を曲げ、レンズも脱着(ねじで固定)可能にした
ヘッドライトはポケットに入るくらいに丸められるので、ばらせば工具箱に入るサイズのレンズホルダになった。
作業室ではこちらが使いやすかったのだけれど、落とした際に破損、一回目はあて板を接着して修理できたが、二回目(左写真)は修理はあきらめた。

2016年8月5日金曜日

Excel VBA 外部ファイルを保存する際のあれこれ

外部ファイルを保存する際、無条件に上書き保存する以外は、上書き保存確認のメッセージや、そこでキャンセルされた場合への対応が必須。

【常に上書き保存/例:ログへ一行記入】
  • Application.DisplayAlerts '設定不要
  • Application.Windows(BookName).Visible '隠して作業も不要
  • Application.ScreenUpdating = False の画面更新抑止だけでOK
【ブックを新規作成して上書き保存/例:新規ログを作成】
  • OSで上書きを確認の「はい/いいえ」が出るのを無視する(☆印)
  • Application.ScreenUpdating は画面更新(ちらつき)抑止
  • 新しいワークブックを Add したら、保存後 Close して破棄すること(※印)
    これは、Add した時点ではフォーマットが未確定のブック、これに名前をつけて保存したら別物、残っている作業に使ったブックを破棄する
Application.ScreenUpdating = False
Set XLB = Workbooks.Add
' ここでXLBに対する作業
Application.DisplayAlerts = False '☆
XLB.SaveAs Filename:=myFullPath
XLB.Close (False) '☆※
Application.DisplayAlerts = True '☆
Application.ScreenUpdating = True

【ダイアログを使ってファイルを保存/一番複雑な例】
  • 新しいブックを作り、これに出力して保存するようなケース
  • フォルダを選択するファイルダイアログオブジェクトを使う場合は、
    操作者が任意のフォルダを選択でき、かつファイル名の初期値を与えたとしても、ファイル名を操作者が書き換え可能なので、同名ファイルが存在する場合が出る
  • ダイアログを使用すると、フォルダもファイル名もダイアログで変更できてしまうので、それに対応する必要がある
  • ダイアログを使用すると、途中でキャンセルできてしまう
  • ループ内に Application.GetSaveAsFilename を置いて、「確定」するまで繰り返しダイアログを表示する必要がある
  • 隠して作業した場合は、可視化してから保存すること
【DisplayAlerts = False にしなかった場合】
  • 常に強制的に上書きする場合は、 DisplayAlerts を操作する必要は無い
  • OS側で上書き保存の確認メッセージが出る(キャンセルボタン有り)
  • キャンセルされるとそこで立ち往生してしまうので、予め同名ファイルの有無を調べるとかの対策が要る
【閉じる際の様々なケース】
  • ブックに変更がある場合は、保存確認のメッセージが表示される
    Workbooks("test.xlsx").Close
  • 保存しないで閉じる
    Workbooks("test.xlsx").Close SaveChanges:=False
  • 保存して閉じる
    Workbooks("test.xlsx").Close SaveChanges:=True
  • 分けて処理するなら、先に変更を保存してあるからFalseでいい
    Workbooks("test.xlsx").Save
    Workbooks("test.xlsx").Close False
  • 上書き保存して閉じる
    Workbooks("test.xlsx").Close True
  • 別名(myFullPath)で保存して閉じる
    Workbooks("test.xlsx").Close SaveChanges:=True, Filename:=myFullPath
  • Open メソッドで開いたブックを同じファイル名で保存したい場合
    Workbooks("test.xlsx").Save
  • Add メソッドで新規追加したブックを保存したい場合(SaveAs)
    With Workbooks.Add
        .Worksheets(1).Range("A1").Value = "test"
        .SaveAs Filename:=ThisWorkbook.Path & "\testNew.xlsx"
    End With

2016年8月4日木曜日

Excel VBA ブックを閉じる際のプロシージャが無視される

ブックを閉じる時の自動実行方法は次の2通り
  • Workbook_BeforeClose
  • Auo_Close
実行順序は、次の順
  1. Workbook_BeforeClose
  2. Auto_Close
【Workbook_BeforeClose】
  • 「ThisWorkbook」に記述する
  • ブックを閉じる前に発生
  • 変更されたブックの場合は、変更内容の保存を要求する前に発生
【Auo_Close】
  • 標準モジュールに記述する
【不具合内容】
BeforeClose を使用して処理を記述した際、処理を飛ばされて閉じてしまうことがある。省略される原因として考えられるのは、
  1. 変更が無い場合に Beforeclose は飛ばされてしまう?
  2. イベントの許可、不許可のせい?
【試してみた】
自動モードや、編集モードなど、ファイルを閉じるシーン別に試してみた。
  • Excel ファイルを開いた直後(初期化プロシージャ実行前)
    • イベント許可の状態
    • 保存のみだと:BeforeSave
    • ×印で閉じる:BeforeClose→Auto_Close
  • 初期化プロシージャ実行後、自動モードで表示中
    • イベント不許可の状態
    • ×印で閉じる(変更無し):Auto_Close→WindowsDialogue
    • ×印で閉じる(変更有り):Auto_Close→WindowsDialogue

  • 編集モード(シートの一部のセルを編集可)で表示中
    • イベント許可の状態
    • セルの入力イベントを検知(ドロップダウンリスト)があるため「許可」
    • ×印で閉じる(変更有):
      BeforeClose→Auto_Close→WindowsDialogue→BeforeSave
  • システム設定モード(シートの一部のセルを編集可)で表示中
    • イベント不許可の状態
    • セルへの入力は可、イベントを検知不要
    • ×印で閉じる(変更有り):Auto_Close→WindowsDialogue
WindowsDialogue: 変更を保存するかのポップアップ

【結論】
  • BeforeClose が実行されないのはイベント不許可になっているため
  • Auto_Closeはイベントの不許可でも実行される
OLEボタンはアプリケーションの「イベントでは無い」らしい。ボタンが効くのでイベント許可になっていると思い込んでいたため、組み合わせ毎に調べる羽目になった。