2014年07月26日

Access:レポートをpdfに出力する時はReport_Loadイベントが発生しない

DoCmd.OutputToでpdfに出力した場合に起こる現象。
他のファイル形式で出力する際はちゃんとLoadイベントが発生する。
pdf出力するレポートを作成する際は、Loadイベントを使わないで、Openイベントなどで代替するようにすべし。

Access2010で確認
posted by 忘却の達人 at 11:36| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2014年06月07日

Access:リネームして最適化した方がファイルサイズが小さくなる

Access2010で40MBくらいのaccdbで確認した現象。

最適化した時のファイルサイズが段々と増えていってた。開発で常に手を入れてるので、オブジェクトは少しずつ増えていってるわけだけど、経験的にオブジェクトの増加量に比べ、ファイルサイズの増加量が大きすぎるなぁと不思議に思っていた。

ただある時に最適化後のサイズがそれまでより減って、私的にも納得のサイズになっててビックリ。それはテスト環境用にファイルをコピーしてリネームしてから最適化したやつだった。もしかしてと思って、元のファイルもリネームして最適化したら、同じくそれまでより小さくなった。

一応これで問題は解決したわけだけど、そもそもなんでファイル名が最適化に影響してるんだ?(苦笑)
posted by 忘却の達人 at 08:21| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2013年06月18日

Access:長音(ー)を含む文字列をワイルドカードで検索する際の注意(バグ)

テーブルAのメモ欄に、英字1桁数字4桁のコードがあるデータを抽出するSQLを書くと

select * from テーブルA where メモ like "*[A-Z][0-9][0-9][0-9][0-9]*"

こんな感じになるけど、メモが以下のような場合も抽出されてしまう。

今日食べた○×屋のB定食うまかった2013/06/18

どうやら検索条件の「1文字目+適当な文字何文字でも+長音+検索条件の2文字目以降」というパターンまでヒットしてしまうみたい…
長音をハイフンに置換して検索すればとりあえずは対処できるけど、データ量が多いとちと厳しいかも。

Access2003で確認
posted by 忘却の達人 at 22:27| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2010年06月03日

Access:DAOでデータを取得できるクエリがADOで取得できない

Accessでデータベースウィンドウから開くとデータを表示するクエリが、VBAでADOで開くとデータを取得できないことがあった。試しにDAOで開くとちゃんと取得できる。

クエリの条件に 項目 like "A*" なんてのがあったためだった。ADOのワイルドカードが"%"って事は百も承知だけど、データベースウィンドウからクエリを開く分には正常だったので、クエリに問題があるとはみじんも疑わず、気がつくのに時間がかかった。
posted by 忘却の達人 at 20:55| Comment(1) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2010年04月22日

Access:レポート項目で縮小して全体を表示する

Accessのレポート項目で、Excelの「縮小して全体を表示する」を行う関数。

↓の関数はとりあえず1行のテキストしか想定していない。いろんなパターンに対応するなら、クラスを作ってレポートオープン時に項目を指定してフォントサイズやマージンの初期値を保持し、印刷時に実行するのが良いと思う。
Sub ShrinkToFit(ctl As Control, ByVal FontSize As Integer)
Dim BaseHeight As Integer
    With CodeContextObject
        .FontName = ctl.FontName
        .FontSize = FontSize
        .FontBold = ctl.FontBold
        .FontItalic = ctl.FontItalic
        .FontUnderline = ctl.FontUnderline
        BaseHeight = .TextHeight(ctl.Value)
        '文字が切れた場合があったので-50で調整
        Do Until .TextWidth(ctl.Value) < (ctl.Width - ctl.LeftMargin - ctl.RightMargin - 50) Or .FontSize = 1
            .FontSize = .FontSize - 1
        Loop
        ctl.FontSize = .FontSize
        ctl.TopMargin = (BaseHeight - .TextHeight(ctl.Value)) \ 2
    End With
End Sub
posted by 忘却の達人 at 23:07| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2010年03月09日

Access:条件付き書式をvbaで動的に変更する

