2010/10/31

access2010 IRibbonControl ID/Tag/Context プロパティ


コールバックプロシージャで参照できるIRibbonControlについて確認
コントロールのid属性値はリボンでユニークだから、IDプロパティを参照することでプロシージャ実行時コントロールを特定できる。だから、同じコールバックプロシージャでも処理を分岐して仕分けができる。tag属性値は、id属性値に使用できない文字とか処理分岐のキーとして使う方法も考えられる。AccessコントロールのTagプロパティと同じ感じでいいかな。Contextプロパティで参照できるのはAccessアプリケーションオブジェクトだから特に使うことはないんじゃなかろうか。

access2010 Windows7 SP1でADOに修正がはいる

Win7SP1がRCになったことで確認中。SP1に含まれるHotFixを覗いてみたところ影響ありそうなのが数件。多分、この件が解消。わーい。
"Type Mismatch" error message when you run a VBA macro in a 64-bit version of an Office 2010 application http://support.microsoft.com/kb/983246
RecordCount(ADO)の値Typeの件。Win7に限らず、offce2010(64bit)で影響するから、まぁXPは少ないだろうけど、64bitOS(Vista/Server2008とか)全部関係するでしょうな。

Option Compare Database
Option Explicit

Sub ADOtest()
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    
    Set cn = Application.CurrentProject.AccessConnection
    rs.CursorLocation = adUseClient
    rs.Open "select * from table01", cn, adOpenKeyset, adLockOptimistic
    Debug.Print rs.RecordCount, TypeName(rs.RecordCount)
    
    rs.Close: Set rs = Nothing
    cn.Close: Set cn = Nothing
End Sub
'Win7の場合、rs.RecordCountは、Longlong → Win7SP1の場合、Long

Sub DAOtest()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("select * from table01")
    rs.MoveLast
    Debug.Print rs.RecordCount, TypeName(rs.RecordCount)
    
    Set db = Nothing
End Sub
'Win7/Win7SP1変わらず、Long
ADO関係のファイルバージョンが、6.1.7601.17105に。
その他accessに関係しそうなのが、
A computer that is running Windows 7 or Windows Server 2008 R2 takes four minutes to open a Microsoft Office 2003 document from a network share http://support.microsoft.com/kb/982860
4分かかるて、、、。Win7混じるとa2003が遅いって話しあったけどこれなのかな。

access2010 リボンをVBAで操作する Invalidate InvalidateControl


リボンに配置してあるコントロールには、VBAから直接に参照することはできない。フォーム上に配置されたaccessコントロールのようにプロパティの参照や設定ができないということ。

リボンのコントロール要素には、on~、get~というコールバックを示す属性があるので、これらとIRibbonUIオブジェクトのInvalidate/InvalidateControlメソッドを使用することでリボンコントロールを制御する。
コールバック属性に示されるプロシージャは、該当のリボンコントロールがキャッシュされるときに実行され、プロシージャから渡される値がコントロールの属性値になる。
例えば、enabled属性にはgetEnabledコールバック属性があり、属性値が示すプロシージャによってenabled属性値を取得する。取得した値がfalseであれば使用不可の状態になる。

コールバックプロシージャはキャッシュ時のみ動作でVBAから直接に実行を指示できないから、キャッシュ値を無効にするメソッドInvalidate/InvalidateControlを実行しリボンにシグナルを送信。
 リボンは自動的に再キャッシュを開始し、コールバックプロシージャを実行させ属性値を取得する。このとき、属性値として取得される変数をVBAで制御すれば、リボンコントロールの制御をすることになる。

リボンコントロールの再キャッシュ動作はVBAと非同期に実行されるから、リボンの動作に左右されるようなクリティカルな使い方をしちゃだめ。コントロールがキャッシュされる順番などは保証されないから、リボンコントロール間でも同じことが言える。

2010/10/30

access2010 オプションとかUIから操作しにくくする設定メモ

UI操作でオプションなどに遷移するコマンドを使用不可にしてみた。
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <commands>
    <command idMso="QuickAccessToolbarCustomization" enabled="false" />
    <command idMso="RibbonCustomization" enabled="false" />
    <command idMso="AccessNavigationOptions" enabled="false" />
    <command idMso="ApplicationOptionsDialog" enabled="false" />
  </commands>
