5

次のようなコードがあります。

pos.Clutch = sh2.Cells(R, Clutch)
pos.Wiper = sh2.Cells(R, Wiper)
pos.Alternator = sh2.Cells(R, Alternator)
pos.Compressor = sh2.Cells(R, Compressor)
...
pos.Telephone = sh2.Cells(R, Telephone)
poss.Add pos

poss はコレクションで、Clutch、Wiper などは列インデックス (1 から開始) です。これは現在機能しますが、非常に醜いです。私はこのようなことをする方法を探しています...

Do While i <= classProperty.count
    For each classProperty in pos
        classProperty = sh2.Cells(R + 1, i)
    Next classProperty
Loop

明らかにそれはうまくいきませんが、クラス内でほぼ同じことを達成するメソッドまたはコレクションを作成する方法について誰かアドバイスはありますか?

4

4 に答える 4

4

いい方法がわかりません。醜い唯一の理由は、まだクラスに隠していないからです。この手続きをする

Sub Main()

    Dim clsPos As CPos
    Dim clsPoses As CPoses

    Set clsPoses = New CPoses
    Set clsPos = New CPos

    clsPos.AddFromRange Sheet1.Range("A10:E10")
    clsPoses.Add clsPos

End Sub

それについて醜いことは何もありません。AddFromRange メソッドは少し見にくいですが、それを記述するとき、またはデータを変更するときにだけ確認する必要があります。

Public Sub AddFromRange(ByRef rRng As Range)

    Dim vaValues As Variant

    vaValues = rRng.Rows(1).Value

    Me.Clutch = vaValues(1, 1)
    Me.Wiper = vaValues(1, 2)
    Me.Alternator = vaValues(1, 3)
    Me.Compressor = vaValues(1, 4)
    Me.Telephone = vaValues(1, 5)

End Sub

更新:範囲の代わりに配列を食べるための代替方法。

Public Sub AddFromArray(vaValues as Variant)

    Me.Clutch = vaValues(1, 1)
    Me.Wiper = vaValues(1, 2)
    Me.Alternator = vaValues(1, 3)
    Me.Compressor = vaValues(1, 4)
    Me.Telephone = vaValues(1, 5)

End Sub
于 2013-06-18T21:32:48.643 に答える
0

VBA クラスでは、コンストラクターを定義できません。

メイン モジュールでは、「作成者」を作成します。

  For R = R1 To R2
    pos.Add NewPos(Range("A" & R & ":E" & R)
  Next R

Function NewPos(R As Range) As classProperty
  Set NewPos = New ClassProperty
  NewPos.Init(R)
Exit Function

クラスで:

Sub Init(R As Range)
  Clutch = R.Cells(1, 1)
  Wiper = R.Cells(1, 2)
  ...
End Sub
于 2013-06-18T21:29:04.747 に答える