首页 > 解决方案 > VBA Excel 类模块成员未填充字符串

问题描述

我创建了Class Module一个成员不持有/填充所需的字符串。其他成员都还好,就这一个。在Class Module我把它分成两部分,因此不能按预期工作的部分是ArgeementDetails-RebateDescription

当我通过代码时,我可以确认分配字符串/文本的行:RebateDescription = WantedText是正确的并且通过了。分配给Class Module:TT.AgreementConditions RebateDescription, ValidFrom, ValidTo我有一个break, 当我将光标悬停在RebateDescription那里时,显示的文本是预期的,但是当我Debug.Print TT.RebateDescription进入文本显示“”并且在即时窗口中没有打印任何内容。

解决这个问题的任何帮助都会很棒。

**请注意** 我Private TT As clsAgreementDetailsModule级别声明,因为我在多个Subs.

课程模块

Option Explicit

Private Type TAgreement
    ConditionName As String
    ConditionPricingDate As String
    ConditionRate As String
    RateUnit As String
    AgreementNo As String
    
    RebateDescription As String
    ValidFrom As String
    ValidTo As String
End Type

Private This As TAgreement

Public Property Get ConditionName() As String
  ConditionName = This.ConditionName
End Property

Public Property Get ConditionPricingDate() As String
  ConditionPricingDate = This.ConditionPricingDate
End Property

Public Property Get ConditionRate() As String
  ConditionRate = This.ConditionRate
End Property

Public Property Get RateUnit() As String
  RateUnit = This.RateUnit
End Property

Public Property Get AgreementNo() As String
  AgreementNo = This.AgreementNo
End Property

Public Sub HeaderConditions( _
    ConditionName As String, _
    ConditionPricingDate As String, _
    ConditionRate As String, _
    RateUnit As String, _
    AgreementNo As String _
)
  If Len(This.ConditionName) = 0 Then
    This.ConditionName = ConditionName
    This.ConditionPricingDate = ConditionPricingDate
    This.ConditionRate = ConditionRate
    This.RateUnit = RateUnit
    This.AgreementNo = AgreementNo
  End If
End Sub

Public Property Get RebateDescription() As String
  RebateDescription = This.RebateDescription
End Property

Public Property Get ValidFrom() As String
  ValidFrom = This.ValidFrom
End Property

Public Property Get ValidTo() As String
  ValidTo = This.ValidTo
End Property

Public Sub AgreementConditions( _
    RebateRecipeint As String, _
    ValidFrom As String, _
    ValidTo As String _
)
  If Len(This.RebateDescription) = 0 Then
    This.RebateDescription = RebateDescription
    This.ValidFrom = ValidFrom
    This.ValidTo = ValidTo
  End If
End Sub

主副

Public Sub VF03_Process()

<snip code> 
            
            Do
            <snip code> 
                            
                            ' Create new class ready to fill with data.
                            Set TT = New clsAgreementDetails

            <snip code> 
                            
                            FillAgreementConditions
            
            <snip code>                            
            Loop

End Sub

SUB TO 填充类模块

Private Sub FillAgreementConditions()

    Do
        Dim ColNum As Long
        ColNum = ColNum + 1
        
        On Error Resume Next
        Dim TestText As String
        TestText = SAPSes.findById("wnd[1]/usr/lbl[" & ColNum & ",1]").Text
        Dim WantedText As String
        WantedText = SAPSes.findById("wnd[1]/usr/lbl[" & ColNum & ",3]").Text
        
        ' Only update values if they are found.
        If Err.Number = 0 Then
            Select Case TestText
                Case "Description of agreement"
                    Dim RebateDescription As String
                    RebateDescription = WantedText
Debug.Print "Added Desc: "; RebateDescription
                Case "Valid From"
                    Dim ValidFrom As String
                    ValidFrom = WantedText
Debug.Print "Added From: "; ValidFrom
                Case "Valid to"
                    Dim ValidTo As String
                    ValidTo = WantedText
Debug.Print "Added To: "; ValidTo
                    ' Once found Valid To, last item to find, exit loop.
                    Exit Do
            End Select
        End If
        On Error GoTo 0
    Loop Until ColNum = 1000
    
    TT.AgreementConditions RebateDescription, ValidFrom, ValidTo
    
' Test if results are expected
Debug.Print TT.RebateDescription
Debug.Print TT.ValidFrom
Debug.Print TT.ValidTo

End Sub

标签: excelvba

解决方案


在 Sub AgreementConditions 中,您没有使用 RebateRecipeint 参数。您只需将 This.RebateDescription 设置为自身。你要:

This.RebateDescription = RebateRecipeint

小心On Error Resume Next。你的大部分循环都在它的魔咒之下。通常,您会On Error Goto 0在尝试获取字符串后尽快放入,并Err.Number <> 0在之前检查,将结果保存在布尔变量中。


推荐阅读