</customUI>

ナビゲーションウインドウ→ナビゲーションオプション

QATカスタマイズメニュー

QATカスタマイズとリボンカスタマイズ

backstage

access2010 access2007 CurrentDb.Properties("DocUICustomization")

クイックアクセスツールバー(documentControls)の格納先は、
CurrentDb.Properties("DocUICustomization")
<mso:customUI xmlns:mso="http://schemas.microsoft.com/office/2006/01/customui">
 <mso:ribbon>
  <mso:qat>
   <mso:documentControls>
    <mso:control idQ="mso:ImportAccess" visible="true"/>
   </mso:documentControls>
  </mso:qat>
 </mso:ribbon>
</mso:customUI> 

access2010 customUI onLoad


customUIのonLoadについて
  • ribbonXmlの内容がキャッシュされる時に発生
  • なので、一度しか発生しない
  • そして、リボンは非同期で処理が進む
ActivateTabメソッド/ActivateTabMsoメソッド
IRibbonUIオブジェクトを参照できなければエラーになるのは当たり前。onLoad開始時からIRibbonUIオブジェクトが参照できるようになるまでの時間は配置コントロール要素次第だと思うから、待つか予めにキャッシュ(LoadCustomUIメソッド)させておく、もしくは使いどころを別に考える。
どえらい要素数のリボンでキャッシュ済みであった場合どうなるのか見ておけばいいのか。あてにしない方がよいかもだ。
ちょっと考えなおした。LoadCustomUIメソッドではキャッシュされずに読み込まれるだけ。読み込まれていても、未使用のリボンはキャッシュされていないと思う。

リボンを動的に操作するためには、onLoadでIRibbonUIオブジェクトを参照できるようにしなければならない。オブジェクトは実行時エラーが発生すると初期化されてしまうからエラー処理は特に大事。キャッシュはアプリケーション終了まで保持される。

要素:customUI
属性:onLoad(コールバック)
call back signature:Sub onLoad(ribbon as IRibbonUI)

2010/10/27

access2010 クイックアクセスツールバー(qat)をRibbonXmlで設定


まぁ特に複雑なことはない。
組み込みコントロールであれば、idMsoで指定。カスタムボタンであればonActionでプロシージャ指定。
startFromScratch="true"じゃないとだめ。また、qatに配置されるカスタムコントロールのIDはユニークで。

access2010 アプリケーションパーツ その7

インスタンスフォーム使用の自作アプリケーションパーツを使用したとき、フォームを閉じないまま、データベースを閉じる/accessを終了すると、以下の状況になる。フォームモジュールの残骸が残ってしまい以降アプリケーションパーツを使うことができなくなる。



こうなってしまうとこの後どうにもならないので、新規ファイルにオブジェクトをインポートして再構成。
なので、フォームには閉じるコマンドボタンを設置し、コマンドボタン押下以外ではフォームが閉じれないようにしておく。やっぱだめかも。モーダル+ポップアップの方が確実かもしれん。
また、テンプレートに含まれるテーブル/フィールド名に等に "<" 、">"、 引用符等含めてはダメ。
フォーム/レポートなどはSaveAsTextでエクスポートされているようなのでよさそうだけど、テーブル定義などはXmlで出力されていて、うまく読めこめない状態になってしまう模様。ステータスはちょっと違うけど読み込めない旨のエラーがでる。

access2010 ribbon startFromScratch


ribbon要素のstartFromScratchをいじって確かめた。
startFromScratch="true"とすることで組み込みタブは非表示となるが、
  • TabPrintPreviewAccess(印刷プレビュー)も非表示になる
  • クイックアクセスツールバーの設定をRibbonXmlで設定可能になる
  • contextualTabs(組み込みツールタブ)は非表示にならない
ということ。
起動時の設定、CurrentDb.Properties("CustomRibbonID")に指定したribbonXmlでの設定は、アプリケーション全体に反映。
印刷プレビュータブは表示したいという場合、
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon startFromScratch="true" >
    <tabs>
      <!-- idMsoで指定し明示する -->
      <tab idMso="TabPrintPreviewAccess" visible="true" />
    </tabs>
  </ribbon>
</customUI>
※これが仕様なのかわからんけど、まぁ期待通りの動作はしている。

