ソースコード例
下記設定をシステムテーブル以外の全テーブルに適用する
空文字列の許可: False
IME入力モード: オフ
-
HideNewField: True
(データシートビューでフィールドの追加欄を隠す)
Option Compare Database
Option Explicit
Private Sub set_prop(obj As Object, name_obj As String, type_obj As Integer, value_obj As Integer)
Dim prp As Object
For Each prp In obj.Properties
If prp.name = name_obj Then
obj.Properties.Delete name_obj
Exit For
End If
Next prp
Set prp = obj.CreateProperty(name_obj, type_obj, value_obj)
obj.Properties.Append prp
End Sub
Sub set_properties()
Dim cdb As DAO.Database
Dim def As Object
Dim fld As Object
Set cdb = CurrentDb
For Each def In cdb.TableDefs
If (def.Attributes And dbSystemObject) = 0 Then
set_prop def, "HideNewField", 1, True
For Each fld In def.Fields
fld.AllowZeroLength = False
set_prop fld, "IMEMode", 2, 2
Next fld
End If
Next def
cdb.Close
Set cdb = Nothing
End Sub
躓いたところ
プロパティによって値の格納場所が異なる
- テーブル全体のプロパティを変える場合
TableDef.Properties
コレクションから目的のプロパティを探す
With CurrentDb.TableDefs(i)
.Properties("HideNewField") = True
End With
- テーブル内の各フィールドプロパティを変える場合
Field
オブジェクト/Field.Properties
コレクションから目的のプロパティを探す
With CurrentDb.TableDefs(i).Fields(j)
.AllowZeroLength = False
.Properties("IMEMode") = 2
End With
オブジェクト/コレクションに存在しないプロパティがある(?)
現象
デザインビュー上ではIME入力モード
が見えるのに、下記のように書いたら「そんなプロパティないよ?笑」と怒られた
With CurrentDb.TableDefs(i).Fields(j)
.Proportites("IMEMode") = 2
End With
解決法
TableDef.CreateProperty
で目的のプロパティを用意し、Properties.Append
で追加する
With CurrentDb.TableDefs(i).Fields(j)
Set prp = .CreateProperty("IMEMode", 2, 2)
.Properties.Append prp
End With
- プロパティのデータ型を間違えると設定が正しく反映されない
- 追加したプロパティの型は後から変更できない
-
Properties.Delete
で削除し、再度Properties.Append
する
-
おわりに
目的に応じて改造してください。
調べても中々答えに辿り着けず苦労しました。。。
そんな人が少しでも減れば幸いです。