메서드 체인을 사용할 수 있는 String 클래스 만들기

10632 단어 VBAExcel

메서드 체인을 사용할 수 있는 String 클래스 만들기



경위



VBA의 쇼보 점으로서, String 형으로 메소드 체인을 사용할 수 없는 점이 있다.
메소드 체인이라고 하는 것은 xxx.Trim.SubString(0,1) 와 같이 메소드를 계속해 사용할 수 있는 기능.
메소드 체인으로 하기 위해서는, 클래스를 반환하는 메소드를 만들면 좋지만, String형도 동시에 돌려주고 싶다. 그런 불가능? 라고 생각되었지만, 시행착오해 보았는데, 실용이 되는 레벨이 되었으므로 하는 방법을 소개한다.

사용성은 다음과 같다. 메소드를 얼마든지 연결하여 사용할 수 있고, 메소드의 반환값을 String형과 동등의 동작으로 할 수 있다.
Sub StringEx_Sample()

    Dim s As IString
    Set s = New StringEx

    '普通にStringっぽく使える
    s = "abcdefg  "
    Debug.Print s
    Debug.Print s & "desu"

    'Java/C# のようなメソッドチェーンも使える
    Debug.Print s.SubString(2, 4)
    Debug.Print s.SubString(2, 4).Length

    Debug.Print s.Length
    Debug.Print s.Trim.Length

End Sub

-----------------------
abcdefg  
abcdefg  desu
cd
 2 
 9 
 7 

소스 입력시 인텔리센스도 물론 사용할 수 있다.


소스 해설



할 일.

· String 형을 돌려주는 메소드는 IString 인터페이스를 돌려주도록 한다.
→이것으로 메소드 체인을 실현한다.

・IString 인터페이스에 String형의 규정의 프롭퍼티를 작성해, 메소드를 생략했을 경우, String형을 돌려주도록 한다.
→ 클래스이면서, String 형으로서도 취급할 수 있게 된다.

IString 인터페이스



인터페이스를 사용하지 않아도 만들 수 있지만, 좋아하기 때문에.

캐릭터 라인을 보관 유지하는 프로퍼티 「Value」를 정의한다.
Value 속성을 지정된 속성으로 설정하면 선택 사항입니다.

지정된 속성을 만들려면 다음 단계가 필요합니다.
  • 클래스를 내보냅니다.
  • 에디터 등으로 클래스를 편집해, 프로퍼티 프로시저(Let나 Get의 어느 쪽인가 하나) 중에 「Attribute Item.VB_UserMemId = 0」을 추가한다.
  • VBE에서 다시 가져오기.

  • 이것은 인터페이스 측에 지정해 두면, Impliments한 쪽에서도 유효하게 된다.
    인터페이스를 사용하지 않는 경우는, StringEx 측의 Value property에 상기의 설정을 실시해 주세요.
    Option Explicit
    
    Public Function SubString(ByVal starts As Long, Optional ByVal ends As Long = -1) As IString
    End Function
    Public Property Get Value() As String
        'Attribute Item.VB_UserMemId = 0
    End Property
    Public Property Let Value(v As String)
    End Property
    Public Property Get Length() As Long
    End Property
    Public Function Trim() As IString
    End Function
    

    StringEx 클래스



    메소드 체인으로 하고 싶은 경우, 편집한 결과를 NewInstance 메소드로 새로운 인스턴스의 StringEx 클래스를 돌려주도록 한다. (SubString 메서드, Trim 메서드 참조)

    이 클래스를 폼과 같이 정적 클래스(규정의 인스턴스)로 사용할 수 있도록 한다.
    절차는 다음과 같습니다.
  • 클래스를 내보냅니다.
  • 소스의 속성 「Attribute VB_PredeclaredId = False」를 에디터 등으로 「True」로 재기록한다.
  • VBE에서 다시 가져오기.

  • StringEx.NewInstance() 라는 생성자를 사용할 수 있게 된다.
    Option Explicit
    
    Implements IString
    Private mBuf As String
    
    Public Function NewInstance(ByVal s As String) As IString
    
        Set NewInstance = New StringEx
        NewInstance.Value = s
    
    End Function
    
    Private Property Get IString_Length() As Long
        IString_Length = Len(mBuf)
    End Property
    
    Private Function IString_SubString(ByVal starts As Long, Optional ByVal ends As Long = -1) As IString
        If ends = -1 Then
            Set IString_SubString = Me.NewInstance(Mid$(mBuf, starts + 1))
        Else
            Set IString_SubString = Me.NewInstance(Mid$(mBuf, starts + 1, ends - starts))
        End If
    End Function
    
    Private Function IString_Trim() As IString
        Set IString_Trim = Me.NewInstance(Trim(mBuf))
    End Function
    
    Private Property Let IString_Value(RHS As String)
        mBuf = RHS
    End Property
    Private Property Get IString_Value() As String
        IString_Value = mBuf
    End Property
    
    

    스스로 만든 라이브러리의 String 형의 반환값을 이 예를 바탕으로 IString 인터페이스를 되돌리면 편리하게 사용할 수 있다고 생각한다.

    무료 소프트웨어를 만들고 있습니다.
    엑셀을 편리하게 하는 250이상의 기능을 체계화한 애드인은 이쪽입니다.
    「RelaxTools Addin」창의 모 대상 대상 수상 소프트
    h tp : // 그 f라고. 오 s 어라. 네 t / re x와 ls /

    좋은 웹페이지 즐겨찾기