組み込みツールタブを非表示とする場合、
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon>
    <contextualTabs>
      <!-- idMsoで指定し明示する tabSetは他にもある-->
      <tabSet idMso="TabSetFormDatasheet" visible="false" />
    </contextualTabs>
  </ribbon>
</customUI>

ちょっと話外れて、組み込みタブ内の要素を設定することもできる。
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon>
    <tabs>
      <!--ホームタブ-->
      <tab idMso="TabHomeAccess">
        <!--表示グループ-->
        <group idMso="GroupViews" visible="false" />
        <!--クリップボードグループ-->
        <group idMso="GroupClipboard" visible="false" />
        <!--レコードグループの後ろにマクログループを挿入-->
        <group idMso="GroupMacro" insertAfterMso="GroupRecords" />
      </tab>
    </tabs>
  </ribbon>
</customUI>



組み込みタブの制御はあまりないかもだけど、ちょこっとだけ変えたい場合とかに使うのかな。組み込みタブに要素を追加した場合、キャッシュに追加されてしまうようだから、削除したくてもできなくなるんではないかと思う。非表示にはできるんでないかい。

要素:ribbon,contextualTabs,tabSet
属性:startFromScratch

2010/10/25

access2010 access2007 Runtimeベースでの配布時 その1

Runtime環境もしくはRuntimeモードで使用するaccessアプリケーションの配布時には、たとえコードが含まれていなくてもaccdeにしておくべき。

ちょっと悪い子への対策ということも含まれるが、accdbの状態で配布をした場合、配布先環境ががRuntimeであってもフォームの追加変更保存ができてしまう場合があるから。その他オブジェクトについては確認していないが、まぁおそらく同様だと思う。実際には必要なコンポーネントがなかったりするだろうから役にはたたないけど、配置コントロール修正削除とかできる。異常系の操作や動作ではなく可能で、各機能の仕様内での設定を重ねると可能になってしまう。でも、想定外の設定ということではあると思う。いらぬ心配だとは思うけど、クリック数回なのだからやっておいていいんじゃないかなと。

Runtimeとはなんぞやと思っていた。基本的には製品/Runtimeのいずれも同じもので、機能制限が何らかの方法で課せられているという認識でいたわけだが、これが大まかに実証されたということくらいでしかない。インストールされたRuntime版を修復しようとしたとき、シリアル投入のフォームが出せるわけで、実際にシリアルいれたら製品版になるかっていうのは多分ないだろうけど。できちゃったりして。

続くものがあるような気がするから、その1

2010/10/24

access2010 パッケージソリューションウィザード その8

インストール済みのパッケージソリューションウィザードを
[Accessのオプション]→[アドイン]→[管理(COMアドイン)]→[設定]→[COMアドイン]でチェックを外し、起動時にアクティブにしないように設定したら、以降アクティブにできなくなることがあった。いままでやってみたことないことだったからちょっと慌ててメモ。

Officeの修復/機能の削除追加で治るものかなとやってみたけど今一つ。で、やったおかげで余計に手間がかかった感がある。レジストリをAccessPW.14でキー検索し、通常に使用できるマシンと比較しながら復旧はできた。遠回りしたけど、復旧できるのはレジストリ1件の変更のみであることがわかった。

HKEY_CURRENT_USER\Software\Microsoft\Office\Access\Addins\AccessPW.14
LoadBehavior 値が2になってるはずだから3へ変更

特に変なことしてなければこれで復活するんじゃないかな。

Package Solution Wizard まとめはこちら

2010/10/23

access2010 backstageをいじってみた その2


backstageにある組み込みtabとbuttonを非表示としたが、コマンドの実行を抑制したわけではない。
なので、commands要素内でcommandにenabled/onAction属性を設定しUIからの実行抑制っぽくしてみた。
enabled="false"のcommandは、コードで実行させると実行時エラーになる。onAction属性が設定されていると指定アクションが実行される。たぶん、きっと。全部確かめたわけでないし。

