office.notes@misora05

本館ブログのうち,Office・Windwsがらみのネタ+@を抜き出したもの.月水金更新予定.

Accessの「AllowEdits/編集の許可」プロパティが効かない場合

今回やりたかったこと

Accessを使ったツールの開発中,次のような要望が上がりました.

👨「ユーザが特定の操作を行うまで,フォーム(連結フォーム)の更新はさせないでほしい」

この要望を満たすのは一見簡単かと思ってました.
なにせ,AllowEdits/更新の許可という,そのまんまのプロパティがありますからね.

問題発生

で,結論から言うと,以下の制限に引っかかって見事に失敗しました.

フィールドの値をプログラムを使用して変更すると、"AllowEdits/更新の許可" プロパティの設定に関係なく、現在のレコードが編集可能になります。

今回はコマンドボタン等のコントロールの操作からVBAで直接値を投入する部分があったため,そちらの処理が優先されてしまい,ユーザの要望を叶えることができませんでした.
さらに,このコントロール操作が行われると,AllowEditsプロパティの値がまるっと無視されるというおまけつきです.もうこれは「敗北」と言っても差し支えないでしょう.

一応上記のサイトには,

"AllowEdits/更新の許可" が No に設定されているレコードをプログラムで変更する場合、そのレコードをユーザーが変更できないようにするには、プログラムでの変更を行った後にレコードを保存してください。変更が保存された後、"AllowEdits/更新の許可" プロパティの設定が再び有効になります。

‥という記述もあるのですが,今回ユーザの要望を満たすには「各コントロールのイベント発生時にAllowEditsの値を見,その値に応じてイベントのコードを切り替える」という処理を複数個書かなければならない状態となりました.これは面倒くさいし正直嫌です――結構イベントの個数が多かったので.

Microsoft Store (マイクロソフトストア)

解決策(その1)

AccessのフォームにはRecordsetType/レコードセットというプロパティも存在します.

こちらは既定値が 0/ダイナセット ですが,2/スナップショット に設定すると,

  • VBAのコードによる値投入が阻止できる*1
  • 上記の「プロパティの値がまるっと無視される」という問題点も発生しない.

‥という状態になります.こちらの方が多分容易に制御ができるんじゃないかと思います.

解決策(その2)

今回のユーザの要望は以下の通りでした.

👨「ユーザが特定の操作を行うまで,フォーム(連結フォーム)の更新はさせないでほしい」

なので,「編集を許可」というボタンをフォーム上に配置しておき,そこで上記の スナップショット/ダイナセット の切り替えを行うようにしました.

ただし,注意すべき点として,スナップショット・ダイナセットの切り替えを行うと,フォームのカレントレコードが先頭のレコードに変更されてしまいます

なので,上記の切り替えを行う前に予めカレントレコードの位置を覚えておき,切り替え後にDoCmd.GoToPage/GoToPageマクロ・アクションを実行するとよいでしょう.

これで今回のユーザの要望はすべて達成することができました.めでたい.

Microsoft Store (マイクロソフトストア)

*1:行おうとすると実行時エラーが発生する.

Acrobat Readerのコマンドライン引数について

👨「Adobe Readerで特定のPDFファイルを開きたい.ただし,初期状態での倍率は200%で,常に3ページ目を最初に表示したい」

職場でこのような要望が上がりました.

そこで気になって,Acrobat Readerで使えるコマンドラインオプションを(社内で)調べてみたところ,どうも社内で同じことを試した人が過去いたらしく,その痕跡が残っていました.
そこから.彼?彼女?が残した資料をたどってみたら,ありました.

Parameters for Opening PDF Files (日本語版)

上記資料に曰く,

コマンドシェルから PDF 文書を開く場合には、次の構文で /A スイッチを使用してオープンコマンドにパラメータを渡すことができます。
<Acrobat path> /A "<parameter>=<value>" "<PDF path>"

例えば、次のようになります。
Acrobat.exe /A "zoom=1000" "C:\example.pdf"