Accessで条件付き書式をvbaで動的に変更するには、項目の FormatConditionsプロパティを使うが、式の変更は Expression1,2 プロパティに直接設定できないので、Modify メソッドを使用する。

Control.FormatConditions(0).Modify acFieldValue, acEqual, "'a'"
Control.FormatConditions(0).BackColor = vbRed
posted by 忘却の達人 at 23:03| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2007年11月18日

Access:オブジェクトをテキストファイルに保存&読み込み

オブジェクトをテキストファイルに保存する。
SaveAsText オブジェクトの種類, オブジェクト名, ファイル名

テキストファイルからオブジェクトを読み込む。
LoadFromText オブジェクトの種類, オブジェクト名, ファイル名

共にAccessの隠しAPI。
posted by 忘却の達人 at 10:58| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

Access:マクロを作成するVBA

マクロの内容を作成するVBA。Accessの非公開APIを使用して作成する。

Declare Function api_Macro_Close Lib "msaccess.exe " Alias "#20" (ByVal hMacro As Long) As Long
Declare Function api_Macro_NextRow Lib "msaccess.exe" Alias "#22" (ByVal hMacro As Long, ByVal lSkipBlank As Long, lEndOfMacro As Long) As Long
Declare Function api_Macro_SaveActID Lib "msaccess.exe" Alias "#25" (ByVal hMacro As Long, ByVal lActId As Long) As Long

Sub SaveMacro()
Dim hMacro As Long

WizHook.Key = 51488399
'
hMacro = WizHook.OpenScript("エキスポート", "", 2, 0, 0)

If hMacro = 0 Then Exit Sub
'
'1行
api_Macro_NextRow hMacro, 0, 0
'マクロ名(ラベル)
WizHook.SaveScriptString hMacro, 0, "出力"
'条件
WizHook.SaveScriptString hMacro, 2, "MsgBox(""実行しますか?"",17)<>1"
'アクション
api_Macro_SaveActID hMacro, 45 'マクロの中止
'コメント
WizHook.SaveScriptString hMacro, 1, "テーブルをエキスポートする"
'
'2行
api_Macro_NextRow hMacro, 0, 0
'アクション
api_Macro_SaveActID hMacro, 40 '値の設定
'以下アクションのパラメータ
WizHook.SaveScriptString hMacro, 3, "[Forms]![form1]![txtFileName]"
WizHook.SaveScriptString hMacro, 4, """zzz.csv"""
'
'3行
api_Macro_NextRow hMacro, 0, 0
'アクション
api_Macro_SaveActID hMacro, 49 'テキスト変換
'以下アクションのパラメータ
WizHook.SaveScriptString hMacro, 3, "2"
WizHook.SaveScriptString hMacro, 5, "ZAA"
WizHook.SaveScriptString hMacro, 6, "=[Forms]![form1]![txtFileName]"
WizHook.SaveScriptString hMacro, 7, "0"
'コメント
WizHook.SaveScriptString hMacro, 1, "テキストの変換"
'
'4行
api_Macro_NextRow hMacro, 0, 0
'アクション
api_Macro_SaveActID hMacro, 22 'メッセージボックス
'以下アクションのパラメータ
WizHook.SaveScriptString hMacro, 3, "終わった"
WizHook.SaveScriptString hMacro, 4, "-1"
WizHook.SaveScriptString hMacro, 5, "4"
'コメント
WizHook.SaveScriptString hMacro, 1, "しゅうりょう"
'
api_Macro_Close hMacro

End Sub
posted by 忘却の達人 at 07:26| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2007年09月20日

Access:マクロの内容を取得するVBA

マクロの内容を取得するVBA。Accessの非公開APIを使用して取得する。


Declare Function api_Macro_Close Lib "msaccess.exe " Alias "#20" (ByVal hMacro As Long) As Long
Declare Function api_Macro_NextRow Lib "msaccess.exe" Alias "#22" (ByVal hMacro As Long, ByVal lSkipBlank As Long, lEndOfMacro As Long) As Long
Declare Function api_Macro_GetActID Lib "msaccess.exe" Alias "#29" (ByVal hMacro As Long) As Long