ちょっとした例外がある。backstageビューにある開く(FileOpen)ボタンについて。
backstage要素でvisible=falseとすることで表示はされなくなるが、commands要素で
<command isMso="FileOpen" onAction="actionHogehoge">
としていても、actionHogehogeは実行されない。実行させるためには、
<command isMso="FileOpenDatabase" onAction="actionHogehoge">
とする必要があったと思い込んでいる。フォームなどに紐付くリボンでcommands要素を設定するとあれれれ?ってなる。これは少し不可解なところなんだけど、access2007だとFileOpenDatabaseが使われていたが、access2010ではFileOpenが使用されているからかなぁと。

多分、問題ないと思うけどこんなことあるよってことで、[すべてのメニューを表示する]をOffにすると、リボンなどの表示はRuntimeモードと同じようになるっつーこと。

要素:backstage commands command
属性:idMso onAction

2010/10/21

access2010 backstageをいじってみた その1


いじったというか消しただけ。
backstage上の組み込みbutton要素/tab要素をvisible属性値で非表示を設定
<customUI xmlns="">
<backstage>
<button idMso="" visible="false" />
<tab idMso="" visible="false" />
</backstage>
</customUI>

要素:backstage button tab
属性:idMso visible

access2010 CurrentDB.Properties("VBAArchitecture")

そういえば、CurrentDB.Properties("MDE")ってのがあったなと、ふと思い出しaccess2010でどうなってるのかなと確認していたところ。まぁ当然にあった。
で、 CurrentDB.Properties("VBAArchitecture")というのも確認できた。

accde/mde/adeを作成した場合
  •   CurrentDB.Properties("MDE")
    String で "T"
  •   CurrentDB.Properties("VBAArchitecture")
    32bit Long で 1
    64bit Long で 2

なので、
CurrentDB.Properties("MDE")="T" で、CurrentDB.Properties("VBAArchitecture")が存在しない2007形式のファイルはaccess2007で作成されたものと判断できる。だからどうした。

access2010 カスタムリボンを作ってみた その3 -マクロとプロシージャを割り当て-


また続き
リボンに配置したボタンのコントロール押下時にマクロとプロシージャを実行できるようにしてみる。
マクロはサブマクロの指定ができる。プロシージャはFunctionプロシージャで引数も可。
IRibbonUIオブジェクトとか使用していないから動的な処理は無理だけど、なんにせよさっくりと。

access2010 カスタムリボンを作ってみた その2 -buttonを追加-


続き
フォームにリボンを割り当てて、フォーム開いたときに該当のリボンを表示

組み込みのコマンドはidMsoで指定。イメージだけを使用する場合は、imageMsoで指定。
組み込みタブを表示/非表示は、ribbonタグstartFromScratchで指定すると。

startFromScratch=trueを起動時の設定でribbonで設定したとき/フォームに割り当てたribbonで設定したときそれぞれどうなるかを見ておかないと。

access2010 カスタムリボンを作ってみた その1


つらつらーと作ってみた。
カスタムリボンを使用するにあたり、RibbonXmlをどの方法でキャッシュさせるかなんだけど、USysRibbonsテーブルを使うのが一番シンプルなのは明白。フィールドをRibbonName RibbonXml とすることで自動的に探して読み込んでくれる。実際にキャッシュされるのは、該当のリボンを最初に使用するときになる。他の手段として
・ファイルから読み込む
・C/S環境でServerから取り出して読み込む
・コードでRibbonXmlを生成して読み込む
など、いろいろ考えられるわけで。

カスタムリボン作成時には、[Accessのオプション]→[クライアントの設定]→[アドインユーザ-インターフェイスに関するエラーを表示する]をOnにすればエラー情報が見れるようになる。

2010/10/20

Office365 おもしろそう

Access Team Blog
http://blogs.msdn.com/b/access/archive/2010/10/19/office-365-and-access-web-databases.aspx

Office365
http://office365.microsoft.com/en-US/online-services.aspx

つら~と、詳細見ると、Office 365 for small buisinessesが1~25ユーザ(Max 50)の中小向けで、$6 / €5.25 / ¥600 per user per month。
  • Office Web Apps web productivity applications
  • Exchange Online for email, mobile access, calendar, contacts , anti-virus, anti-spam
  • SharePoint Online for team sites, Access services, and an easy-to-build public website
  • Lync Online for instant messaging and online meetings
  • 24x7 moderated community-based support
  • Simplified setup and management
 Office 365 for enterprises with Office Desktop softwareってのもあって、\2,450/1アカウント月ではあるけれども、Office Professional Plusの使用とExchange/SharePoint/Lyncの全機能付きで電話サポートあり。安いと思える会社もありそうなお値段だこと。

