ACCESSに張ったリンクテーブルを開くと中身が全部 #Deleted になる

起こった現象

サーバ側:SQLserver(たぶんバージョンはあんまり関係ないと思う)
クライアント側:ACCESS2010

サーバ側でテーブルを作り、ACCESSでリンクテーブルを作る。
ACCESS側でテーブルを開いてコピペでデータを突っ込む(どんなやり方で突っ込んだかはあんまり関係ないはず)。
そうすると全てのカラムで #Deleted と表示されてしまう。
SqlServerManagementStudioなどでサーバ側のデータを覗いてみるとデータはちゃんと入っている。
ACCESS側でも I/F 作って実行すると中身がちゃんと見えたりする(この辺は全てにおいてそうかは怪しい)。

なぜそうなったか

サーバ側でキーを bigint で作ったからと思われる。
ACCESS側は長整数型なのでサイズが合わない。

どうすれば直るか

サーバ側でキーをintで作る。
これで直った。

プロセスが存在しているか確認し、存在しなければ起動するコマンドラインバッチ

経緯

あるPCでDropboxがたまに落ちていることがある。
同期に使っているため困る。

どうしたか

下記のバッチを作り、タスクスケジューラで定期的に実行するようにした。

  • 当該プロセスが存在しているか確認。
  • 存在していなければ起動する。

ソース

@ECHO OFF
::tasklistコマンドからDropbox.exeをfind → ERRORLEVELで判定する
TASKLIST | FIND "Dropbox.exe" > NUL
IF NOT ERRORLEVEL 1  (
  GOTO ProcessLaunched
) ELSE (
  GOTO ProcessNotLaunched
)

::あれば何もしないで終了
:ProcessLaunched
  GOTO END
::なければ起動させる
:ProcessNotLaunched
  "<フルパス>Dropbox.exe" /home
  GOTO END
:END
EXIT

「コマンドまたはアクション レコードの削除は無効です」と表示されてレコードが削除できない現象

何が起こったか

ACCESSで作ったアプリ。
削除ボタンを押すとレコードが削除される仕様。
やっていることは下記だけ。

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdDeleteRecord

これが動作しなくなった。
表題のメッセージが出て削除されない。

原因

対象テーブルはリンクテーブルであり、リンクを張る時点でACCESS側で主キーを指定していた。
このアプリを修正する必要があり、テスト環境で検証を行うため、リンクテーブルのリンク先をプログラムで書き換えた。
その際、指定していた主キーの設定がはずれてしまったようだ。

対応

そのリンクをいったん削除し、再度(主キーを設定しつつ)作成したらアプリは正常に削除の動作を行った。
コードは一切修正していない。

エクセルで列の位置(数字)または列名(AとかAAとかBAのような)を取得する

どんな時に使う?

列位置が動的に変わる場面で使う。
たいていはプログラム内で使う。

コード

列位置を取得

'列「AA」の列位置を取得 → 答えは「27」
Range("AA:AA").Column

列名を取得

'27列目の列名を取得 → 答えは「AA」
Split(Cells(, 27).Address, "$")(1)

エクセルのマクロが止まる

発生状況

ACCESSから起動したエクセルで、WorkBook_Openに記述したコードの処理が途中で止まる。

  • 確かに最近その辺りのコードをいじってはいた
  • でも大したことはしていない(ような気がする)
  • ブレークポイントは設定していない
  • [継続]ボタンを押すと続行される

対応

とりあえず

  • 止まった時に [Ctrl]+[Break] という明示的に止める操作をしてみた(なんとなく)
  • 止まったコード位置にわざとブレークポイントを設定し、解除した(なとなく)
  • 上書き保存した(バックアップを取らずにやったのは今思えば怖い)

これだけやって、直った。

原因

不明。
なんだろうこの現象。

エクセルやアクセスで画面の描画を一時的に止める

どんな時に使う?

エクセルやアクセスで画面の描画を一時的に止めたい場合。
例えば以下のような場合が該当する。

  • マクロ、VBA、クエリの処理時間が長い
  • 大量のデータをループで読み込むなどで、描画の時間そのものが処理時間を長くしている

コード

エクセル

  • 画面の描画を止める
    Application.ScreenUpdating = False

  • 画面の描画をする
    Application.ScreenUpdating = True

アクセス

  • 画面の描画を止める
    Application.Echo False

  • 画面の描画をする
    Application.Echo True