Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1597 / 9994 ←次へ | 前へ→

【11688】Re:MDBでMDE風みたいな
回答  小僧  - 10/6/10(木) 17:05 -

引用なし
パスワード
   ▼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 ファイルに変換し
列幅、列順が保存されることを確認しております。

ご参考になれば幸いです。

1,284 hits

【11664】MDBでMDE風みたいな pon 10/5/26(水) 14:20 質問[未読]
【11672】Re:MDBでMDE風みたいな YU-TANG 10/6/1(火) 16:04 回答[未読]
【11687】Re:MDBでMDE風みたいな pon 10/6/10(木) 15:13 質問[未読]
【11688】Re:MDBでMDE風みたいな 小僧 10/6/10(木) 17:05 回答[未読]
【11692】Re:MDBでMDE風みたいな pon 10/6/11(金) 11:06 質問[未読]
【11695】Re:MDBでMDE風みたいな YU-TANG 10/6/11(金) 17:20 回答[未読]

1597 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free