2010/10/19

access2010 access2007 RibbonUI設定の共通化

いろいろ考えるとややこしいのでパターンだけメモ
onActionを =OptionOnClick() としているのでOfficeObjectLibraryの参照はなくてもいい。
2010で製造時14.0を参照していても、2007が12.0に読み替えてるから(思い込みじゃないか)、コールバックでもいい。
2007はofficeMenu/2010はbackStageを振り分ける。contextualTabsもあったかな。

カレントデータベースのリボン名を予め設定
AutoExecでCreateRibbonを実行
今のところ無事作動。
とはいえ、あんまり使えないか。ソースコードありきの互換性だし。
#if vba6 = 1 then
const flg = 0
#else
const flg = -1
#end if
にして、a2007でaccde化したらa2010(32)でも動くかもしれん。

Option Compare Database
Option Explicit

#If VBA7 = 1 Then
    Const flg = -1
#Else
    Const flg = 0
#End If

Public Function OptionOnClick()
    MsgBox "OptionButtonClick"
End Function

Function CreateRibbon()

On Error GoTo ErrHnd

    Dim xdoc As New DOMDocument
    Dim xelem(10) As IXMLDOMElement

    Set xelem(0) = xdoc.createElement("customUI")
    If flg Then
        xelem(0).setAttribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
    Else
        xelem(0).setAttribute "xmlns", "http://schemas.microsoft.com/office/2006/01/customui"
    End If
    xdoc.appendChild xelem(0)
    
    Set xelem(1) = xdoc.createElement("commands")
    xelem(0).appendChild xelem(1)
    
    Set xelem(2) = xdoc.createElement("command")
    xelem(2).setAttribute "idMso", "ApplicationOptionsDialog"
    xelem(2).setAttribute "onAction", "=OptionOnClick()"
    xelem(1).appendChild xelem(2)
    
    Set xelem(1) = xdoc.createElement("ribbon")
    xelem(1).setAttribute "startFromScratch", "true"
    xelem(0).appendChild xelem(1)
    
'    Debug.Print xdoc.XML
    Application.LoadCustomUI "backoffice", xdoc.XML
Done:
    Exit Function
ErrHnd:
    If Err.Number <> 32609 Then MsgBox Err.Number & vbCrLf & Err.Description
End Function

access2010 ribbonUI テストコード

'Form
Option Compare Database
Option Explicit

Private Sub Form_Open(Cancel As Integer)
    rbn01.CreateRibbon
    Me.RibbonName = rbn01.rbnName
End Sub

'module:rbn01
Option Compare Database
Option Explicit

Public Const rbnName = "rbn01"

Private rbn As IRibbonUI

Public Function Onload(ribbon As IRibbonUI)
    Set rbn = ribbon
End Function

Sub CreateRibbon()
    If Not rbn Is Nothing Then Exit Sub

On Error GoTo ErrHnd
    
    Dim xdoc As New DOMDocument
    Dim xelem(10) As IXMLDOMElement
    Dim i As Integer, j As Integer

    Set xelem(0) = xdoc.createElement("customUI")
    xelem(0).setAttribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
    xelem(0).setAttribute "onLoad", "Onload"
    xdoc.appendChild xelem(0)
    

    Set xelem(1) = xdoc.createElement("ribbon")
    xelem(1).setAttribute "startFromScratch", "true"
    xelem(0).appendChild xelem(1)
    
    Set xelem(2) = xdoc.createElement("tabs")
    xelem(1).appendChild xelem(2)
    
    For j = 0 To 8
        Set xelem(3) = xdoc.createElement("tab")
        xelem(3).setAttribute "id", "tab" & Format(j, "00")
        xelem(3).setAttribute "label", "タブ" & Format(j, "00")
        xelem(2).appendChild xelem(3)
        
        Set xelem(4) = xdoc.createElement("group")
        xelem(4).setAttribute "id", "group" & Format(j, "00")
        xelem(4).setAttribute "label", "グループ" & Format(j, "00")
        xelem(3).appendChild xelem(4)
        
        For i = j * 1000 To (j + 1) * 1000 - 1
            Set xelem(5) = xdoc.createElement("button")
            xelem(5).setAttribute "id", "button" & Format(i, "0000")
            xelem(5).setAttribute "label", "B" & Format(i, "0000")
            xelem(5).setAttribute "imageMso", "HappyFace"
            xelem(4).appendChild xelem(5)
        Next
    Next