Sub ListMacroDetail()
Dim lHdr As Long, sArgs1 As String, lActID As Long, Macro As Variant, i As Long, ret As Long
Dim sArg(5) As String

WizHook.key = 51488399:

For Each Macro In CurrentProject.AllMacros
lHdr = WizHook.OpenScript(Macro.Name, "", 0, 0, 0)
If lHdr Then
Do While api_Macro_NextRow(lHdr, 0, 0)
'マクロ名(オブジェクト)
Debug.Print Macro.Name & ",";
'マクロ名(ラベル)
Call WizHook.GetScriptString(lHdr, 0, sArgs1)
Debug.Print sArgs1 & ",";
'条件式
Call WizHook.GetScriptString(lHdr, 2, sArgs1)
Debug.Print sArgs1 & ",";
'アクション
lActID = api_Macro_GetActID(lHdr)
Debug.Print WizHook.NameFromActid(lActId) & "(" & lActId & "),";
'コメント
Call WizHook.GetScriptString(lHdr, 1, sArgs1)
Debug.Print sArgs1 & ",";
'第1パラメータ
Call WizHook.GetScriptString(lHdr, 3, sArgs1)
Debug.Print sArgs1 & ",";
'第2パラメータ
Call WizHook.GetScriptString(lHdr, 4, sArgs1)
Debug.Print sArgs1 & ",";
'第3パラメータ
Call WizHook.GetScriptString(lHdr, 5, sArgs1)
Debug.Print sArgs1 & ",";
Debug.Print
Loop
api_Macro_Close lHdr
End If
Next
End Sub
posted by 忘却の達人 at 07:52| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2007年06月15日

Access:入力コントロールに紐付いたラベルの特定

TextBoxやComboBoxなどに紐付いてるLabelは、LabelのParentプロパティに紐付いてるコントロールが入っている。

'TextBox,ComboBox,CheckBoxに紐付いてるLabelを一覧表示する
Sub ListLabels(ByVal FormName As String, ByVal Delimiter As String)
Dim ctl As Control
DoCmd.OpenForm FormName, acDesign, , , , acHidden
For Each ctl In Forms(FormName).Controls
If TypeOf ctl Is TextBox _
Or TypeOf ctl Is ComboBox _
Or TypeOf ctl Is CheckBox Then
Debug.Print GetLabelCaption(FormName, ctl.name) & Delimiter;
End If
Next
DoCmd.Close acForm, FormName
End Sub

'コントロールに紐付いてるLabelを取得する
Function GetLabelCaption(ByVal FormName As String, ByVal ControlName As String) As String
Dim ctl As Control
For Each ctl In Forms(FormName).Controls
If TypeOf ctl Is Label Then
If ctl.Parent.name = ControlName Then
GetLabelCaption = ctl.Caption
Exit Function
End If
End If
Next
GetLabelCaption = ""
End Function
posted by 忘却の達人 at 04:52| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2006年11月05日

Access:twipとpixelとinchとcm

Accessで大きさを表す単位twipとpixel/inch/cmの関係。

1inch=1440twip
1inch=2.54cm
1cm=約567twip
1pixel=15twip ※1
ppi=pixel/inch
pixel=twip/ppi

※1 Windows画面は通常96ppiだが厳密には"GetDeviceCaps"APIで"LOGPIXELSY"を取得する必要がある。
posted by 忘却の達人 at 09:39| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2006年10月26日

Access:クエリーでの順位付け

点数のあるテーブルを元に作成するクエリーで順位を付ける。
カレントレコードより点数の多いレコード数を求めて1を足す。
順位: DCount("*", "テーブル", "点数>" & [点数]) + 1
posted by 忘却の達人 at 07:23| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

2006年10月15日

Access:帳票形式のフォームで1行置きに色を付ける

詳細セクションの色は変えられないけど、一部コントロールは「条件付き書式」を設定することで値によって背景色を変えられるので、これを利用してテキストボックスを詳細セクションいっぱいに貼れば、背景色を任意の色にすることが出来る。
posted by 忘却の達人 at 05:18| Comment(0) | TrackBack(0) | Access | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。