通过构造进行 VBA 继承的后续操作,构造函数不起作用?

2024-02-11

这是后续this https://stackoverflow.com/questions/42235854/vba-inheritance-via-construction-constructor-not-working/42236148?noredirect=1#comment71669258_42236148问题。

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

活动图 https://i.stack.imgur.com/k8CTc.png

这是我的草稿类图:

类图 https://i.stack.imgur.com/3z596.png

我的目标是让 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 中做这样的事情是不是很疯狂?


想使用面向对象语言并不疯狂 VBA 的功能,但您给出的用例不是 与优秀的内置对象相去甚远 已经提供了,所以不清楚你会提供多少 从您为获得它而增加的复杂性中获益。有 在 excel vba 中可以利用相当多的功能,但它是 尽可能发挥其优势。

您可以轻松地为不同的单元格着色 有效率的 通过使用本文末尾的代码 - 显然不这样做 所有你想要的,但显然不需要的东西 对单列和行采用面向对象。

Excel和vba与程序员有很大不同 习惯于来自像 python 这样的东西,提供完整的 类继承。使用 VBA,您只能拥有 接口继承将允许您重用代码。但 如果你不小心,你很容易就会得到很多 的存根代码,您必须从一个类复制到另一个类才能 能够满足您希望您的类实现的接口。

还有一件事你一定要包起来 从传统的面向对象语言开始,这就是多少 您在内存对象中复制的数据,而不是仅仅保留 工作表并根据需要访问它们。有一种自然的 倾向于将所有内容加载到对象中并进行操作 从那里开始 - 但这是一种你应该三思而后行的冲动 在这种环境下。

如果您有一个现有的服务器后端来验证 至少在工作表和数据库之间移动的数据 您有一种方法可以隔离正常的 MVC 问题。实际上你会 使用 Excel 作为一种具有附加功能的网页 电子表格用户喜爱的。如果你没有后端那么你 在验证你的模型和数据时确实必须非常小心 环境。你应该得到 习惯于保护工作表(除了那些单元格) 用户必须输入数据(假设您正在编写代码 使他人受益而不仅仅是自己)。事实上这是一个很好的 用不同的颜色为输入单元格和计算单元格着色的想法 颜色来突出这种差异。后者应该受到保护 而前者在需要时可以触发验证事件 输入并更新模型状态(并且最好与后端一起使用,如果 你有一个)。

保护单元格还允许您隐藏状态信息 工作表中定义明确的部分可用于参考 回到工作对象。事实上,好的用例是那些 将明确定义的单元块分隔为特定的用户界面 类实例。

如果可能,您应该使用范围来引用相关部分 相同的工作表和其他工作表。命名范围是你的朋友。数据 经过验证的列表对于连续数据也非常有帮助,应该 尽可能使用它们,因为它们的工作效率很高。为了 对于大小有限的非连续数据集,您可以使用 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过构造进行 VBA 继承的后续操作,构造函数不起作用? 的相关文章

  • Excel VBA - 如何逐行读取csv文件而不是整个文件

    这是我需要读取的 csv 文件内容 header header header header header header value value value value value value value value value 我在网上找到
  • 将包含换行符的文本文件导入到 Excel 中

    我有一个纯文本文件 如下所示 some text containing line breaks 我正在尝试说话excel 2004 Mac v 11 5 正确打开此文件 我希望只看到一个单元格 A1 包含上述所有内容 不带引号 但可惜的是
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 标准 VBA 函数“找不到项目或库”

    因此 我必须在我的 PC 上运行别人的 Excel 应用程序 并且在标准函数 如日期 格式 十六进制 中间等 上收到 找不到项目或库 的信息 一些研究表明 如果我在这些函数前加上 VBA 前缀 如 VBA Date 中那样 它会正常工作 网
  • 使用 VBA 通过简单命令从非连续范围的并集获取值到数组中(无循环)

    我有以下任务 表面上很简单 使用 VBA 将电子表格上多个列的值复制到二维数组中 为了让生活更有趣 这些柱子并不相邻 但它们的长度都相同 显然 可以通过依次循环每个元素来做到这一点 但这看起来非常不优雅 我希望有一个更紧凑的解决方案 但我很
  • AppDelegate 的变量用作全局变量不起作用

    我想使用我的 AppDelegate 来存储任何其他类都可以访问的对象 我已经像这样声明了这个 AppDelegate interface MyAppDelegate UIResponder
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • VBA XML V6.0 如何让它等待页面加载?

    我一直在努力寻找答案 但似乎找不到任何有用的东西 基本上 我是从一个网站上拉取的 当您在该页面上时 该网站会加载更多项目 我希望我的代码在加载完成后提取最终数据 但不知道如何让 XML httprequest 等待 Edited Sub p
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • 为什么 __instancecheck__ 没有被调用?

    我有以下 python3 代码 class BaseTypeClass type def new cls name bases namespace kwd result type new cls name bases namespace p
  • laravel中过滤后如何导出excel?

    我想仅导出视图刀片中过滤的数据 我正在使用 Laravel 7 和 maatwebsite excel 3 1 和 PHP 7 4 2 我浏览了文档并应用了这个 View a href class btn btn success i cla
  • 一个类应该验证自身还是创建另一个类来验证它?

    假设我有一堂课 class NavigationData float roll float pitch double latitude double longitude 如果我想创建一个方法 const bool validate cons
  • 使用 jQuery 更改 CSS 类属性

    有没有办法使用 jQuery 更改 CSS 类的属性 而不是元素属性 这是一个实际的例子 我有一个 div 类red red background red 我想转班级red背景属性 而不是具有类的元素red分配的背景 如果我用 jQuery
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • 内联函数以及类和头文件

    头文件中定义的任何函数都会自动内联吗 如果我在类中声明一个函数并使用关键字 inline 在外部给出定义 那么这个函数会是内联的吗 如果是 为什么这不违反内联函数应在声明时赋予主体的法律 类定义中定义的任何函数都是内联的 任何标记的功能in
  • 使用 Apache POI Excel 写入特定单元格位置

    如果我有一个未排序的参数 x y z 列表 是否有一种简单的方法将它们写入使用 POI 创建的 Excel 文档中的特定单元格 就好像前两个参数是 X 和Y 坐标 例如 我有如下行 10 4 100 是否可以在第 10 行第 4 列的单元格
  • 在Google电子表格中划分整列

    我是 Google 电子表格的一个相对较新的用户 我希望 B 列中的每个单元格都是 A 列 同一行 中内容除以 5 的结果 B1 B2 B3 等 商 应为 A1 A2 A3 等 被除数 除以 5 除数 在示例中 B1 A1 5 我知道一项一
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo

随机推荐