'    Debug.Print xdoc.XML
    
    Application.LoadCustomUI rbnName, xdoc.XML
Done:
    Exit Sub
ErrHnd:
    If Err.Number <> 32609 Then MsgBox Err.Number & vbCrLf & Err.Description
End Sub

2010/10/18

access2010 テキスト型フィールドのフィールドサイズ変更


テキスト型のフィールドサイズ変更をリボン上で行うことができますが、ちょっとうまくいかない時がある。
0~255の数値であるのにインフォメーションが出現し、サイズを修正できない。
どうやらオブジェクトデザイナーの設定値に影響を受けている模様。オブジェクトデザイナーでの設定値が50の場合、フィールドサイズ変更は0~50の間しか受け付けてくれない。Webテーブルの場合、デザインビューを使用することができないからちょっと困るなぁ。
なので、オブジェクトデザイナーの設定値は、最大値:255にしておく方がよい場合がある。
不具合じゃねぇの?と、サポートへ。

お返事がありました。不具合です。ありがちなパターンで2通り、目をつぶる/いつのまにか直すでしょう。と、いうのが私の予想

access2010 ALTER COLUMN に問題アリ

access2010/64bitでALTER COLUMNが使用できない状況。
エラー:3420 オブジェクトが正しくないか、現在設定されていません。 となる。
対処方法が解らんのでサポートへ。32bitは問題ない。

お返事きました。直さないといけないリストに載ってるそうです。SP1予定って感じ。修正スケジュールは未定。予定は未定。
実装したい場合は、ADOやらDAOでフィールドを削除して追加して更新。要は使わなきゃいい。

Option Compare Database
Option Explicit

Sub test()
On Error GoTo ErrHnd
    Dim db As Database
    Set db = CurrentDb
    
    db.Execute "CREATE TABLE test01 (ID AUTOINCREMENT PRIMARY KEY, f01 char(20), f02 char(30))"
    
    '64bitはALTER COLUMNに問題あり
    db.Execute "ALTER TABLE test01 ALTER COLUMN f01 char(30)"
    db.Execute "ALTER TABLE test01 ALTER COLUMN f01 memo"
    
Done:
    db.Execute "DROP TABLE test01"
    Set db = Nothing
Exit Sub

ErrHnd:
    MsgBox Err.Number & vbCrLf & Err.Description
    Resume Next
End Sub

2010/10/14

access2007 ランタイム環境でのオプション/セキュリティ設定

access2007 Runtimeでセキュリティセンターの設定/Accessのオプションを設定する方法
レジストリを直接操作するより安全でいいんじゃないかな。Office2007が必須だけど大半は入ってるでしょ。なんでRuntimeでもできるのかちょっと考えるけど。
access2010からは使えない方法


撮り直しはしませんけど、office2007standard+access2007runtimeの組み合わせでできてますんで、そこんとこ、どうぞよろしく。
DoCmd.RunCommand acCmdStartupProperties コマンドの実行/起動時の設定と同意

2010/10/10

access2010 オブジェクトの色指定/Tint/Shade

ThemeColorIndexはまだ良いとして、Shade/Tint がよくわからないというので。
TintとShadeの関係はこんな感じ。
Tint = 0 であれば白100%、Tint = 100 Shade = 0 であれば黒100%
Tint = 100 Shade = 100 が、ThemeColorの標準な色

access2010 セキュリティセンター 信頼済みドキュメント

開発時にセキュリティの警告が出ないのに、accdb/accdeからaccdrに拡張子を変更してRuntimeモード起動すると、セキュリティに関する通知が出る件についての回答。

Office2010から[信頼済みドキュメント]が追加されている。


セキュリティの警告が出ていて、[コンテンツの有効化]を押下した場合、該当ファイルのフルネームでレジストリに登録される仕組みになっています。なので、リネームすると信頼済みドキュメントに該当しなくなり、[セキュリティの警告]/[セキュリティに関する通知]が出現ということです。

