gpt4 book ai didi

excel - 多个类属性的错误处理

转载 作者:行者123 更新时间:2023-12-04 08:01:39 25 4
gpt4 key购买 nike

我有一个将数据保存在单独属性中的类(我选择了这种设计而不是数组或 scripting.dictionary,因为我将使用这些数据来构建决策树,并且我想在构建决策树时使用 IntelliType。 )。
数据以浮点数的形式从 excel 电子表格中加载,因此我将它们存储在 long 数据类型中,但有时会发生这种情况,因此缺少值并被“NA”字符串替换。
我想创建一个错误处理例程,如果遇到非数字值,它将用值 -1 替换内容。
我知道我可以通过检查 IsNumeric() 或错误处理来做到这一点,但我不知道如何使它适用于类所拥有的众多属性中的每一个,而且我真的不喜欢编写一个解决方案它们中的每一个都有特定的错误处理代码(将它们中的每一个存储在一个单独的属性中也不优雅,但我发现这是我愿意为决策树中更短语法的优势而付出的代价)。
有没有办法通过独立于变量名的错误处理代码将值传递给刚刚遇到类型不匹配错误的变量?
一个包含几个属性的简单示例:

Option Explicit
Dim B_LYM As Long
Dim B_mem As Long
Dim B_CXCR3 As Long
Dim B_CXCR4_MFI As Long

Public Sub SetData(data as Range)
On Error Goto err_handler

B_LYM = data.Cells(1, 1)
B_mem = data.Cells(1, 2)
B_CXCR3 = data.Cells(1, 3)
B_CXCR4_MFI = data.Cells(1, 4)

err_handler:
'I need something like this:
'if valuebeingstored = "NA" then targetvariable = -1
End Sub
可能是其他一些方法可能更好,我很乐意接受选择,我只想强调我真的很想在构建决策树时使用 IntelliType。我正在考虑使用 scripting.dictionary,但语法会很快使代码膨胀。

最佳答案

你说你有一个Class因此可以包含检查输入并在类中返回 -1 并使用 Get 的函数和 Let调用函数的属性。
这是一个示例类(名为 clsDataStuff )展示了这一点:

Option Explicit

Private c_B_LYM As Double
Private c_B_mem As Double
Private c_B_CXCR3 As Double
Private c_B_CXCR4_MFI As Double

Public Property Let B_LYM(varValue As Variant)
c_B_LYM = ParseDouble(varValue)
End Property
Public Property Get B_LYM()
B_LYM = c_B_LYM
End Property

Public Property Let B_mem(varValue As Variant)
c_B_mem = ParseDouble(varValue)
End Property
Public Property Get B_mem()
B_mem = c_B_mem
End Property

Public Property Let B_CXCR3(varValue As Variant)
c_B_CXCR3 = ParseDouble(varValue)
End Property
Public Property Get B_CXCR3()
B_CXCR3 = c_B_CXCR3
End Property

Public Property Let B_CXCR4_MFI(varValue As Variant)
c_B_CXCR4_MFI = ParseDouble(varValue)
End Property
Public Property Get B_CXCR4_MFI()
B_CXCR4_MFI = c_B_CXCR4_MFI
End Property

Private Function ParseDouble(varValue As Variant) As Double
If IsNumeric(varValue) Then
ParseDouble = CDbl(varValue)
Else
ParseDouble = -1
End If
End Function
注意到:
  • Let属性预计 Variant因为你说你的输入可能是一个数字,或者一个字符串
  • Get属性(property)返回 Double正如你所说,你的输入是浮点数,所以 Double 优于Long
  • ParseDouble函数只检查数字输入并返回 -1 否则

  • 然后,在您的模块代码中:
    Option Explicit

    Dim B_LYM As Long
    Dim B_mem As Long
    Dim B_CXCR3 As Long
    Dim B_CXCR4_MFI As Long

    Public Sub Test()

    Dim objDataStuff As clsDataStuff

    Set objDataStuff = New clsDataStuff

    objDataStuff.B_LYM = 1 'data.Cells(1, 1)
    objDataStuff.B_mem = 2 'data.Cells(1, 2)
    objDataStuff.B_CXCR3 = "a" 'data.Cells(1, 3)
    objDataStuff.B_CXCR4_MFI = True 'data.Cells(1, 4)

    Debug.Print objDataStuff.B_LYM
    Debug.Print objDataStuff.B_mem
    Debug.Print objDataStuff.B_CXCR3
    Debug.Print objDataStuff.B_CXCR4_MFI

    End Sub
    返回以下输出:
     1 
    2
    -1
    -1
    Intellisense 可用,您可以验证输入:
    enter image description here
    编辑 - 关于动态设置目标变量的评论。
    你的类(class)可以是:
    Option Explicit

    Public B_LYM As Double
    Public B_mem As Double
    Public B_CXCR3 As Double
    Public B_CXCR4_MFI As Double

    Public Sub SetVar(ByVal strVarName As String, ByVal varValue As Variant)
    Dim dblValue As Double
    Dim strToEval As String

    If Not MemberExists(strVarName) Then Exit Sub

    dblValue = ParseDouble(varValue) ' do the parse
    CallByName Me, strVarName, VbLet, dblValue ' dynamically assign the value

    End Sub

    Private Function ParseDouble(varValue As Variant) As Double
    If IsNumeric(varValue) Then
    ParseDouble = CDbl(varValue)
    Else
    ParseDouble = -1
    End If
    End Function

    Private Function MemberExists(strVarName) As Boolean
    Dim blnTest As Boolean
    Dim varValue As Variant

    On Error GoTo ErrHandler

    varValue = CallByName(Me, strVarName, VbGet)
    blnTest = True
    GoTo ExitFunction

    ErrHandler:
    blnTest = False
    ExitFunction:
    MemberExists = blnTest

    End Function
    在哪里:
  • 所有变量都是Public你仍然可以获得 Intellisense,但要避免所有重复的 LetGet代码
  • SetVar方法使用 CallByName 动态设置目标变量

  • 两个问题:
  • 你需要笨重的 MemberExists防止SetVar的功能尝试为不存在的成员分配值 - 否则会产生错误(438),但也许这是您逻辑中需要的东西?
  • 您仍然可以使用例如为目标变量赋值objDataStuff.B_CXR3 = "foo"这也会对数字以外的任何内容产生错误。

  • 示例代码显示了以下问题。但坚持 SetVar方法将产生与上述相同的输出。
    Option Explicit

    Dim B_LYM As Long
    Dim B_mem As Long
    Dim B_CXCR3 As Long
    Dim B_CXCR4_MFI As Long

    Public Sub Test()

    Dim objDataStuff As clsDataStuff

    Set objDataStuff = New clsDataStuff

    objDataStuff.SetVar "B_LYM", 1
    objDataStuff.SetVar "B_mem", 2
    objDataStuff.SetVar "B_CXCR3", -1
    objDataStuff.SetVar "B_CXCR4_MFI", True
    objDataStuff.SetVar "foobar", 999
    ' working around SetVar here generates an error
    objDataStuff.B_CXCR3 = "bad"

    Debug.Print objDataStuff.B_LYM
    Debug.Print objDataStuff.B_mem
    Debug.Print objDataStuff.B_CXCR3
    Debug.Print objDataStuff.B_CXCR4_MFI

    End Sub

    关于excel - 多个类属性的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66438193/

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