后续的VBAinheritance通过build设,构造不工作?

这是这个问题的后续。

这里是我的用例:我想比较两个Excel文件逐个单元格,并突出显示不同的单元格。 每个文件将有几张纸,每张纸都有几列,每一列都有一个标题和几个值(如典型值)。 以下是比较代码的草稿活动图:

活动图

这是我的草图类图:

类图

我的目标是让VBA对于我经常使用的types(比如电子表格的新旧版本)来说不那么麻烦。 也就是说,我希望它能像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中尝试这样做是疯狂的吗?

想要使用VBA的面向对象的语言function并不是疯狂的,但是你所提供的用例与已经提供的内置对象相差甚远,所以你不清楚从复杂性中获得收益。 在excel vba中有相当多的权力可以利用,但最好是尽可能地发挥它的优势。

你可以通过使用这个post末尾的代码来更加有效地着色不同的单元格 – 显然不是你想做的所有事情,而是显然不需要诉诸单个行和列的OO。

Excel和VBA与程序员习惯来自像Python这样的提供完整的类inheritance的程序员完全不同。 有了VBA,你只能继续使用接口inheritance,这将允许你重用代码。 但是如果你不小心的话,你可能会很容易地得到很多必须从类复制到类的存根代码,以便能够满足你希望你的类实现的接口。

另外还有一件事你必须用传统的面向对象的语言来包装你的头,这就是你在内存对象中复制多less数据,而不是只留在工作表上并根据需要进行访问。 有一种自然的倾向,希望把所有东西都加载到一个对象中,并从那里操纵 – 但这是一个你在这个环境中应该三思而后行的冲动。

如果你有一个现有的服务器后端将validation工作表和数据库之间移动的数据,那么至less你有一种方法来分离正常的MVC问题。 实际上,您将使用Excel作为一种网页,并具有电子表格用户喜欢的附加function。 如果你没有后端,那么在这个环境中validation你的模型和数据是非常小心的。 您应该习惯保护工作表的想法,除了那些用户必须input数据的单元格(假设您正在编写代码以使其他人受益)。 实际上,将input单元格和计算的单元格用不同的颜色着色以突出显示这种差异是一个好主意。 后者应该受到保护,而前者在需要时可以触发事件来validationinput并更新模型状态(最好在后端工作,如果有的话)。

保护单元还允许您隐藏工作表中可以用于引用回工作对象的定义良好的部分的状态信息。 事实上,好的用例就是那些把定义良好的单元块作为用户界面分离到特定的类实例的单元块。

在可能的情况下,应该使用范围来引用同一工作表上的部分和其他部分。 命名的范围是你的朋友在这里。 数据validation列表对于连续的数据也是非常有用的,应该尽可能地使用它们,因为它们在做什么时非常有效。 对于大小有限的非连续数据集,可以使用ActiveXcombobox,这些combobox可以引用内存中对象实例,前提是它们的事件处理程序传递了唯一的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