我有一个Word文档,其中包含一个项目的价格,订单金额和项目总和,其中金额和项目总和是旧版表单字段:
您可以通过复选框(也包括旧版表单字段)选择其他可用选项:
现在我已经创建了一个计算项目总和
的函数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
中的最后一行是函数调用,它计算净额,增值税和最终总和
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>
CalculateSum()
函数会明显地遍历所有sum
个字段(跨越三页)并沿着sum
奇怪地滚动文档字段。现在我怎么能在sum
字段上循环所有循环并奇怪地滚动?如何防止文档向上滚动到第1页?
任何帮助表示赞赏! (我也很感谢我对我的代码的评论,因为我是VBA的新手。)
我添加了screencast showing the error。
基本问题似乎是宏滚动到我在脚本中指的位置,例如如果我正在使用
ActiveDocument.FormFields("total_sum").Result = total_sum
它滚动到total_sum
字段。
答案 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
允许访问该字段而不关注它。