2016-05-20 20 views
3

基本的に、パラメータの1つが標高である地理空間条件文を記述するクラスを作成しようとしています。 AltitudeにはMin、Max、Units、Invertの4つのプロパティがあり、クラスを2層のプロパティにするようにしています。プロパティを持つプロパティを持つVBAクラス

私が探しているが、私はそれを実装する方法を考え出す苦労を抱えている効果であるIE

Dim blah as qClass 
Set blah = New qClass 

blah.Altitude.Min = 100 

。 (普通のVBA経験ですが、クラスに入るのは初めてです)

マイ・ソリューション: 各パラメータに使用するMin/Max/Unit/Invertの引数を持つ汎用クラスを作成しました。一度再使用されます。

設定クラス

Private pMin As Integer 
Private pMax As Integer 
Private pUnit As String 
Private pInvert As Boolean 

Public Property Get Min() As Integer 
    Min = pMin 
End Property 

Public Property Get Max() As Integer 
    Max = pMax 
End Property 

Public Property Get Unit() As String 
    Unit = pUnit 
End Property 

Public Property Get Invert() As Boolean 
    Invert = pInvert 
End Property 

Public Property Let Min(Value As Integer) 
    pMin = Value 
End Property 

Public Property Let Max(Value As Integer) 
    pMax = Value 
End Property 

Public Property Let Unit(Value As String) 
    pUnit = Value 
End Property 

Public Property Let Invert(Value As Boolean) 
    pInvert = Value 
End Property 

親クラスの設定あなたがこれを行うにしたい場合は

'CPA Range Property 
Public Property Get CPARange() As cSettings 
    If pCPARange Is Nothing Then Set pCPARange = New cSettings 
    Set CPARange = pCPARange 
End Property 
Public Property Set CPARange(Value As cSettings) 
    Set pCPARange = Value 
End Property 
+1

