【发布时间】:2017-02-16 02:29:00
【问题描述】:
这是this问题的后续。
这是我的用例:我想逐个单元格比较两个 Excel 文件并突出显示不同的单元格。每个文件将有几张纸,每张纸将有几列,每列都有一个标题和一些值(通常)。这是我的比较代码的草稿活动图:
这是我的草稿类图:
我的目标是让 VBA 对于我经常做的事情(例如比较新旧版本的电子表格)变得不那么繁琐。也就是说,我希望它更像 Python 一样工作......特别是,我想编写这样的代码:
For Each Sheet1 In File1
Name1 = Sheet1.Name
If File2.sheet_dict.Exists(Name1) Then
Sheet2 = File1.Sheets(File2.sheet_dict(Name1))
Sheet2.Checked = True
For Each Col1 In Sheet1.cols
hdr = Col1.Header
If Sheet2.header_dict.Exists(hdr) Then
Col2 = Sheet2.cols(Sheet2.header_dict(hdr))
Col2.Checked = True
For Each Val1 In Col1.Vals
Val2 = Col2.Vals(Val1.row_number)
Val2.Checked = True
If Not Val1.Match(Val2) Then
Val1.formatBad()
Val2.formatBad()
End If
Next Val1
For Each Val2 In Col2.Vals
If Not Val2.Checked Then
Val2.formatBad
End If
Next Val2
Else
Col1.formatBad()
End If
Next Col1
For Each Col2 In File2.cols
If Not Col2.Checked Then
Col2.formatBad
End If
Next Col2
Else
Sheet1.formatBad()
End If
Next Sheet1
For Each Sheet2 In File2
If Not Sheet2.Checked Then
Sheet2.formatBad()
End If
Next Sheet2
当然,我会先将所有数据加载到对象中,但你明白了。尝试在 VBA 中做这样的事情是不是很疯狂?
【问题讨论】:
-
再次嗨 :)。在我看来,您以某种方式以自己的方式重写 Excel 的 COM 类模型,这还不够合理。如果您想简化或添加一些模型中没有充分存在的操作,例如
Sheet_Exists(..), Header_Exists(..)等,我会用我自己的额外例程集来丰富模型,但不重写类模型。 -
你知道Excel的COM类模型的好图吗?我试图避免必须使用通常用于迭代一个范围内的单元格的复杂方式(对我来说,通常是在列上,然后在列中的值上)。我永远不记得如何获得一列中的最后一行、一行中的最后一列等。我已经为这些编写了函数,但这太不直观了。我认为将该代码包装在一个类中会简化该过程。我做错了吗?
-
对于你问题的另一部分,是的,我认为你走错了路。将您自己的例程包装在实用程序类中很好,但是包装和封装 Excel 对象模型的全部或大部分是不合理的IMO。
-
仅供参考 - Excel 2016(至少我使用的两个版本)带有“电子表格比较”工具。