头条文章--自定义方式构造Word表格中单元格区域求和子过程

哈喽,各位好,今天,又准备给大家分享一个比较有用的高级办公技巧哦!希望大家认真看完下面的文章哦!什么办公技巧呢?大家看我细细道来吧。明人不说暗话,开门见山给大家直说了吧:关于word表格中数据区域的数据用后台生成公式计算的高级应用问题。该设计的亮点和特色是利用输入对话框灵活的定位计算结果单元格位置,并通过VBA后台灵活通过方法.Formula(公式参数字符串)的形式计算区域里面的数据!

下面,我们就来看看如何设计这种机制的Word文档吧。在设计上,我们分为:前端的文档上的表格设计及插入开发工具里面的ActiveX命令按钮控件;后台的功能(文档打开的一系列初始化工作、运行计算工作、清除生成结果数据、新定义一个利用公式串作为参数进行计算的子过程等)代码实现。

一、文档表格插入、表格待计算数据填入、命令按钮控件的插入。

(一)插入表格、命令按钮插入,并将表格填充必要的计算的原始数据。如下截图所示

图1 文档表格、控件

(二)设置命令按钮属性。如下图所示

图2 命令按钮属性

二、用公式串实现高级计算的后台功能代码

(一)ThisDocument里面的功能代码:

Private Sub Document_Open()

Set mt = ActiveDocument.Tables(1) '表格对象mt指向表格集合Tables的第一个表格

'当每次打开word文档后,即刻寻找是否存在背景色为蓝色的单元格,如果有直接退出并且记录到c对象中去,否则什么都不做

For Each c In mt.Range.Cells

If c.Shading.BackgroundPatternColor = wdColorBlue Then

Exit For

End If

Next

End Sub

Private Sub CalcBtn_Click()

Call Run_Calculate_Work

End Sub

Private Sub ClearBtn1_Click()

Call Clear_Result_Before

End Sub

(二)插入的模块1 里面的代码:

Public mt As Table, c As Cell '定义mt为公有属性表格对象变量,定义临时c单元格为全局变量

Public i, j As Integer '定义公有属性的计算结果单元格行i、列j号(格式如:1,3)

Sub Run_Calculate_Work() '运行计算工作

Dim rg As String, Error_Prompt As String 'rg为范围字符串变量,Error_Prompt为输入框内容是否为空或格式错误提示字符串变量

Retry:

Inputbox_title = "提示:“行号”介于2--" & mt.Rows.Count & "之间,“列号”介于1--" & mt.Columns.Count & "之间"

k = InputBox("请输入结果单元格行i、列j号(格式如:1,3):", Inputbox_title)

'以下变量Error_Prompt是根据输入对话框存于k中的内容判定获取错误提示内容

Error_Prompt = IIf(Len(k) = 0, "为空!", "“" & k & "”格式错误!" & Chr(10) & "(参照输入格式形如:1,3)")

If StrPtr(k) <> 0 Then

If InStr(k, ",") Or InStr(k, ",") Then

If InStr(k, ",") Then k = Replace(k, ",", ",") '将有可能输入汉字标点的逗号","统统强制转换为西文标点的逗号","

i = Val(Left(k, InStr(k, ",") - 1))

j = Val(Right(k, Len(k) - InStr(k, ",")))

If (i <= 1 Or i > mt.Rows.Count) Or (j < 1 Or j > mt.Columns.Count) Then

MsgBox "输入内容" & Error_Prompt & Chr(10) & "请重新输入!!!", vbInformation, "提示"

GoTo Retry

Else

If Not (c Is Nothing) Then Call Clear_Result_Before '根据对象是否为未指派具体实例的空对象,非空即刻清除原先的结果值

Set c = mt.Cell(i, j) '单元格对象c指向具体的mt表格对象的单元格Cell(i,j)

rg = "Cell(" & 1 & "," & 1 & ")" & ":" & "Cell(" & 1 & "," & 4 & ")"

MsgBox "计算区域是:" & rg, vbInformation, "提示"

c.Range.Text = ""

c.Shading.BackgroundPatternColor = wdColorAutomatic '将单元格c背景色填充颜色重置为无填充

Calc rg, c '调用自定义的求和过程

End If

Else

MsgBox "输入内容" & Error_Prompt & Chr(10) & "请重新输入!!!", vbInformation, "提示"

GoTo Retry

End If

Else

MsgBox "您点击列<取消>按钮或<X>关闭按钮!" & Chr(10) & "因而也取消了计算区域数据的操作!", vbInformation, "提示"

End If

End Sub

Sub Clear_Result_Before()

If c Is Nothing Then

MsgBox "无结果数据,清除被禁止!", vbInformation, "提示"

Else