のクラスの(http://www.cpearson.com/excel/Classes.aspx)[これは優れたチュートリアルです]。両方のクラスを作成してからメインクラス(サンプルのqClass)でサブクラス(例の高度)をインスタンス化するだけです。 – Tim

答えて

1

を使用します。

Public Sub Test() 
    Dim a As New aClass 
    a.InitializeFromValues 40, 150 

    Dim q As New qClass 
    q.Altitude = a 
    ' q.Altitude.Min = 40 
    ' q.Altitude.Max = 150 

    Dim z As New qClass 
    z.Altitude.Max = 100 
    ' z.Altitude.Min = 0 (default) 
    ' z.Altitude.Max = 100 
End Sub 

あなたは2つのクラスを必要とします。私はそれらをqClassaClassと呼ぶ。

=== AClassは定義===

Private m_min As Double 
Private m_max As Double 

Private Sub Class_Initialize() 
    m_min = 0# 
    m_max = 0# 
End Sub 

Public Sub InitializeFromValues(ByVal Min As Double, ByVal Max As Double) 
    m_min = Min 
    m_max = Max 
End Sub 

Public Property Get Min() As Double 
    Min = m_min 
End Property 

Public Property Let Min(ByVal X As Double) 
    m_min = X 
End Property 

Public Property Get Max() As Double 
    Max = m_max 
End Property 

Public Property Let Max(ByVal X As Double) 
    m_max = X 
End Property 

=== QCLASS定義===

Private m_alt As aClass 

Private Sub Class_Initialize() 
    Set m_alt = New aClass 
End Sub 

Public Sub InitializeFromValues(ByVal alt As aClass) 
    Set m_alt = alt 
End Sub 

Private Sub Class_Terminate() 
    Set m_alt = Nothing 
End Sub 

Public Property Get Altitude() As aClass 
    Set Altitude = m_alt 
End Property 

Public Property Set Altitude(ByVal X As aClass) 
    Set m_alt = X 
End Property 
+0

より多くの暴露のための下から:私は対処しなければならない実際に約15-20のケースがあるので怠惰の瞬間に、私はクラスのデータ型を置き換えても同じ効果を得ることができますか? –

+0

'Altitude'はクラスにプロパティを持たせたい場合にクラスを返す必要があります。これは、あなたが座ってあなたのデータモデルとコードを再利用する方法を考えて、同じコードを何度も何度もコピーして貼り付けないようにするときです。例えば、いくつかのプロパティが同じデザイン(最小/最大/単位)を共有する場合、それらのすべてに同じクラスを使用します。 質問をより詳細に編集して、より良い回答を得ることができます。 – ja72

+0

これは非常に良い点です。私はそのようなジェネリッククラスは考えていませんでした。 –

0

実は、私は上の拡大ます私の例としてのコメント。私は2つのカスタムクラスclsComputerとclsHDDを持っています。 clsComputerには、pModel、pSerialNumber、およびpHDDという3つのプロパティがあります。 pHDDはclsHDDのインスタンス化です(コンピュータには複数のハードドライブが存在しないため)。 本当に重要な部分は、私たちがIf pHardDrives(index) Is NothingをチェックするclsComputerにあります!もしあなたがそれをしてobjComputer.HDD.Statusにアクセスしようとするとクラッシュするでしょう。

clsComputer:

Private pModel As String 
Private pSerialNumber As String 

'''''''''''''''''''''' 
' Model property 
'''''''''''''''''''''' 
Public Property Get Model() As String 
    Model = pModel 
End Property 
Public Property Let Model(value As String) 
    pModel = value 
End Property 
'''''''''''''''''''''' 
' SerialNumber property 
'''''''''''''''''''''' 
Public Property Get SerialNumber() As String 
    SerialNumber = pSerialNumber 
End Property 
Public Property Let SerialNumber(value As String) 
    pSerialNumber = value 
End Property 
'''''''''''''''''''''' 
' HardDrives property 
'''''''''''''''''''''' 
Public Property Get HardDrives(index As Integer) As clsHDD 
    If pHardDrives(index) Is Nothing Then Set pHardDrives(index) = New clsHDD 
    Set HardDrives = pHardDrives(index) 
End Property 
Public Property Set HardDrives(index As Integer, value As clsHDD) 
    Set pHardDrives(index) = value 
End Property 
'''''''''''''''''''''' 
' HardDrives property 
'''''''''''''''''''''' 
Public Property Get HardDrives(index As Integer) As clsHDD 
    If pHardDrives(index) Is Nothing Then Set pHardDrives(index) = New clsHDD 
    Set HardDrives = pHardDrives(index) 
End Property 
Public Property Set HardDrives(index As Integer, value As clsHDD) 
    Set pHardDrives(index) = value 
End Property 

clsHDD:あなたは、あなたがUDTの

を使用することができ、地理空間 "オブジェクト" の取り扱いプロパティのみを必要としているように見えるので、

Private pDescription As String 
Private pStatus As String 

Public Property Get Description() As String 
    Description = pDescription 
End Property 
Public Property Let Description(value As String) 
    pDescription = value 
End Property 

Public Property Get Status() As String 
    Status = pStatus 
End Property 
Public Property Let Status(value As String) 
    pStatus = value 
End Property 
+0

怠惰の瞬間から、実際には約15-20件のケースがあるので、私は対処しなければなりません。クラスのデータ型を置き換えても同じ効果が得られますか? –

+0

コレクション、ディクショナリ、または配列だけを含むクラスを持つことができます。ハードドライブの情報をコレクションに格納された配列に簡単に格納することができます。 EG: 'arrHDDProps(0)= strModel:colHDD.add arrHDDProps'これは、どのようにデータを入れ子にし、格納し、アクセスするかということになります。セットアップに時間がかかることもあれば、アクセスしやすいものもあります。他の人はすぐに設定することができますが、アクセスするにはPITAにしてください。 – Tim

0

ます任意のモジュールで次のように宣言できます。

次いで
Option Explicit 

    Public Type AltitudeType '<~~ first declare the UDT that will be a sub-type of the main one 
     Min As Long 
     Max As Long 
     Units As String 'my guessing... 
     Invert As Boolean 'my guessing... 
    End Type 

    Public Type GeoSpatial '<~~ then declare the main UDT 
     Altitude As AltitudeType 
     GeoInfo1 As Long ' I don't know anything about geospatials... 
     GeoInfo2 As Double ' I don't know anything about geospatials... 
     GeoInfo3 As String ' I don't know anything about geospatials... 
    End Type 

、以下のように他のモジュールで使用:

Sub main() 

    Dim GeoSpatials(1 To 10) As GeoSpatial '<~~ initialize the UDT. here I assumed you would need an array   

    SetDefault GeoSpatials '<~~ launch default setting... 
    GeoSpatials(1).Altitude.Min = 200 '<~~ ... and then define only peculiar properties 
    GeoSpatials(2).GeoInfo1 = 2000000 '<~~ etc... 

End Sub 


Sub SetDefault(geospatArray() As GeoSpatial) '<~~ Sub to initialize each element of the geospatial array 
    Dim i As Long 
    For i = LBound(geospatArray) To UBound(geospatArray) 
     With geospatArray(i) 
      With .Altitude 
       .Min = 100 
       .Max = 200 
       .Units = "Meters" 
       .Invert = True 
      End With 
      .GeoInfo1 = 1000000 
      .GeoInfo2 = 100.2 
      .GeoInfo3 = "Geospat" 
     End With 
    Next i 
End Sub 
+0

私はそれについて考えましたが、有効な入力として受け入れられるものにいくつかの制限を設ける必要があり、その情報をすべて一箇所に保存したいと考えています。 –

+0

あなた自身に合ってください!私はちょうどあなたの "怠惰の瞬間"を読んでUDFの方法を追加しました。良いコーディング! – user3598756

関連する問題