这是对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中做这样的事情是不是很疯狂?
答案 0 :(得分:1)
想要使用面向对象的语言并不疯狂 VBA的功能,但你给出的用例不是 远离擅长的内置对象 已经提供,所以不清楚你会有多少 从你将要添加的复杂性中获益。有 在excel vba中可以利用相当多的权力,但事实如此 尽可能地发挥它的优势。
您可以更轻松地为不同的细胞着色 有效率的 通过使用本文末尾的代码 - 显然不是这样做的 所有你想要但显然不需要的东西 单个列和行使用OO。
Excel和vba与程序员完全不同 曾经来自像python这样提供完整的东西 类继承。对于VBA,你只能坚持下去 接口继承,它允许您重用代码。但 如果你不小心你很容易就会结束很多 您必须从类复制到类的存根代码 能够满足您希望类实现的接口。
还有另一件事你必须包装你的 来自传统的OO语言,这是多少 您在内存中对象中复制的数据,而不是仅仅是离开 工作表并根据需要访问它们。这很自然 希望将所有内容加载到对象中并进行操作的趋势 从那里 - 但是你应该三思而后行 在这种环境中。
如果您有现有的服务器后端将验证 至少在工作表和数据库之间移动的数据 你有办法隔离正常的MVC问题。实际上你是 使用excel作为一种具有附加功能的网页 那个电子表格的用户喜欢。如果你没有后端那么你 我必须非常小心地验证你的模型和数据 环境。你应该得到 习惯了保护工作表的想法,除了那些单元格 用户必须输入数据(假设您正在编写代码) 让别人受益而不仅仅是你自己)。事实上,这是一个很好的 想法为输入单元格和计算单元格着色 颜色突出这种差异。后者应该受到保护 而前者在需要时可以触发将验证的事件 输入并更新模型状态(理想情况下使用后端if 你有一个。)
保护单元格还允许您隐藏状态信息 工作表中明确定义的部分,可用于引用 回到工作对象。事实上,良好的用例就是那些 将明确定义的单元块隔离为特定的用户界面 类实例。
在可能的情况下,您应该使用范围来引用部分 相同的工作表和其他工作表。命名范围是你的朋友。数据 经过验证的列表对于连续数据也非常有用 尽可能使用它们,因为它们非常有效。对于 大小有限的非连续数据集,可以使用ActiveX 组合框,如果它们可以引用内存中的对象实例 事件处理程序传递给后者唯一的id。
检查事件更改时,应注意Worksheet_Change 轮询你会在网上看到很多例子。这个可以 如果你不小心的话,请多花一点时间。
总结一下:使用excel和你可以利用的任何力量 不要重新发明车轮。
' Compares the sheet 1 of the workbook you're in
' with sheet1 of the workbook file in 'Filename'
' and colors the cells that differ between the two.
Sub compare_workbooks_sheet1()
Dim Filename As String
Filename = "C:\MyBook.xlsm"
Dim wrkbk1 As Workbook
Set wrkbk1 = Workbooks.Open(Filename:=Filename)
Dim sht1 As Worksheet ' worksheet you're in
Dim sht2 As Worksheet ' worksheet you've opened to compare
Set sht1 = wrkbk1.Worksheets("Sheet1")
Set sht2 = ThisWorkbook.Worksheets("Sheet1")
Dim row As Long, col As Long
With sht2
For row = 1 To sht1.UsedRange.Rows.Count
For col = 1 To sht1.UsedRange.Columns.Count
If sht1.Cells(row, col) <> sht2.Cells(row, col) Then
.Cells(row, col).Interior.ColorIndex = 5
End If
Next
Next
End With
wrkbk1.Close
End Sub