在与上次关闭时相同的位置打开 MS Access 表单或报告
Open MS Access form or report in same location as when last closed
我是 Access 的新手,在实现我在另一个 post 中看到的东西时遇到了一些困难。 MS-Access: How to open form in same location/size as closed/previous form?
我想在它们上次关闭的相同位置打开我的弹出窗体,我创建了一个 table (sizpos) 来存储位置和大小的 4 个属性(左、上) 、宽度、高度)和表单名称(对象)以及唯一的 ID 号。
我需要一些帮助来找出 VBA 代码以根据关闭或卸载事件中的表单名称存储打开表单的属性。我还需要有关代码的帮助,以从 table 检索打开或加载事件的打开表单的信息。
我尝试在 me.move
中使用 dlookup
但没有成功,但可能没有正确实施它。
我想出了以下几乎适用于报告的内容。我只是不知道如何从正在打开的报表中提取报表的名称,类似于表单中的 me.name
函数。我用 me.reportname
???
标记了那些区域
Private Sub Report_Open(Cancel As Integer)
Dim l As Long
Dim t As Long
l = Nz(DLookup("Left", "SizPos", "Object = 'me.reportname???'"))
t = Nz(DLookup("Top", "SizPos", "Object = 'me.reportname???'"))
Me.Move Left:=l, Top:=t
End Sub
Private Sub Report_Close()
Dim strSQL As String
strSQL = "UPDATE SizPos SET SizPos.Left = " & Me.WindowLeft & ", SizPos.Top = " & Me.WindowTop & " WHERE SizPos.Object = 'me.reportname???';"
CurrentDb.Execute strSQL
End Sub
下面的表格非常适用。
Private Sub Form_Open(Cancel As Integer)
Dim l As Long
Dim t As Long
Dim w As Long
Dim h As Long
l = Nz(DLookup("Left", "SizPos", "Object = '" & Me.Name & "'"))
t = Nz(DLookup("Top", "SizPos", "Object = '" & Me.Name & "'"))
w = Nz(DLookup("Width", "SizPos", "Object = '" & Me.Name & "'"))
h = Nz(DLookup("Height", "SizPos", "Object = '" & Me.Name & "'"))
Me.Move Left:=l, Top:=t, Width:=w, Height:=h
End Sub
Private Sub Form_Close()
DoCmd.Save
Dim strSQL As String
strSQL = "UPDATE SizPos SET SizPos.Left = " & Me.WindowLeft & ", SizPos.Top = " & Me.WindowTop & ", SizPos.Width = " & Me.WindowWidth & ", SizPos.Height = " & Me.WindowHeight & " WHERE SizPos.Object = '" & Me.Name & "';"
CurrentDb.Execute strSQL
End Sub
使用 DAO.Recordset
而不是 4 DLookup
语句来获取对象大小和位置的值。您还可以使用 DAO.Recordset
稍后存储它们,而不是构建和执行 UPDATE
和 INSERT
语句。
这是我的 sizpos table:
CREATE TABLE sizpos (
id COUNTER PRIMARY KEY,
obj_name TEXT(255) UNIQUE,
lft INTEGER,
tp INTEGER,
wdth INTEGER,
hght INTEGER
);
我创建了一个参数查询来获取给定表单或报表名称的存储大小和位置值:
PARAMETERS which_object Text (255);
SELECT s.obj_name, s.lft, s.tp, s.wdth, s.hght
FROM sizpos AS s
WHERE s.form_name=[which_object];
我本可以将其保存为命名查询。但是我创建了一个函数,SelectObjectSettings,到return那个语句文本。
因此,在 表单加载 期间,我可以将表单的名称提供给该查询,并打开包含查询结果的 DAO.Recordset
。然后,如果记录集不为空,则使用记录集的值来设置表单的大小和位置:
Private Sub Form_Load()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, SelectObjectSettings)
qdf.Parameters("which_object").Value = Me.Name
Set rs = qdf.OpenRecordset
With rs
If Not (.BOF And .EOF) Then
Me.Move Left:=!lft, Top:=!tp, Width:=!wdth, Height:=!hght
End If
End With
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub
注意:如果您有保存的参数查询,您可以Set qdf
到那个...
'Set qdf = db.CreateQueryDef(vbNullString, SelectObjectSettings)
Set qdf = db.QueryDefs("YourQueryName")
在表单卸载,保存表单的大小和位置:
Private Sub Form_Unload(Cancel As Integer)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, SelectObjectSettings)
qdf.Parameters("which_object").Value = Me.Name
Set rs = qdf.OpenRecordset
With rs
If (.BOF And .EOF) Then
' no existing record for this object; create one
.AddNew
!obj_name = Me.Name
Else
' a record exists for this object; edit it
.Edit
End If
!lft = Me.WindowLeft
!tp = Me.WindowTop
!wdth = Me.WindowWidth
!hght = Me.WindowHeight
.Update
.Close
End With
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub
我是 Access 的新手,在实现我在另一个 post 中看到的东西时遇到了一些困难。 MS-Access: How to open form in same location/size as closed/previous form?
我想在它们上次关闭的相同位置打开我的弹出窗体,我创建了一个 table (sizpos) 来存储位置和大小的 4 个属性(左、上) 、宽度、高度)和表单名称(对象)以及唯一的 ID 号。
我需要一些帮助来找出 VBA 代码以根据关闭或卸载事件中的表单名称存储打开表单的属性。我还需要有关代码的帮助,以从 table 检索打开或加载事件的打开表单的信息。
我尝试在 me.move
中使用 dlookup
但没有成功,但可能没有正确实施它。
我想出了以下几乎适用于报告的内容。我只是不知道如何从正在打开的报表中提取报表的名称,类似于表单中的 me.name
函数。我用 me.reportname
???
Private Sub Report_Open(Cancel As Integer)
Dim l As Long
Dim t As Long
l = Nz(DLookup("Left", "SizPos", "Object = 'me.reportname???'"))
t = Nz(DLookup("Top", "SizPos", "Object = 'me.reportname???'"))
Me.Move Left:=l, Top:=t
End Sub
Private Sub Report_Close()
Dim strSQL As String
strSQL = "UPDATE SizPos SET SizPos.Left = " & Me.WindowLeft & ", SizPos.Top = " & Me.WindowTop & " WHERE SizPos.Object = 'me.reportname???';"
CurrentDb.Execute strSQL
End Sub
下面的表格非常适用。
Private Sub Form_Open(Cancel As Integer)
Dim l As Long
Dim t As Long
Dim w As Long
Dim h As Long
l = Nz(DLookup("Left", "SizPos", "Object = '" & Me.Name & "'"))
t = Nz(DLookup("Top", "SizPos", "Object = '" & Me.Name & "'"))
w = Nz(DLookup("Width", "SizPos", "Object = '" & Me.Name & "'"))
h = Nz(DLookup("Height", "SizPos", "Object = '" & Me.Name & "'"))
Me.Move Left:=l, Top:=t, Width:=w, Height:=h
End Sub
Private Sub Form_Close()
DoCmd.Save
Dim strSQL As String
strSQL = "UPDATE SizPos SET SizPos.Left = " & Me.WindowLeft & ", SizPos.Top = " & Me.WindowTop & ", SizPos.Width = " & Me.WindowWidth & ", SizPos.Height = " & Me.WindowHeight & " WHERE SizPos.Object = '" & Me.Name & "';"
CurrentDb.Execute strSQL
End Sub
使用 DAO.Recordset
而不是 4 DLookup
语句来获取对象大小和位置的值。您还可以使用 DAO.Recordset
稍后存储它们,而不是构建和执行 UPDATE
和 INSERT
语句。
这是我的 sizpos table:
CREATE TABLE sizpos (
id COUNTER PRIMARY KEY,
obj_name TEXT(255) UNIQUE,
lft INTEGER,
tp INTEGER,
wdth INTEGER,
hght INTEGER
);
我创建了一个参数查询来获取给定表单或报表名称的存储大小和位置值:
PARAMETERS which_object Text (255);
SELECT s.obj_name, s.lft, s.tp, s.wdth, s.hght
FROM sizpos AS s
WHERE s.form_name=[which_object];
我本可以将其保存为命名查询。但是我创建了一个函数,SelectObjectSettings,到return那个语句文本。
因此,在 表单加载 期间,我可以将表单的名称提供给该查询,并打开包含查询结果的 DAO.Recordset
。然后,如果记录集不为空,则使用记录集的值来设置表单的大小和位置:
Private Sub Form_Load()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, SelectObjectSettings)
qdf.Parameters("which_object").Value = Me.Name
Set rs = qdf.OpenRecordset
With rs
If Not (.BOF And .EOF) Then
Me.Move Left:=!lft, Top:=!tp, Width:=!wdth, Height:=!hght
End If
End With
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub
注意:如果您有保存的参数查询,您可以Set qdf
到那个...
'Set qdf = db.CreateQueryDef(vbNullString, SelectObjectSettings)
Set qdf = db.QueryDefs("YourQueryName")
在表单卸载,保存表单的大小和位置:
Private Sub Form_Unload(Cancel As Integer)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, SelectObjectSettings)
qdf.Parameters("which_object").Value = Me.Name
Set rs = qdf.OpenRecordset
With rs
If (.BOF And .EOF) Then
' no existing record for this object; create one
.AddNew
!obj_name = Me.Name
Else
' a record exists for this object; edit it
.Edit
End If
!lft = Me.WindowLeft
!tp = Me.WindowTop
!wdth = Me.WindowWidth
!hght = Me.WindowHeight
.Update
.Close
End With
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub