首页 > 解决方案 > 如何在没有索引号或列字母的广泛硬编码的情况下引用 Excel 范围

问题描述

我是一个未经训练的业余程序员。我正在编写一些操作 Excel 电子表格的 vb.net 代码。为了使我的代码更易于维护,我不想像 Microsoft(等)示例所示的那样在所有地方硬编码单元格引用/列索引,如下所示:

.Cells(1,1)
.Range("A1")

我宁愿创建某种定义,我可以用它来做这样的事情:

.Cells(row, ExportedSalesSheet.PURCHASE_ORDER_COLUMN)

然后,如果独立系统生成的电子表格发生变化,我可以在一个地方更改值。

我尝试过使用带有公共常量的类(参见上面的示例),但这似乎变得非常难看,因为有时 com 对象似乎需要一个字符串,例如“A:A”、“A1”来引用列或单元格; 其他时候它需要一个索引号,其他时候它需要行和列索引号。

我想要一些易于准备的东西,也可以让我根据需要轻松返回索引或信件。也许是这样的?

ExportedSalesSheet.columns.purchase_order.index
ExportedSalesSheet.columns.purchase_order.letter
ExportedSalesSheet.cells.header_text.row.index
ExportedSalesSheet.cells.header_text.column.letter
ExportedSalesSheet.cells.header_text.column.index

我不知道如何创建这样的对象,也不知道这个概念是否遵循最佳实践。也许有更好的方法。

任何建议将不胜感激。

标签: vb.netexcel-interop

解决方案


该解决方案涉及使用“嵌套类”(在阅读此线程之前我不知道的东西,构建常量层次结构(访问 2020-11-18)

Public Class ExportedSalesSheet

    Class Columns

        Class Service
            Public Const Heading As String = "Description"
            Public Const Index As Integer = 5
            Public Const Letter As String = "E"
        End Class

        Class Comments
            Public Const Heading As String = "Comments"
            Public Const Index As Integer = 2
            Public Const Letter As String = "B"
        End Class

        Class Fee
            Public Const Heading As String = "Fee"
            Public Const Index As Integer = 7
            Public Const Letter As String = "G"
        End Class

    End Class

End Class

虽然不是我过去一直使用 DEFINED_CONSTANTS 的传统方式,但这种方法为您提供了 IntelliSense 的帮助,并保留了易于编码、易于阅读和易于更新原始数据的层次结构。这是一个例子

Dim serviceDescription As String = vbNullString & _
    .Cells(currentRow, ExportedSalesSheet.Columns.Service.Index).Value

推荐阅读