一类

时间:2014-10-12 05:54:26

标签: class excel-vba vba excel

我刚刚被杀,试图上课。我已经在网站周围购物并看到了几个例子,但也许是因为它的1:43我很难理解它们。

我成功地使用了一个类来自动化大型数据输入项目。我创建了一个名为catDist的类,它是公司可以制造或销售的农产品类型的类别分布。

catDist包含六个属性:   私人自我作为字符串   私人Q1为双倍   私人Q2为双倍   私人Q3为双倍   私人Q4双倍   私有激活为布尔

他们都有标准的get和let代码。

有48种可能的类别。我有一个模块可以创建48个实例,其中包含48个不同的selfWorth值(例如" Cottonseed"或" maize"等),并将Q1到Q4设置为0。该模块最初使用Userform,我可以键入值并按Enter键。如果它看到我在特定文本框中输入了一个值(是的,那里有48X4个文本框),它会将激活设置为true并将相关的Q更改为我输入的值。

我现在想做什么。

取得了巨大的成功。现在我要做的是创建一个名为" Distributor"的类。每个经销商类都有4个集合有catDist对象。我可以创建分发器类。我可以创建catDist类。但是对于上帝的爱,我无法找到一种方法将相应的分配器catDist属性设置为我在Set方法中使用的catDist值。

Sub testRegist()
Dim registrant As testRegistrant
Set registrant = New testRegistrant

registrant.registNum = "Z000123"
'MsgBox (registrant.registNum)

Dim cowMilk As testcatDist
Set cowMilk = New testcatDist

cowMilk.selfWorth = "Cow Milk"
cowMilk.distribution = 4.6

registrant.testCat = cowMilk

Debug.Print registrant.testCat.selfWorth

End Sub

catDist Class

Private pselfWorth As String
Private pdistribution As Double

Public Property Get selfWorth() As String
  selfWorth = pselfWorth
End Property

Public Property Let selfWorth(name As String)
 pselfWorth = name
End Property

Public Property Get distribution() As Double
   distribution = pdistribution
End Property

Public Property Let distribution(dist As Double)
  pdistribution = dist
End Property

注册人a.k.a经销商类

Private pRegistNum As String
Private pCatDist As testcatDist

Public Property Get registNum() As String
    registNum = pRegistNum
End Property

Public Property Let registNum(registration As String)
  pRegistNum = registration
End Property

Public Property Get testCat() As testcatDist
   testCat = pCatDist
End Property

Public Property Let testCat(cat As testcatDist)
   Set pCatDist = New testcatDist
   pCatDist = cat
End Property

1 个答案:

答案 0 :(得分:2)

我看到的唯一问题是您使用的是Let而不是Set。在VBA中,您在分配对象时使用Set

当你写registrant.testCat = cowMilk(在你的Sub),testCat = pCatDist(在testRegistrant.testCat的吸气者中)和pCatDist = cat(在testRegistrant.testCat的设定者中1}})您隐式使用Let(就像您编写了Let registrant.testCat = cowMilk)而不是(明确地)使用Set

所以,如果你在测试Set registrant.testCat = cowMilk中写Sub,在getter中写Set testCat = pCatDist,在setter中写Set pCatDist = cat,你就应该好了。

此外,在同一个setter中,由于您在下一行中将pCatDist传递给它,因此不需要cat的初始化。

而且,正如@GSerg(谢谢)所说,你的二传手的签名应该是Public Property Set testCat(cat as testcatDist)而不是Public Property Let