【问题标题】:Open MS Access form or report in same location as when last closed在与上次关闭时相同的位置打开 MS Access 表单或报告
【发布时间】:2015-06-25 22:50:11
【问题描述】:

我是 Access 的新手,在实现我在另一篇文章中看到的内容时遇到了一些困难。 MS-Access: How to open form in same location/size as closed/previous form?

我想在上次关闭弹出表单的位置打开我的弹出式表单,我创建了一个表 (sizpos) 来存储位置和大小的 4 个属性(左、上、宽、高)和表单(对象)的名称和唯一的 ID 号。

我需要一些帮助来确定 VBA 代码,以根据关闭或卸载事件上的表单名称存储打开表单的属性。我还需要有关代码的帮助,以从表中检索打开或加载事件的打开表单的信息。

我尝试在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

【问题讨论】:

  • 没有reportname 属性。使用Me.Name 获取报告的名称。 Me.Name 可在表单或报告中使用。

标签: forms ms-access position vba size


【解决方案1】:

使用 DAO.Recordset 而不是 4 个 DLookup 语句来获取对象大小和位置的值。您还可以使用DAO.Recordset 稍后存储它们,而不是构建和执行UPDATEINSERT 语句。

这是我的 sizpos 表:

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,用于返回该语句文本。

因此,在表单加载期间,我可以将表单的名称提供给该查询,并使用查询结果打开一个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")

Form Unload处,保存表单的大小和位置:

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

【讨论】:

  • 我无法让它成功运行。你是如何创建你的函数的?我尝试调用保存的查询并直接调用查询参数,如下所示,但参数太少。预期 1. 设置 rs = db.OpenRecordset("SELECT s.left, s.top, s.width, s.height FROM SizPos AS s WHERE s.object = " & Me.Name)
  • 如果你想这样做,你需要在Me.Name ... Set rs = db.OpenRecordset("SELECT s.left, s.top, s.width, s.height FROM SizPos AS s WHERE s.object = '" & Me.Name & "'")周围添加引号
  • 我添加了一个更新来展示如何使用保存的参数查询。
  • 非常感谢。对不起所有的问题,但我学到了很多东西。另外,感谢您对 me.name 在报告中工作的最初提醒。我以为是这样,但经过进一步审查,它不起作用,因为表格中的报告名称拼写错误。
  • 您可能更愿意将代码改编为通用过程,然后您可以从任何表单或报告的 Load 和 Unload 事件中调用。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多