1 つの URL の中で複数のパラメータを指定することができます。アンパサンド(&)またはパウンド(#) 文字のいずれかで、それぞれのパラメータを区切ります。アクションは、URL 文字列のうち、左から右に処理および実行されます。

‥だそうです.

Surface Pro 4

ここで,今回の要望は次のように引数を設定することで解決しました.

Acrobat.exe /A "page=3&zoom=200" "C:\example.pdf"

ExcelはCSVファイルの閲覧や編集に向いていない

職場で「CSVファイルをダウンロードして保存して私に渡してください」と依頼したら起きたトラブルです.
――「あるある」ネタなのですが.

彼のやった手順を書くと概ね次のようになります.

  1. CSVファイルの「ダウンロード」リンクをクリック.
  2. そのファイルを「開く」(あっ
  3. そのファイルがExcel開かれる(あっあっ
  4. そのファイルを,Excel保存する(ああああああ!
  5. その保存されたファイルを私に渡す(ぎゃー

結果的には,私には意図しない形式に変換されたCSVファイルが渡ってきました.
そのCSVファイルが,要素中に改行コードを含むなどかなり複雑な形式をしており,Excelではそもそも正しく認識されないというのもなお拙かったのですが‥.

Microsoft Store (マイクロソフトストア)

教訓.

  • ExcelCSV形式ファイルを正しく認識してくれないことがあるよ.
  • ExcelCSV形式ファイルを開いて保存すると,元の形式が保たれることは保証されないよ.
  • だから,ExcelCSV形式ファイルを編集するのには向いてないよ.
  • だから,ExcelCSV形式ファイルを開くときには慎重になろうね.
  • だから,もし開いちゃったら保存しないでね!上書き保存なんてもってのほかだよ!
  • ということを,みんなに周知徹底しようね‥.

一応彼もOffice自体は業務上使っていた人なのですが,ExcelCSVファイルを開いて保存したときにそのようなことが起きるとは思ってもいなかったようです.
確かに私も,高専生時代(‥20年近く前か)に同じようなことはやらかした記憶がありますね.

‥と考えると,上記の周知徹底をしなかったのは私のミスだったかもしれません.

Microsoft Store (マイクロソフトストア)

対策.

一応,上記の事柄に加え「CSVファイルはとりあえずメモ帳で開いてみてください」というふうに伝えておきました.

へ?なぜメモ帳かって?
――うちの職場のPCの環境の悪さ所以です.ご賢察を‥.

個人用マクロブックが読み込まれないときの対処法

会社で「個人用マクロブックが使えない!」と言われるトラブルが発生したので,その解決方法をメモしておきます.
詳しい原因を書くと,ともに,「個人用マクロブックが,Excelの起動時に読み込まれていない」です.

パターンその1・「個人用マクロブックが存在しない」

個人用マクロブックの実体は,"C:\Users\UserName\AppData\Roaming\Microsoft\Excel\XLSTART" 配下にある,"PERSONAL.XLSB"です.
これを何らかのはずみで削除してしまった結果,個人用マクロブックが使えなくなったという,きわめて単純なオチでした.

パターンその2・個人用マクロブックが無効になっている」

先のパターンは呆れるほど単純でしたが,こちらはちょっと面倒な話となります.

まず,「ファイル」→「オプション」→「アドイン」と進み,

「管理」ドロップダウンから「使用できないアイテム」を選択し,「設定」.

次いで出てきたこの画面に,もし"PERSONAL.XLSB"があった場合,それを選択して「有効にする」.

f:id:misora05:20190420070817p:plain

これで直るんじゃないかと思います.

Microsoft TeamsはMicrosoftアカウントなしで使えるのか?

数日前,このようなツイートがされていました.

非常に気になったので,以前やった

misora05.hatenablog.com

を思い出しながら,適当なGoogleアカウントでゲスト追加をし,Teamsにサインインしてみようとしたところ,‥

えっ.(Microsoftアカウントの作成を求められた.)

Microsoft Store (マイクロソフトストア)

諦めきれないので,リンク内にあった,"ゲストがチームに参加する方法/How a guest joins a team" という記事を見てみると,

ゲストは、チームとメンバーがいることが予想される結果について、チームの所有者から登録完了メールを受信します。 Azure Active Directory または Office 365 の作業に属している電子メール アドレスまたはアカウントの学校ゲスト ユーザーは、直接、招待を受け入れることができます。 ゲストは、その電子メール アドレスに関連付けられている Microsoft アカウントにまだ存在しない、それらが無料で作成するのには表示されます。

機械翻訳で分かりづらいので原文を表示すると,

The guest receives a welcome email from the team owner, with information about the team and what to expect now that they're a member. Guest users who have an email address that belongs to an Azure Active Directory or Office 365 work or school account can accept the invitation directly. If the guest doesn’t yet have a Microsoft Account associated with their email address, they will be directed to create one for free.

たしかに,GMailアカウントでMicrosoftアカウントは作成できたけど,まさか,それのこと‥?
でもそれだと,ツイートの

マイクロソフトアカウントを持っていなくても、ゲストユーザーとして Gmail. com のアドレスで、ゲストユーザーとしてチームへ参加させることができるように

という記述とは矛盾するような‥.

これについては,一応動向を見守りたいと思います――GMailアカウントのみでTeamsに参加させることができれば,それは非常に便利なので‥.

CSV形式に関する諸注意(血涙)

CSV"Comma-Separated Values"形式ファイル.

名前の通り,カンマで区切られた一見単純な形式ですが,これをちゃんと作ってくれない部署があったせいで,仕事上大変なことになった‥というか,なっているので,これについての絶対にやってはダメなポイントをメモ.

なお,以下はいずれも私が喰らって血の涙を流したことがあると付け加えておきます.

一般的な注意

ExcelCSVファイルを読み込んだ場合は,保存するに際し一考すること.

基本ですね.

ExcelCSV形式ファイルを開くと,Excel独自の解釈で開いちゃいます.
これを上書き保存なんてしたりすると,‥まぁ,「ファイルが壊れる」と言っても過言ではない事態になります.

改行コード(行の区切りの方)を混ぜるな

これは逆に,どうしてそうなったか知りたいのですが,「CRLF改行」と「LF改行」が混在しているCSVファイルを渡されて,「?」となったことがあります.

こんな変な真似はしないでください.頼みます.

各行のフィールド,およびヘッダの個数を違えるな

これも「どうしてこうなった」感があるのですが,各行のフィールドの個数が違ったりとか,ヘッダの個数と各行のフィールドの個数が違うような嫌がらせはやめましょう‥.

CSVファイルの書き込み時の注意

  • 改行コード・二重引用符・カンマを含むフィールドは二重引用符で括れ.
  • フィールド内に二重引用符を含む場合,二重引用符でエスケープせよ.

ちなみに,今行きあたっている問題がおそらくこれです.「ありえん!」と思ってたのですが,喰らいました‥.
これをやらないと,どこまでが1フィールドなのか全く分からなくなります‥.

CSVファイルの読み取り時の注意

ぶっちゃけ,適当なパーサーに投げた方が早いのですが,あえて自力で処理する場合は.‥

  • 単純に「カンマを区切り文字にして,配列に格納」とかやるなよ!
    当たり前の話ですが,「フィールド内にあるカンマを区切り文字にする」という事態になり,破滅的な事態になります.
    そのコードを書いたやつには全力で呪いをかけました.
  • フィールド内に改行コードがある可能性に留意すること.
    「テキスト上の1行」と「CSV形式上での1行」が一致していない可能性も考えられるわけで,一応注意が必要です.
    もっとも,規約上これを禁止している場合も多いと思うので,その場合は無視してよいのですが.
  • エスケープされている二重引用符はきちんと元に戻すこと.
  • フィールドをかこっている二重引用符は外そう.

意外と注意事項が多いので,「たかがCSV形式でしょう?」とか高をくくっていると死にます.割とマジで.

Surface Pro 4

ちなみに.

CSV形式についてはRFC4180で一応の規格が定められているので,それに従うのが最も無難でしょう.
また,これを読むと,CSV形式がいかに厄介なシロモノかがわかると思います.

ぶっちゃけ,寄越されるならXML形式なりの方が扱いやすいです,ていうかそうしてください神様.

Accessのタブの機能が改善された話

Accessを使ってて,この機能も何気なく使ってたのですが,

f:id:misora05:20190328212208p:plain

Accessのタブがかなり改善されていました.具体的に言うと,

  • 一般的なタブブラウザ同様,ドラッグしてタブの移動ができる.
  • 一般的なタブブラウザ同様,「×」ボタンワンクリックでタブを閉じれる.

という具合に変更がされていました.

Microsoft Store (マイクロソフトストア)

Release notes for Monthly Channel releases in 2019 を読むと,3月4日の Version 1902 (Build 11328.20146) において,

データベース オブジェクトをタブで管理する: アクティブなタブが分かりやすく表示され、簡単にタブをドラッグして再配置し、ワンクリックでデータベース オブジェクトを閉じることができます。

Keep tabs on your database objects: Clearly see the active tab, easily drag tabs to rearrange them, and close database objects with just one click.

‥らしいです.

確かに,「なんでこの機能がないんだろう」というのは常々思っていましたし,実装されてほしい機能の筆頭格ではあったのですが,本当なんで今までこの機能がなかったんでしょうね?