2016-06-16 12 views
4

我有一个excel电子表格中的长列表,并且对于每个单元格我想创建一个新对象,但我无法弄清楚如何去做。为每个单元格创建新对象

我有类似:

Dim k As Integer 
k = 0 

Do 

    If ActiveCell.Offset(k, 0).Value = "" Then Exit Do 
    Dim Player&k As New CPlayer 

     'Attempting to create a new object with name Player0, Player1, ... 

    Set Player&k.Name = ActiveCell.Offset(k, 0).Value 
    k = k + 1 
Loop 

正如你可能会说,我不知道很多关于VBA或面向对象编程,我只是有一个任务,我试图完成。上面的代码导致编译错误,所以显然不是这样做的正确方法,有没有简单的方法来做我想要的或不是真的?

+1

你不能像这样声明变量。 'CPlayer'是一个班级? – findwindow

+0

是的,CPlayer是一个具有名称属性的类。那么这是不可能的? – Qiri

+1

您可以创建一个类的数组。虽然XD – findwindow

回答

3

试试这个。从k = 0开始会弄乱一些东西。更改,以便它以1开头。

Dim Players As Collection 
Set Players = New Collection 

Dim Player As CPlayer 

Dim k As Integer 
k = 1 

Do 
    If ActiveCell.Offset(k-1, 0).Value = "" Then Exit Do 
    Set Player = New CPlayer 
    Players.Add Player 

    Players(k).Name = ActiveCell.Offset(k-1, 0).Value 
    k = k + 1 
Loop 
1

我会避免类对象的数组,并使用集合来代替。在一些圈子中,这些可能被认为非常接近相同的东西,但是有一些本质的区别,比如不需要ReDim扩展集合。

CPlayer类

Option Explicit 

Private pName As String 

Public Property Get Name() As String 
    Name = pName 
End Property 
Public Property Let Name(val As String) 
    pName = val 
End Property 

模块1码片

Option Explicit 

Sub playerNames() 
    Dim Players As Collection 
    Dim player As CPlayer, k As Long 

    Set Players = New Collection 

    With ActiveSheet 'this would be better as something like With Worksheets("Sheet1") 
     For k = 2 To .Cells(Rows.Count, "F").End(xlUp).Row 
      If CBool(Len(.Cells(k, "F").Value2)) Then 
       Set player = New CPlayer 
       player.Name = .Cells(k, "F").Value2 
       Players.Add player 
      End If 
     Next k 

     'enumerate the payer names to the Immediate window 
     For Each player In Players 
      Debug.Print player.Name 
     Next player 

     'send the second and third player's name to the Immediate window 
     Debug.Print Players(2).Name 
     Debug.Print Players(3).Name 

    End With 
End Sub 

这样建立你的球员的集合,并提供检索,请将.Name属性的两种方法。

+0

@Fredrik提出的答案与上述基本相同,但提供了将工作表中的名称应用于集合的不同方法。 – Jeeped

+0

他在24分钟内击败了你。刚刚失去了我对你的尊重= P – findwindow

+0

建立一个班级并重写子程序和样本数据需要几分钟时间(等待OP回复评论后要求澄清)。 :( – Jeeped

相关问题