1

我有一个带有子表单的表单。该子窗体显示动态创建的查询的结果(用户输入条件,我构建 SQL,然后更新 querydef 并显示)。问题是由于列是动态的,所以列的宽度不合适,有些正在切断文本。

有没有办法以编程方式循环遍历列(或在没有循环的情况下执行相同操作)并在刷新查询后将它们全部设置为最适合的宽度?

编辑:这是我的代码现在的样子:

CurrentDb.QueryDefs("SearchResults").sql = sql
CurrentDb.QueryDefs.Refresh   

Dim qdf1 As DAO.QueryDef
Dim fld1 As DAO.Field

Set qdf1 = CurrentDb.QueryDefs("SearchResults")

For i = 0 To qdf1.Fields.Count - 1
    Set fld1 = qdf1.Fields(i)
    fld1.CreateProperty "ColumnWidth", dbInteger

    fld1.Properties("ColumnWidth") = -2     'Throws error
    Set fld1 = Nothing
Next i

Me.Child20.SourceObject = "Query.SearchResults"
4

3 回答 3

4

您可以像这样设置列宽:

Sub SetColumnWidth()
Dim qdf1 As DAO.QueryDef
Dim fld1 As DAO.Field

Set qdf1 = CurrentDb.QueryDefs("query3")

For i = 0 To qdf1.Fields.Count - 1
    Set fld1 = qdf1.Fields(i)
    fld1.CreateProperty "ColumnWidth", dbInteger
    'very narrow indeed
    'fld1.Properties("ColumnWidth") = 200
    'Or -2 : Sizes the column to fit the visible text
    'but it is not quite as useful as it would seem
    fld1.Properties("ColumnWidth") = -2
    Set fld1 = Nothing
Next i

End Sub

另请参阅http://support.microsoft.com/kb/210427

于 2012-10-22T22:02:41.697 回答
1

所以我刚才遇到了同样的问题。我很幸运有一半的查询工作,而另一半没有。我一直在使用这段代码:

Sub QueryData(strSQL As String)
    Dim qryData As DAO.QueryDef
    Dim intcount As Integer

    Set qryData = CurrentDb.QueryDefs("DataQuery")
    qryData.SQL = strSQL
    qryData.CreateProperty "ColumnWidth", dbInteger

    qryData.Fields(0).Properties("ColumnWidth") = 5760

    DoCmd.OpenQuery "DataQuery", , acReadOnly
End Sub

这在我尝试使用它运行的一半查询中产生了错误。我将其追溯到这个奇怪但简单的事实:使用别名构建的列(即所有公式列和表达式)会消除此错误。如果该列只是一个直接的数据拉取,它工作正常。但是,如果该列是一个公式化的显示......它会吐出no columwidth property错误。

希望这会帮助别人!我知道这个问题大约一年了,但这是谷歌为我找到的关于这个主题的第一个结果。

于 2013-02-15T21:11:15.613 回答
0

我能够抓住打开的表单并在该表单中自动调整选定的子表单。如果您有多个表单/子表单,您只需使用函数末尾的代码行使用新名称调用函数并将它们粘贴到您的程序中。

Public Function AutoSizeSbCtrl(frmNameTar, sbCtrlNameTar)
For Each frm In Forms
    frmName = frm.Name
    If frmName = frmNameTar Then
        For Each frmCtrl In frm.Controls
            frmCtrlName = frmCtrl.Name
            If frmCtrlName = sbCtrlNameTar Then
                For Each sbfrmCtrl In frmCtrl.Controls
                    sbfrmCtrlName = sbfrmCtrl.Name
                    On Error Resume Next
                    sbfrmCtrl.ColumnWidth = -2
                    On Error GoTo 0
                Next sbfrmCtrl
            End If
        Next frmCtrl
    End If
Next frm

' paste the lines below in your code where you want it to trigger (i did on an update)
'frmNameTar= "frm12345" ' where frm12345 is the name of the form the subform is in
'sbCtrlNameTar="sbfrm67890" ' where sbfrm67890 is the name of the subform you are trying to autofit
'auSize = AutoSizeSbCtrl(frmNameTar, sbCtrlNameTar)
'end paste
End Function
于 2021-11-08T19:05:04.950 回答