如何在没有滚动的情况下计算传统表单字段的总和?

时间:2014-11-11 08:30:35

标签: vba ms-word scroll

我有一个Word文档,其中包含一个项目的价格,订单金额和项目总和,其中金额和项目总和是旧版表单字段:

price, amount, item sum

您可以通过复选框(也包括旧版表单字段)选择其他可用选项:

optional items

代码

现在我已经创建了一个计算项目总和

的函数
Sub order_amount_Click()
    Dim amount As Integer
    Dim valueFromCell As String
    Dim list
    Dim value As Double

    amount = ActiveDocument.FormFields("order_amount").Result
    If amount > 0 Then
        valueFromCell = ThisDocument.Tables(1).Cell(5, 3).Range.Text
        list = Split(valueFromCell, " ")
        value = list(0)
        subsum = value * amount
        ActiveDocument.FormFields("order_amount_sum").Result = subsum
    Else
        ActiveDocument.FormFields("order_amount_sum").Result = 0
    End If

    CalculateSum
End Sub

和另一个计算其他项目的项目总和的函数(如果激活了复选框)乘以订单金额:

Sub optional_item_Click()
    Dim checkbox As Integer
    Dim valueFromCell As String
    Dim list
    Dim value As Double
    Dim amount As Integer
    Dim subsum As Double

    checkbox = ActiveDocument.FormFields("optional_item1").Result
    amount = ActiveDocument.FormFields("order_amount").Result

    If checkbox = 1 And amount > 0 Then
        valueFromCell = ThisDocument.Tables(1).Cell(7, 3).Range.Text
        list = Split(valueFromCell, " ")
        value = list(0)
        subsum = value * amount
        ActiveDocument.FormFields("optional_item1_sum").Result = subsum
    Else
        ActiveDocument.FormFields("optional_item1_sum").Result = 0
    End If

    CalculateSum
End Sub

Click()个函数与optional_item个字段一样多,共计17个 - 我还没有概括函数。)

两个Sub中的最后一行是函数调用,它计算净额,增值税和最终总和

net, VAT and total sum

Function CalculateSum()
    Dim net As Double
    Dim vat As Double
    Dim total_sum As Double

    net = CDbl(ActiveDocument.FormFields("order_amount_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item1_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item2_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item3_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item4_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item5_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item6_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item7_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item8_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item9_sum").Result)

    ' Cannot compile when line too long, so splitting into two statements
    net = net + CDbl(ActiveDocument.FormFields("optional_item10_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item11_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item12_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item13_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item14_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item15_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item16_sum").Result) + CDbl(ActiveDocument.FormFields("optional_item17_sum").Result)
    'MsgBox "net " & net
    ActiveDocument.FormFields("net_sum").Result = net

    vat = net * 0.19
    'MsgBox "vat " & vat
    ActiveDocument.FormFields("vat_sum").Result = vat

    total_sum = net + vat
    'MsgBox "total " & total_sum
    ActiveDocument.FormFields("total_sum").Result = total_sum
End Function

问题

代码本身工作正常,所有元素都正确计算。但是有两个主要问题使得整个文档几乎无法使用(用户的所有操作都限制在文档顶部输入其名称,选择金额并取消激活复选框;无法访问和字段):< / p>

  1. 当我执行某个操作(例如输入一个金额)时,CalculateSum()函数会明显地遍历所有sum个字段(跨越三页)并沿着sum奇怪地滚动文档字段。
  2. 当我点击第二页或第三页上的复选框时,文档会向上滚动到第一页,然后我可以输入我想要订购的件数。
  3. 现在我怎么能在sum字段上循环所有循环并奇怪地滚动?如何防止文档向上滚动到第1页?

    任何帮助表示赞赏! (我也很感谢我对我的代码的评论,因为我是VBA的新手。)

    更新#1

    我添加了screencast showing the error

    更新#2

    基本问题似乎是宏滚动到我在脚本中指的位置,例如如果我正在使用

    ActiveDocument.FormFields("total_sum").Result = total_sum
    

    它滚动到total_sum字段。

2 个答案:

答案 0 :(得分:1)

评论太难了......

对于(b)你必须使用VBA - 你不能使用我在其他地方使用FormFields复选框建议的技巧,只能使用内容控制复选框。

对于(c),这样的事情(未经测试)

确保为Optional_item1设置了On Exit宏,并且还设置了Exit on Calculate。我认为您不需要On Entry宏。

Sub optional_item1_Click() 
  Call cb_Click("optional_item1") 
End Sub 

Sub cb_Click(ffname As String)
  ActiveDocument.Variables(ffname) = abs(int(ActiveDocument.FormFields(ffname).Checkbox.Value))
End Sub

在您的Summa列中,选中

旁边的复选框
{ ={ DOCVARAIABLE optional_item1 }*X2 }

其中X2是包含3,00欧元值的单元格,而所有{}是您可以在Windows Word上使用ctrl-F9插入的特殊字段代码括号对。

BUT

Word是否正确地正确解释您的欧元值取决于使用您的表单的用户的区域设置,(小数点分隔符,组(千)分隔符,货币符号和货币符号的位置可能都会改变Word的行为。即使在欧元区我认为其中一些可能会有所不同。因此,如果用户不需要在单元格中修改3,00欧元的乘数,那么将值直接插入{=}字段可能更好:

{ ={ DOCVARAIABLE optional_item1 }*3 }

您还可以使用\ #grims格式为您提供正面或0时所需的格式。但同样,Word的数字格式设施不是与语言环境无关的。)

这些区域设置依赖关系有时也是在VBA而不是字段代码中执行更多操作的原因。

答案 1 :(得分:0)

作为AdamsTips found out elsewhere,替换此

ActiveDocument.FormFields("myField").Result

由此

ActiveDocument.Bookmarks("myField").Range.Fields(1).Result

允许访问该字段而不关注它。