【问题标题】:Access VBA Formatting访问 VBA 格式
【发布时间】:2010-10-07 15:38:42
【问题描述】:

大家好,最后我成功地将我的数据库与 Excel 很好地集成在一起,但最后我把它展示给老板后,他们要求我再次在 Access 中开发表格和报告。幸运的是,这并没有花太长时间,所以我最终为一个后端数据库做了两个前端。但最终它将成为一个完全 Access 数据库,只使用一点 Excel 集成;基本上是将每日交易结束时的股价转移到 Access 中的转移电子表格方法。

现在我已经到了可以拆分和填充数据库的程度。(解决此问题的最佳方法是什么,先填充还是先拆分?)

我要问的问题如下:

这似乎是一个相当简单的问题,但到目前为止,我还没有得到谷歌的帮助,或者我在搜索中没有使用正确的关键字,所以我想在这里问什么更好的地方;有没有办法格式化通过一些 VBA 代码生成并放置在 Access 中的新表中的数字,使它们看起来像:

所以如果它是 1,000,000 那么它将显示为 1m 或者如果它是 10,000,那么它显示为 10k 所以基本上,如果它有三个 0,那么它就是一个 K 如果它有六个 0,那么它就是一个 M

我最初使用了一些 VBA 来按以下方式格式化数字:

ChangeInShare = Format(ChangeInShare, "#,##.00")

但后来有人要求缩短一些数字以使报告看起来更整洁。

最终表格采用文本格式的值。

谢谢

【问题讨论】:

    标签: ms-access formatting vba


    【解决方案1】:

    您可以使用模运算符来测试该数字是否可被 1000000 或 1000 整除,然后替换最后的零。

    也许这个函数会为你指明正确的方向:

    Public Function fmt(val As Long) As String
      Dim result As String
      If val Mod 1000000 = 0 Then
        result = (val \ 1000000) & "M"
      ElseIf val Mod 1000 = 0 Then
        result = (val \ 1000) & "K"
      Else
        result = val
      End If
      fmt = result
    End Function
    

    然后是一些测试调用:

    ? fmt(471000)
    471K
    ? fmt(4711)
    4711
    ? fmt(4000000)
    4M
    ? fmt(40000)
    40K
    

    【讨论】:

    • 谢谢 Vanje,现在就试试这个。
    【解决方案2】:

    嗨,Muffi D
    除了vanjes可以接受的非常好的答案之外,还有另一个想法: 科学记数法呢?

    Debug.Print FStr(10)
    Debug.Print FStr(2000)
    Debug.Print FStr(300000)
    Debug.Print FStr(40000000)
    Debug.Print FStr(5000000000#)
    Debug.Print FStr(12)
    Debug.Print FStr(2345)
    Debug.Print FStr(345678)
    Debug.Print FStr(45678901)
    Debug.Print FStr(5678901234#)
    
    Function FStr(ByVal d As Double) As String
       FStr = Format(d, "0.####E+0")
    End Function
    

    然后你会得到:

    1,0E+1
    2,000E+3
    3,E+5
    4,E+7
    5,E+9
    1,2E+1
    2,345E+3
    3,4568E+5
    4,5679E+7
    5,6789E+9
    

    如果您需要双打(或货币),您可以使用 vanjes 答案,但改用 ModF 函数:

    Function ModF(ByVal value As Double, _
                  ByVal div As Double) As Double
       ModF = value - (Int(value / div) * div)
    End Function
    
    Function fmtF(ByVal value As Double) As String
      Dim result As String
      If ModF(value, 1000000000) = 0 Then
        result = (value / 1000000000) & "G"
      ElseIf ModF(value, 1000000) = 0 Then
        result = (value / 1000000) & "M"
      ElseIf ModF(value, 1000) = 0 Then
        result = (value / 1000) & "K"
      Else
        result = value
      End If
      fmtF = result
    End Function
    

    问候 哎呀

    【讨论】:

    • 这也是一个很好的答案,但我之前忘记在我的帖子中指定数据库将用于生成财务报告,旨在用于内部或外部,尽管在大学学习工程学时本来是更可取的方法,我在哪里工作,他们想要它,所以它可以呈现给他们的客户。谢谢 哎呀,无论哪种方式都绝对很高兴知道这一点。 :)
    【解决方案3】:

    您可以在分发给用户之前随时拆分数据库,但我不知道您所说的“填充”是什么意思。

    请参阅"Splitting your app into a front end and back end Tips" 页面以获取有关拆分的信息。请参阅免费的Auto FE Updater utility 以使新 FE 的分发相对轻松。

    【讨论】:

    • 嘿,谢谢!当我说填充时,我的意思是填写某些无法直接通过表格填写的表格。这是因为这些表格包含历史股票市场数据以及历史货币汇率数据;它们将通过表单进行更新,但是当初始数据进入时,它会通过 Excel 电子表格直接进入表格,因为进入的实际数据量很大。
    【解决方案4】:

    我也想知道;我有一个 CurrencyCode,它定义了公司使用的任何类型的货币;现在VBA中的所有计算都已经完成了。我想知道有没有办法编写一个 SQL 语句,例如;如果 CurrencyCode=GBP,则结果字段显示为 2300 万英镑,而不是字段中所有不同货币的 2300 万英镑等。

    这又是,现在需要硬编码;唯一的问题是,如果将来如果我不在公司,则必须有人添加公司,而该公司没有执行此操作的代码;那么会有什么处理方式呢?他们是否必须有人需要知道如何使用 SQL 或 VBA 并能够进行更改?为此,如果可能的话,我宁愿在 SQL 中执行它,因为这样我可以将它放在数据库手册中,并且 SQL 对于初学者来说使用 VBA 的难度要小得多。

    结果值必须在同一列中,因此所有不同的 IF 和 Wheres 都需要成为同一 SQL 语句的一部分,这是因为那里的报告对不同的公司使用单个列不同的货币。

    谢谢!

    【讨论】:

    • 您可能只需要更改货币字段的格式即可显示英镑。并在查询中有一个计算字段,它将您的基础货币转换为您希望显示的货币。
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多