访问:自动调整大小后确定列宽?

时间:2014-02-07 17:23:35

标签: vba ms-access access-vba

我有一个MSAccess数据表,我填充并自动调整大小,通过以下步骤逐步执行:

~field~.Properties("ColumnWidth") = -2

按预期工作。

某些列宽解决了疯狂的宽度(自由格式文本等)。我想通过列进行第二次测试并测试这些非常长的并重置为更窄的固定宽度。但是,当我测试列宽时,得到的结果是“-2”(duh)与实际产生的宽度(即5760缇)。

有关使用自动调整大小后如何确定结果列宽的任何建议?

2 个答案:

答案 0 :(得分:0)

在设计视图中打开受影响的查询,然后单击并拖动以手动调整报告-2作为列大小的每个列的大小。不要双击以自动调整列的大小!这就是导致"破坏"行为。

背景:

这种行为最近使我疯了。我有一个AutoFitDatasheet()例程,可以运行多年,直到有一天它停止在特定查询上工作。我使用了以下代码的变体:

MyControl.ColumnWidth = -2
AutoFitColWidth = MyControl.ColumnWidth

当此代码运行时,第一行将告诉控件自动调整。第二行将保存列的新宽度(正数)。

但是,如果在分配auto-fit属性时不需要调整列的大小,ColumnWidth将保留刚刚分配的-2值,并在检索ColumnWidth属性时报告该值。

使用未记录的SaveAsText例程将查询导出到文本显示没有特殊的"自动调整"分配给受影响列的属性。相反,重现行为的关键似乎是起始列宽度与自动拟合后的最终列宽有多接近。精确匹配有效,但即使距离调整大小的ColumnWidth + +- 10点的值似乎足以触发行为。

我已经开始使用以下代码来解决这种情况,但我还没有彻底测试它以便在此时正式推荐它:

Const ColumnAutoFit As Long = -2
Dim PrevWidth As Long
PrevWidth = MyControl.ColumnWidth
MyControl.ColumnWidth = ColumnAutoFit
If MyControl.ColumnWidth = ColumnAutoFit Then
    AutoFitColWidth = PrevWidth
Else
    AutoFitColWidth = MyControl.ColumnWidth
End If

我应该注意到我在分配-2自动调整值之前尝试分配临时虚拟ColumnWidth(例如MyControl.ColumnWidth = 1)。但这似乎没有用。

答案 1 :(得分:-1)

修订于2014年3月10日(之前的代码是如何找到宽列并设置更窄的示例 - 具体为第7列)。使用Access 2010我能够做你想做的事 - 我想。设置完所有后,我的第7列真的很宽(25440)(并且debug.print显示了值。然后我重置为我喜欢的数字(即2000)。

Option Compare Database
Option Explicit

Private Sub Form_Load()
Dim i   As Integer
On Error GoTo Error_trap
For i = 0 To Me.Form.Controls.Count - 1
    If InStr(1, Me.Form.Controls(i).Name, "_Label") = 0 Then
        If Me.Form.Controls(i).Properties("ColumnWidth") > 2000 Then
            Debug.Print "set " & i & vbTab & Me.Form.Controls(i).Name & vbTab & "From: " & Me.Form.Controls(i).Properties("ColumnWidth") & vbTab & "To: 2000"
            Me.Form.Controls(i).Properties("ColumnWidth") = 2000
        End If
    End If
Next i

'Debug.Print "******  " & Me.Form.Controls(7).Properties("ColumnWidth")

'Me.Form.Controls(7).Properties("ColumnWidth") = 1200

Exit Sub
Error_trap:
   'Debug.Print Err.Number & vbTab & Err.Description & vbTab & i & vbTab & Me.Form.Controls(i).Name
    Resume Next
End Sub