gpt4 book ai didi

vba - 如何将所有类硬编码值保存在一个地方

转载 作者:行者123 更新时间:2023-12-04 16:02:35 25 4
gpt4 key购买 nike

我在 VBA 中创建了一个类,我希望有一些与之关联的预设值。我是类新手,想知道在类对象中构建我的 VBA 代码的最佳(/好)方法是什么,以便我可以在键入时轻松访问这些默认值。答案最好是:

  • 在我认为实际硬编码值所需的行之外需要相对较少的额外代码行
  • IE。类似于额外的 Sub对于每个硬编码值都不理想
  • 这是为了防止我的类变得太杂乱
  • 请允许我以某种方式使用智能感知来访问这些硬编码值

  • 值得注意的是,我对这些硬编码值的主要用途是为我的类的变量设置默认值(通过循环 initialize 事件),但我可能还想在代码的其他部分访问它们

    我试过的:

    声明 Enum保存我的硬编码值
    'Declarations
    Private Enum startingVals
    Top = 10
    Column_Count = 4
    Left = 15
    ...
    End Enum
    Private topVal As Long 'variables which I assign default values to
    Private colCnt As Long
    Private leftVal As Long

    Private Sub Class_Initialize()
    topVal = startingVals.Top
    colCnt = startingVals.Column_Count
    'etc.
    End Sub

    这有两个限制;
  • 枚举只能存储 Long s
  • 通过使用 Const 的负载来解决此问题s 代替,但是你必须记住每个常量的名称,而且它在代码中看起来很困惑
  • 虽然我得到了 .Top 的 Intellisense和 .Column_Count ,我仍然需要完整输入startingVals
  • 这比必须记住所有硬编码的常量名称要好得多


  • 理想情况下,我可以做到这一点
    Private Sub Class_Initialize()
    With startingVals 'or Dim v As startingVals, With v
    topVal = .Top
    colCnt = .Column_Count
    'etc.
    End With
    End Sub

    但我不能

    另一种方法是使用函数来保存值,这样您就可以将不同的类型声明为 long。
    'Declarations
    Private Enum startingVals
    Top = 1
    Column_Count = 2
    Left = 3
    ...
    End Enum
    Private topVal As Long 'variables which I assign default values to
    Private colCnt As Long
    Private leftVal As Long

    Private Sub Class_Initialize()
    topVal = getval(Top)
    colCnt = getval(Column_Count)
    'etc.
    End Sub

    然后访问硬编码数据,你有一个函数,它接受一个枚举输入(允许智能感知)
    Private Function getval(dataType As startVals) As String
    Const savedData As String = "1,2,1.17171717,hey,me,you" 'save the return values for the index specified by dataType
    getval = Split(savedData, ",")(dataType) 'use datatype as a direct index of the array
    End Function

    或另一种保存值的方式
    Private Function getval(dataType As startVals) As String
    Const colV As Long = 10 'index 1
    Const topV As String = "This is the top" 'index 2
    '...
    If dataType = ColumnCount Then getval = colV 'use dataType to check what to return
    If dataType = Top Then getval = colV 'could use a select case too
    'etc
    End Function
  • 但无论哪种方式,除非我们输入函数名,否则我们仍然无法访问常量。
  • 此外,这种方法还需要我更新类声明部分的枚举声明和函数本身的 const 声明,从而使代码更难维护。

  • TL;博士

    将硬编码值保存在类对象中的最佳方法是什么,其中最佳定义为
  • 使用 VBA 智能感知(自动填充),因此我可以在键入
  • 时快速选择所需的值
  • 在我的类模块中整洁、独立和简洁,以避免困惑
  • 最好能保存任何类型(数据类型)的硬编码值(虽然我只在我目前正在进行的项目中使用 Long)
  • 无需每次输入初始化部分即可访问(例如 functionenum 名称)
  • 当然是 With block 或函数等效就可以了,因为它只需要指定枚举/数据集合名称的一个实例
  • 最佳答案

    ...to prevent my class from becoming too cluttered



    我会将该类与其初始化过程分开,添加另一个类让我们称之为 Initializer . Initializer 将知道如何初始化我的对象,将包含默认值并将使用此默认值填充我的对象。但是在初始化器中你必须写赋值,没有神奇的智能感知,而只是简单地写 m_并从列表中选择。高温高压

    Class Foo


    Option Explicit

    'variables which I assign default values to
    Private m_topVal As Long
    Private m_colCnt As Long
    'Private m_leftVal As Long

    Private Sub Class_Initialize()
    Dim initializer As FooInitializer
    Set initializer = New FooInitializer
    initializer.Initialize Me
    End Sub

    Public Property Get TopVal() As Long
    TopVal = m_topVal
    End Property

    Public Property Let TopVal(ByVal vNewValue As Long)
    m_topVal = vNewValue
    End Property

    Public Property Get ColCnt() As Long
    ColCnt = m_colCnt
    End Property

    Public Property Let ColCnt(ByVal vNewValue As Long)
    m_colCnt = vNewValue
    End Property

    ' Add Get/Let(Set) for other member variables as well

    Class FooInitializer


    Option Explicit

    ' Default startingVals values
    Private m_topValDefault As Integer
    Private m_columnCountDefault As Integer
    'etc.

    Public Sub Initialize(ByRef fooInstance As Foo)
    fooInstance.TopVal = m_topValDefault
    fooInstance.ColCnt = m_columnCountDefault
    'etc.
    End Sub

    Private Sub Class_Initialize()
    m_topValDefault = 10
    m_columnCountDefault = 4
    'etc.
    End Sub

    Standard module


    Option Explicit

    Sub test()
    Dim f As Foo
    Set f = New Foo
    ' f is now initizlized via initializer with default values
    Debug.Print f.TopVal
    Debug.Print f.ColCnt
    End Sub

    关于vba - 如何将所有类硬编码值保存在一个地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45423018/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com