[信頼できる場所]のように追加するUIはなし。すでに登録されている[信頼済みドキュメント]の情報を消すにはクリアを押下。[信頼済みドキュメントを無効にする]にチェックをいれるとOffice2007相当の使い方ができるのではないかと。

access2010 Microsoft Common Control MSComCtl MSComCt2

access2010に限っての話ではなく、Office2010(64bit)の件。
access2010でTreeViewが使えないんだけどって質問に対して。
てな感じです。基本的にはOffice2010(32bit)でどうぞ。

ちなみに、Office2010 KB情報

2010/10/08

access2010 access2007 分割フォームのモジュール変数

質問に対しての回答というか対策方法。

データシート側で、モジュール変数を参照できない件について
基本的な対策としては、TempVarsを使用と考えられます。
Option Compare Database
Option Explicit

Private Const ConstVar = "Constvar"
Public PublicVar
Private PrivateVar

Private Sub ShowVars()
    Debug.Print "PublicConstVar:" & PublicConstVar
    Debug.Print "ConstVar:" & ConstVar
    Debug.Print "PublicVar:" & PublicVar
    Debug.Print "PrivateVar:" & PrivateVar
    Debug.Print "TempVar:" & TempVars("tVar")
End Sub

Private Sub Form_Close()
    TempVars.RemoveAll
End Sub

Private Sub Form_Open(Cancel As Integer)
    PublicVar = Now
    PrivateVar = Now
    TempVars("tVar") = Now
End Sub

Private Sub Form_Current()
    Debug.Print "*** Form_Current ***"
    ShowVars
End Sub

Private Sub Field01_BeforeUpdate(Cancel As Integer)
    Debug.Print "*** Field01_BeforeUpdate ***"
    ShowVars
End Sub

Private Sub Field02_AfterUpdate()
    Debug.Print "*** Field02_AfterUpdate ***"
    ShowVars
End Sub
Option Compare Database
Option Explicit

Public Const PublicConstVar = "PublicConstVar"
access2010/access2007の間でも取得可否が異なるので確認しながらということになります。
必ず取得できるのは、TempVars/PublicなConst/PrivateなConstの模様。
上記コードで確認できる差はFormCurrent時イベント。2010ならばすべて取得可能。

仕様というか不具合というか、たぶん修正されないと思われるレベルの事象かな。

2010/10/03

access2010 access2007 Runtimeのセキュリティアラートのこと

最近確かめた事があるのでメモ。

Runtimeを使用しaccessアプリケーションを配布したとき、起動時に表示されるセキュリティに関する通知を表示させない方法。製品版で表示されるセキュリティ警告も同じ。

リンクテーブル作成時についてはこっち

1.パッケージソリューションを使用する。
ウィザードを使用すると必要な設定をしてくれるので、簡易で確実にできる。アプリケーションアンインストールで書き込まれたレジストリを消してくれる。但し、2010のウィザードについてはレジストリ設定が間違っているので修正/追加する必要がある。詳細1 詳細2 まとめ
 
2.レジストリを手作業で変更する。

RegEditでレジストリを編集し、信頼できる場所を設定する。
HKEY_CURRENT_USERに登録すればカレントユーザに、HKEY_LOCAL_MACHINEに登録すればマシン全体に影響する。警告自体を出さない方法もあるけど、セキュリティ的にどうなんですか?と。

3.Runtimeでセキュリティセンターの設定を使用
2007であれば、Runtimeであっても[Accessのオプション]を使うことができる。但し、Office2007がインストールされていること。2010はダメだった。

CommandBars.FindControl(1, 3627).Execute を実行。
DoCmd.RunCommand acCmdStartupProperties ってのもあったことをつい先ほど発見

なんかこの落書きへのアクセスがやたら多い、、、。項番3についての落書きは、ここにも。

4.インストーラを自作する
まぁ、あんまりコストをかけたくないから、フリーのツールだとWiXとか。開発製品持ってるならそっちでインストールプロジェクトをこさえる。その時にレジストリを追加。

5.実行時に追加する
Win32API使ったコードで実行時に追加する。ただし、HKCU。そんでもって不要になったときの削除をどうするか考えておく。