2016-06-16 3 views
4

Excelのスプレッドシートに長いリストがあり、セルごとに新しいオブジェクトを作成したいと思いますが、その方法を理解できません。各セルの新しいオブジェクトを作成する

私のようなものがあります:あなたは、おそらく私はVBAやオブジェクト指向プログラミングについて多くを知らない、私はちょうど私が達成しようとしている一つのタスクを持って、言うことができるように

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 

を。上記のコードはコンパイルエラーになるので、これを行う正しい方法ではないことは明らかです。私が試しているかどうかを簡単に確認する方法はありますか?

+1

このような変数を宣言することはできません。 'CPlayer'はクラスですか? – findwindow

+0

ええ、CPlayerはNameプロパティを持つクラスです。これはその後不可能ですか? – 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 

Module1のコードシート

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のプロパティを取得する2つの方法を提供します。

+0

@Fredrikによって提案された答えは、基本的には上記と同じですが、ワークシートの名前をコレクションに適用する方法が異なります。 – Jeeped

+0

そして彼は24分であなたを倒しました。ちょうど失われた_all_あなたのための私の尊重= P – findwindow

+0

クラスを構築し、サブプロシージャとサンプルデータを書き直すには数分かかります(説明を求めるコメントにOPが応答するのを待ってから)。 : – Jeeped

関連する問題