|
▼pon さん、YU-TANG さん:
こんにちは。
データシート形式のサブフォームで保存できる情報には
カラムの可視/不可視やソート順などもあるのですが、
今回は列の表示順と列幅のみ対応するとします。
前準備:
下記SQLをクエリのSQLビューに貼り付けて実行し
T_列データ テーブルを作成して下さい。
Create Table T_列データ(
フォーム名 char(50),
サブコントロール名 char(50),
コントロール名 char(50),
幅 Int,
順番 Int
);
複合主キーを下記SQLにて張ります。
Alter Table T_列データ add primary key (
フォーム名,
サブコントロール名,
コントロール名
);
サブフォームのUnload時に情報を取得しようとするとうまくいかなかった為、
メインフォームの方に下記の様なコードを設定します。
Private Sub Form_Load()
If get_column_data(Me.Name) = False Then
MsgBox "列データの設定に失敗しました"
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If set_column_data(Me.Name, "objF_Sub") = False Then
'^^^^^^^^^^
'サブフォームを配置するコントロール名
MsgBox "列データの取得に失敗しました"
End If
End Sub
標準モジュールに下記を設定します。
Function set_column_data(strFormName As String, strSubFormName As String) As Boolean
Dim WS As DAO.Workspace
Dim DB As DAO.Database
Dim objCont As Control
Dim strSQL As String
On Error GoTo ErrEXE
Set DB = CurrentDb
Set WS = DBEngine.Workspaces(0)
WS.BeginTrans
strSQL = " DELETE FROM T_列データ " _
& " WHERE フォーム名 ='" & strFormName & "'"
DB.Execute strSQL, dbFailOnError
For Each objCont In Forms(strFormName) _
.Controls(strSubFormName).Form.Controls
If objCont.ControlType = acTextBox Then
strSQL = " INSERT INTO T_列データ " _
& " VALUES ('" & strFormName & "' " _
& ",'" & strSubFormName & "' " _
& ",'" & objCont.Name & "' " _
& "," & objCont.ColumnWidth _
& "," & objCont.ColumnOrder _
& ");"
DB.Execute strSQL, dbFailOnError
End If
Next objCont
WS.CommitTrans
set_column_data = True
Exit Function
ErrEXE:
set_column_data = False
WS.Rollback
End Function
Function get_column_data(strFormName As String) As Boolean
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim objCont As Control
Dim strSQL As String
On Error GoTo ErrEXE
Set DB = CurrentDb
strSQL = " SELECT * FROM T_列データ " _
& " WHERE フォーム名 ='" & strFormName & "' ORDER BY 順番"
Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)
Do Until RS.EOF
Forms(strFormName).Controls(RS![サブコントロール名]) _
.Form.Controls(RS![コントロール名]).ColumnWidth = RS![幅]
Forms(strFormName).Controls(RS![サブコントロール名]) _
.Form.Controls(RS![コントロール名]).ColumnOrder = RS![順番]
RS.MoveNext
Loop
get_column_data = True
Exit Function
ErrEXE:
get_column_data = False
End Function
当方はWinXP、Access2007の環境ですが、
上記コードを accdb にて設定した後に accde ファイルに変換し
列幅、列順が保存されることを確認しております。
ご参考になれば幸いです。
|
|