c.Range.Text = ""

c.Shading.BackgroundPatternColor = wdColorAutomatic

c.Shading.BackgroundPatternColor = wdColorBlue '重新将c单元格着色为蓝色,以便下面消息框显示后c单元格颜色暂留

MsgBox "清除计算结果单元格Cell(" & c.RowIndex & "," & c.ColumnIndex & ")的数据成功!", vbInformation, "提示"

c.Shading.BackgroundPatternColor = wdColorAutomatic '清除c单元格着色

Set c = Nothing '将定义的单元格变量对象重新恢复为空对象(即取消其指派的具体实例单元格)

End If

End Sub

Sub Calc(rg As String, c) '构造表格区域求和计算过程

Dim rg1 As String, rg2 As String, colstr As String, c1str As String, c2str As String

Dim r1 As Integer, c1 As Integer, r2 As Integer, c2 As Integer

colstr = "abcdefghijklmnopqrstuvwxyz" 'a--z单元格的列字符串,用于取出a--z中需要的列字符

If InStr(rg, "Cell") = 0 Or InStr(rg, ":") = 0 Or InStr(rg, ",") = 0 Then

MsgBox "error!"

Else

'rg计算数据区域范围字符串分解为前后纯的单元格的两个子字符串rg1、rg2

rg1 = Left(rg, InStr(rg, ":") - 1)

rg2 = Right(rg, Len(rg) - InStr(rg, ":"))

r1 = Val(Mid(rg1, InStr(rg1, "(") + 1, Len(rg1) - InStr(rg1, ",") - 1)) '拆解出计算区域首单元格的行号

c1 = Val(Mid(rg1, InStr(rg1, ",") + 1, InStr(rg1, ")") - InStr(rg1, ",") - 1)) '拆解出计算区域首单元格的列号

r2 = Val(Mid(rg2, InStr(rg2, "(") + 1, Len(rg2) - InStr(rg2, ",") - 1)) '拆解出计算区域尾单元格的行号

c2 = Val(Mid(rg2, InStr(rg2, ",") + 1, InStr(rg2, ")") - InStr(rg2, ",") - 1)) '拆解出计算区域尾单元格的列号

'通过列查找字符串,获取首尾单元格的“列”字符

c1str = Mid(colstr, c1, 1): c2str = Mid(colstr, c2, 1)

rg = c1str & r1 & ":" & c2str & r2 '重新生成的标准格式(形如A3:E8形式的范围)字符串赋予变量rg以覆盖原先的初始值

c.Formula "=sum(" & rg & ")" '单元格对象变量通过.Formula方法带参数形式运用公式进行计算

c.Shading.BackgroundPatternColor = wdColorBlue '将单元格c背景色填充为蓝色

End If

End Sub

三、测试设计的Word高级计算功能文档

(一)准备点击计算按钮:如下图

图3 准备开始计算

(二)在输入框输入计算结果单元格的行、列:如下图

图4 输入行列

(三)点确定即可看到显示计算的数据区域信息:如下图

图5 显示计算的数据区域信息

(四)点确定即刻生成计算结果数据:如下图

图6 生成计算的结果

(五)再次计算时输一个不符合规范的公式,会发现报错提示,并要求重新输入符合规范的公式:如下图

图7 不规范的公式输入报错

(六)点清除结果数据按钮准备开始结果数据:如下图

图8 准备开始清除数据

(七)点击清除数据按钮后,原来的计算结果数据即刻被清除,同时原先结果数据单元格的背景色由蓝色恢复到无填充色状态:如下图9、图10

图9 清除数据的提示

图10 清除数据的结果

(八)无结果数据情况下再次试图点击清除计算结果,发现操作被禁止:如下图

图11 无结果数据清除操作被禁止

四、设计技术亮点小结

(一)Word文档打开后的初始化工作探测有无上一次计算过的结果数据痕迹:我们是通过探测单元格颜色是否为蓝色的机制进行判别其为上次计算的残留结果数据。关键技术代码截图如下

图12 探测当前文档打开的上次残留的结果数据单元格

(二)进行计算结果单元格的定位数据输入的规范检查约束机制:充分利用是否还有逗号?是否取出的行、列数据值是否符合输入对话框标题栏提示的要求?是否输入内容为空?是否点击了取消或者关闭按钮取消操作?……等等。代码如下截图所示

图13 输入框输入数据规范学术检查

好了,本期分享就但此结束啦!希望大家对大家高级办公有所借鉴和帮助哦!也愿大家提出更好的解决方案哦!

最后,同样谢谢大家的关注(头条号:跟我学office高级办公)、推广和点评哦!祝大家工作生活、愉快!秋凉了,大家更要注意身体哦!拜拜啦!

举报
评论 0