2014年11月30日日曜日

[SQL] MSAccessで「JOIN 式はサポートされていません」エラー

Microsoft Access における JOIN 式(特に外部結合)で、結合条件に加えて抽出条件を使用するSQL

[顧客] LEFT OUTER JOIN [購入明細] ON
  [顧客].ID = [購入明細].ID AND
  [購入明細].種別 = '食品'


Oracle などではこれで可能だが、
MSAccess では「JOIN 式はサポートされていません」エラーが発生して、LEFT OUTER JOIN 句に結合条件以外の条件を記述できない。もちろん外部結合の条件を WHERE 句には書けない。

ただし MSAccess にも迂回策があり、結合条件を合わせてカッコでまとめると通せる。

[顧客] LEFT OUTER JOIN [購入明細] ON
  ([顧客].ID = [購入明細].ID AND
   [購入明細].種別 = '食品')

2014年11月8日土曜日

[VBA] Access のウィンドウを非表示にする

Microsoft Office のユーザフォームを残して、Access 本体の画面を表示しない方法です。

これは Windows API の ShowWindow 関数を使用する方法です。この方法では、Access のウィンドウを最小化しています。ウィンドウが隠れているだけなので、Windowsのタスクバーから Access のタスクをクリックすればウィンドウが表示されます。

Access の場合は、データベースの起動時に実行する AutoExec マクロなどからこの処理を実行すればよい。(AutoExec から実行するプロシージャは Function にする必要あり)

Const SW_SHOWMINIMIZED = 2

Declare Function ShowWindow Lib "User32" ( _
    ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Function WindowMinimize() As Boolean
    Dim result As Long
    result = ShowWindow(Application.hWndAccessApp, SW_SHOWMINIMIZED)
    DoCmd.OpenForm ("サンプルフォーム")
    WindowMinimized = True
End Sub

■ 参考資料

ShowWindow
http://msdn.microsoft.com/ja-jp/library/cc411211.aspx

データベースを開いたときに実行されるマクロを作成する(Access 2007)
http://office.microsoft.com/ja-jp/access-help/HA010336239.aspx

2014年11月6日木曜日

[MSAccess] Accessの終了 ボタンを無効にする

Microsoft Access 2010 のファイルメニューにある「データベースを閉じる」「終了」ボタンを無効にする方法です。Access 2013 では、「閉じる」ボタンと名称が少し違います。これはMS Access 2010 以降に限ります、2007 だと ファイルメニューの「Microsoft Office Backstage ビュー」が無く、別の実装が必要です。2007 における設定はこちら

■ 手順1

システム テーブルを表示する設定

Access の Office ボタン > Access のオプション > メニューの「カレント データベース」 > ナビゲーションの「ナビゲーション オプション」ボタン と辿る

「ナビゲーション オプション」ウィンドウの 表示オプション 内にある、「システム オブジェクトの表示」を有効にする。

■ 手順2

システム テーブルを作成する。上記の「システム オブジェクトの表示」が有効になっていないと作成しても表示されません。(USys と名前を付けただけで、システム オブジェクトの扱いになってしまう)

・テーブル名:USysRibbons
・カラム
フィールド名データ型
IDオートナンバー
RibbonNameテキスト型(サイズ 255)
RibbonXmlメモ型

■ 手順3

「データベースを閉じる」「終了」ボタンを無効にするリボン (XML) 項目を定義します。
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <commands>
    <command idMso="FileCloseDatabase" enabled="false" />
    <command idMso="FileExit" enabled="false" />
  </commands>
  <backstage>
    <button idMso="FileCloseDatabase" visible="true" />
    <button idMso="FileExit" visible="true" />
  </backstage>
</customUI>

このXMLテキストを上記で作成した USysRibbons テーブルの RibbonXml カラムにレコードとして挿入します。RibbonName には任意の名前を付けます。無効にするのでなくボタンを表示しないならば、visible 属性を false にすればよい。

■ 手順4

作成したリボンのカスタマイズ設定を有効にする。

Access の Office ボタン > Access のオプション > メニューの「カレント データベース」 と辿り、
リボンとツールバーのオプションの「リボン名」で、上記で準備した USysRibbons テーブルの RibbonName カラムの名前を選択します。一旦データベースを閉じて開き直さないと、登録した名前が選択できないかもしれません。

これでデータベースを閉じて、開き直すとリボンのカスタマイズ設定が有効になります。

■ 補足

Access 2013 だと、デフォルトでは「データベースを閉じる」ボタンが無いと思います、カスタマイズしないと出てきません。

■ 参考資料

Office 2010 の Backstage ビューについて (開発者向け)
http://msdn.microsoft.com/ja-jp/library/office/ee691833.aspx
Office 2010 の Backstage ビューのカスタマイズ (開発者向け)
http://msdn.microsoft.com/ja-jp/library/office/ee815851.aspx

2014年11月3日月曜日

[VBA] Office の閉じるボタンを無効にする

VBA から Microsoft Office (Word/Excel/Access)の閉じる[×]ボタンを無効にする方法です。Windows API を使います。
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, _
    ByVal bRevert As Long) As Long

Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, _
    ByVal uIDEnableItem As Long, ByVal uEnable As Long) As Long

