如何更改数据库中每个字段的每个格式?
Posted
技术标签:
【中文标题】如何更改数据库中每个字段的每个格式?【英文标题】:How can I change every Format on every field in a database? 【发布时间】:2016-11-23 02:52:23 【问题描述】:我的任务是对 access 数据库进行一系列更改。其中之一是将数据库中的格式从英国更改为澳大利亚。
数据库中的“成本”字段的类型为货币,但“格式”为“£#,##0.00;-£#,##0.00”。将格式更改为“货币”使其显示为 $,但这些字段在此数据库的不同表中随处可见。
是否有一个中心点来改变它,或者如果没有,是否有一些我可以编写的 VBA 来做到这一点?我试图通过 VBA 脚本,在每个表上使用 For Each 迭代器,但我不明白如何通过该方法更改“格式”字段。
【问题讨论】:
必须更改的不是表格,而是显示值的表单和报表上的控件。所以迭代 Forms、Controls、Property Format 并在找到 £ 时进行调整。 这个应用程序是在英国还是澳大利亚运行?在某些情况下,您可以更改区域设置以获得所需的结果,但是如果您在英国,我怀疑您是否要将它们设置为澳大利亚,否则其他产品可能会出现意外结果。您可以更改掩码和格式,但这可能很残酷。我们部署到 70 多个国家/地区,但由于所有用户都是“美国”员工,我们要求他们坚持使用英语(美国)。 @WayneG.Dunn 格式字段设置为“货币”类型的每个字段的“£#,##0.00;-£#,##0.00”,我的机器设置为澳大利亚地区,但它没有帮助:( 我只是用我在测试中发现的内容的描述替换了我的答案,以及两种可以更改数字格式的方法。一个在设计时,另一个在运行时。 【参考方案1】:首先,请阅读以下内容,看看是否可以解决您的货币格式问题:http://www.everythingaccess.com/tutorials.asp?ID=Using-the-Currency-field-data-type---without-the-hassle
如果没有,请继续阅读...
经过进一步测试,更改表中字段的“格式”属性似乎对现有表单/报告没有任何帮助。因此,您有两种选择来解决格式问题:(方法 1)是将所有表单/报告的设计视图更改为使用显式格式;或(方法 2)使用一些 VBA 代码在运行时(打开对象时)设置格式属性。如果您有很多字段要更改,选项 (1) 会更容易。阅读选项(方法 2)的说明,然后再做决定。
以下 VBA 代码可以循环遍历所有报表和表单。我目前设置为只处理一个表格和一个报告,我建议你从小处着手,当对结果满意时,处理所有对象。
查看我使用“###”的每个地方,因为它说明了您可以/应该更改的内容。
方法一:
Option Compare Database
Option Explicit
' NOTE!!!! Look at all comments containing '###' for notes
Sub Fix_Reports_and_Forms()
Change_Form_Properties
Change_Report_Properties
End Sub
Function Change_Form_Properties()
Dim dbs As DAO.Database
Dim ctr As Container
Dim doc As Document
Dim frm As Form
Dim ctl As Control
Dim ObjectName As String
Dim i As Integer
Dim bChg As Boolean
Set dbs = CurrentDb
Set ctr = dbs.Containers!Forms
For Each doc In ctr.Documents
ObjectName = doc.Name
'### For testing, I suggest you change the following code to select only ONE Form. Later, remove the IF to do all.
If ObjectName = "Table1" Then ' ### If you want to process ALL forms, remove this 'IF' and matching 'End If'
DoCmd.OpenForm ObjectName, acViewDesign
DoCmd.Minimize
Set frm = Forms(doc.Name)
Debug.Print "Form: " & frm.Name & vbTab & "Ctls: " & frm.Controls.Count
bChg = False
For Each ctl In frm.Controls ' Loop thru all controls
If ctl.ControlType = acTextBox Then ' Is this a TextBox?
Debug.Print vbTab & ctl.Name & vbTab & "Type: " & ctl.ControlType & vbTab & "Format: " & ctl.Properties("Format")
If ctl.Properties("Format") <> "" Then
' Add code to test if some currency format
If ctl.Properties("Format") = "Currency" Then
ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
bChg = True
ElseIf ctl.Properties("Format") = "$#,##0.00;-$#,##0.00" Then
ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
bChg = True
Else ' ### any other formats that need to be changed?
' Add code if needed
End If
Else
' ### Here I am checking for a specific field name as ControlSource
' This is not needed if you can identify controls by above code.
If ctl.Properties("ControlSource") = "CurrFld" Then
ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
bChg = True
End If
End If
ElseIf ctl.ControlType = acComboBox Then ' ### Add code for other control types as needed
' Do something if necessary
End If
Next ctl
If bChg = True Then ' Save changes
DoCmd.Close acForm, ObjectName, acSaveYes
Else ' Do not Save
DoCmd.Close acForm, ObjectName, acSaveNo
End If
End If '### Remove if processing ALL Form Names
Next doc
End Function
Function Change_Report_Properties()
Dim dbs As DAO.Database
Dim ctr As Container
Dim doc As Document
Dim rpt As Report
Dim ctl As Control
Dim ObjectName As String
Dim i As Integer
Dim bChg As Boolean
Set dbs = CurrentDb
Set ctr = dbs.Containers!Reports
For Each doc In ctr.Documents
ObjectName = doc.Name
'### For testing, I suggest you change the following code to select only ONE Form. Later, remove the IF to do all.
If ObjectName = "Table1" Then ' ### If you want to process ALL Reports, remove this 'IF' and matching 'End If'
DoCmd.OpenReport ObjectName, acViewDesign
DoCmd.Minimize
Set rpt = Reports(doc.Name)
Debug.Print "Report: " & rpt.Name & vbTab & "Ctls: " & rpt.Controls.Count
bChg = False
For Each ctl In rpt.Controls
If ctl.ControlType = acTextBox Then
Debug.Print vbTab & ctl.Name & vbTab & "Type: " & ctl.ControlType & vbTab & "Format: " & ctl.Properties("Format")
If ctl.Properties("Format") <> "" Then
' Add code to test if some currency format
If ctl.Properties("Format") = "Currency" Then
ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
bChg = True
ElseIf ctl.Properties("Format") = "$#,##0.00;-$#,##0.00" Then
ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
bChg = True
Else ' any other formats that need to be changed?
' Add code if needed
End If
Else
'### Here I am checking for a specific field name as ControlSource
If ctl.Properties("ControlSource") = "CurrFld" Then
ctl.Properties("Format") = "£#,##0.00;-£#,##0.00"
bChg = True
End If
End If
ElseIf ctl.ControlType = acComboBox Then ' ### Add code for other control types as needed
' Do something if necessary
End If
Next ctl
If bChg = True Then ' Save changes
DoCmd.Close acReport, ObjectName, acSaveYes
Else ' Do not Save
DoCmd.Close acReport, ObjectName, acSaveNo
End If
End If '### Remove if processing ALL Report Names
Next doc
End Function
方法二
我在这个站点找到了一种在运行时更改格式的方法:http://donnedwards.openaccess.co.za/2009/03/microsoft-access-and-ten-year-old.html
如果您有许多需要更改格式的字段,所涉及的步骤可能会太难。以下是所需的步骤,然后是一些示例代码。
-
在设计视图中打开表单/报告
打开“详细信息部分”的属性
在 TAG 属性中,列出要更改格式的每个控件名称,并用逗号分隔。
添加表单/报告“打开时”事件并插入如下所示的代码。
保存更改
运行报告/表单
Option Compare Database
Option Explicit
Private Sub Report_Open(Cancel As Integer)
'
'// Fix up CURRENCY formatting
'
Dim strField As String, strTag As String, n As Long
strTag = Me.Detail.Tag
If Len(strTag) > 2 Then
strTag = strTag & ","
n = InStr(1, strTag, ",")
While n > 0
strField = Mid$(strTag, 1, n - 1)
strTag = Mid$(strTag, n + 1)
'Me(strField).Format = "Currency"
Me(strField).Format = "£#,##0.00;-£#,##0.00"
n = InStr(1, strTag, ",")
Wend
End If
End Sub
【讨论】:
谢谢,这看起来是迄今为止最有希望的回应。我可以问一个问题 - 您是否使用内置访问 VBA 编辑器来执行此操作?习惯了Visual Studio IDE和精彩的intellisense,Access中的intellisense似乎有点乱。 是的,我只是使用 Access (Office 2010) 中内置的 VBA 编辑器。您应该可以只复制代码,粘贴到模块中并运行它。【参考方案2】:您需要遍历TableDefs 并为您希望更改格式的每个字段调用SetProperty。
【讨论】:
感谢约翰。我确实通过 Access 中的 VBA 尝试了这种方法,但我并没有走得太远。你有任何可能有帮助的示例代码吗? @LewisCianci - 这是什么意思 - 你没走多远?您能否展示您尝试过的代码以及发生或未发生的事情?它是否更改了表中的字段格式?您是否也有需要更改的表单字段以上是关于如何更改数据库中每个字段的每个格式?的主要内容,如果未能解决你的问题,请参考以下文章