Const MF_GRAYED = &H1&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060&

Sub CloseButtonEnable()
    Dim hWnd As Long
    Dim hMenu As Long
    Dim result As Long

    hWnd = Application.hWndAccessApp
    hMenu = GetSystemMenu(hWnd, 0)
    result = EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)
End Sub
これを起動時に実行すれば閉じる[×]ボタンが無効になります。

■ 補足

ただし閉じる[×]ボタンを押してもファイルは閉じなくなりますが、Office のバージョンによって見た目が随分違います。
  • Office 2007: 見た目は変わらない。
  • Office 2010: 赤い×ボタンが若干暗い色に変わる
  • Office 2013: 見た目は変わらない。

これ以外にもある Office の「閉じる」操作は、
・Windows のタスクバーから、Officeのタスクを閉じる。
・メニューから Office を終了する。
・ショートカットキー [Ctrl] + [F4] で閉じる。
・Shift キーを押しながら起動すると、VBAマクロを無効にして起動できる。
・タスクマネージャ から、プロセスをKILL

■ 参考資料

GetSystemMenu
http://msdn.microsoft.com/ja-jp/library/cc364748.aspx

EnableMenuItem
http://msdn.microsoft.com/ja-jp/library/cc410786.aspx

アプリケーション ウィンドウの閉じるボタンおよび [ファイル] メニューの [終了] を無効にする方法
http://support.microsoft.com/kb/300688/ja

[MSAccess] Access2007の終了 ボタンを無効にする

Microsoft Access 2007 の「Accessの終了」「データベースを閉じる」ボタンを無効にする方法です。これはMSAccess 2007 に限ります、2010 以降になると「Office ボタン」が無くなっており、別の方法になります。

■ 手順1

システム テーブルを表示する設定

Access の Office ボタン > Access のオプション > メニューの「カレント データベース」 > ナビゲーションの「ナビゲーション オプション」ボタン と辿る

「ナビゲーション オプション」ウィンドウの 表示オプション 内にある、「システム オブジェクトの表示」を有効にする。

■ 手順2

システム テーブルを作成する。上記の「システム オブジェクトの表示」が有効になっていないと作成しても表示されません。(USys と名前を付けただけで、システム オブジェクトの扱いになってしまう)

・テーブル名:USysRibbons
・カラム
フィールド名データ型
IDオートナンバー
RibbonNameテキスト型(サイズ 255)
RibbonXmlメモ型

■ 手順3

「Accessの終了」「データベースを閉じる」ボタンを無効にするリボン (XML) 項目を定義します。
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <commands>
    <command idMso="FileExit" enabled="false" />
  </commands>
  <ribbon>
    <officeMenu>
      <control idMso="FileCloseDatabase" enabled="false" />
    </officeMenu>
  </ribbon>
</customUI>

このXMLテキストを上記で作成した USysRibbons テーブルの RibbonXml カラムにレコードとして挿入します。RibbonName には任意の名前を付けます。

■ 手順4

作成したリボンのカスタマイズ設定を有効にする。

Access の Office ボタン > Access のオプション > メニューの「カレント データベース」 と辿り、
リボンとツールバーのオプションの「リボン名」で、上記で準備した USysRibbons テーブルの RibbonName カラムの名前を選択します。一旦データベースを閉じて開き直さないと、登録した名前が選択できないかもしれません。

これでデータベースを閉じて、開き直すとリボンのカスタマイズ設定が有効になります。

■ 補足

もちろんこの設定を加えると終了操作に制限がかかりますが、こういう対策で操作を制限しないと正しく機能しないのであれば、最初から C#.NET 等のWindowsソフトウェアとして提供するべきでは?
どうせ Microsoft Access で本格的に操作を制限しても抜け穴だらけです。無意識に操作してしまいがちなものだけを制限する程度の効果しかありません。

これで残っている「閉じる」操作は、
  • Windows のタスクバーから、Accessのタスクを閉じる。
  • 閉じる[×]ボタン で閉じる。
  • ショートカットキー [Ctrl] + [F4] で閉じる。
  • Shift キーを押しながら起動すると、リボンのカスタママイズを無効にして起動できる。
  • タスクマネージャ から、プロセスをKILL

■ 参考資料

リボンをカスタマイズする (Office Access 2007)
http://office.microsoft.com/ja-jp/access-help/HA010211415.aspx