2013-04-15 5 views
0

Ceci est un script VBA. Je ne sais pas pourquoi ma collection ne remplit pas la feuille "Par marché".Pourquoi ma collection est-elle vide?

Sub ArrayPractice() 

Dim r As Integer 
Dim i As Integer 
Dim a As Integer 
Dim numberOfRows As Integer 
Dim names() As String 
Dim resourceCollect As Collection 

Dim Emp As Resource 
Dim Count As Long 

Set resourceCollect = New Collection 

a = Worksheets("DATA").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count 
r = 2 'row that i start looping from 
i = 0 

For Each Emp In resourceCollect 

For Count = 0 To a 
Emp.Name = Cells(r, 1).Value 
Emp.Title = Cells(r, 2).Value 
Emp.City = Cells(r, 3).Value 
resourceCollect.Add Emp 
r = r + 1 
Next Count 
Next Emp 

''''print the array!'''' 

Sheets.Add.Name = "By Market" 
Sheets.Add.Name = "By Resource Level" 
Sheets.Add.Name = "By Resource Manager" 



Sheets("By Market").Select 
Range("C36").Select 
r = 36 
For Each Emp In resourceCollect 
If Emp.City = "Dallas" Then 
Cells(r, 3).Select 
Debug.Print Emp.Name 
r = r - 1 
End If 
Next Emp 

Range("D36:D36").Select 
r = 36 
For Each Emp In resourceCollect 
If Emp.City = "Denver" Then 
Cells(r, 4).Select 
Debug.Print Emp.Name 
r = r - 1 
End If 
Next Emp 

Range("E36:E36").Select 
r = 36 
For Each Emp In resourceCollect 
If Emp.City = "Houston" Then 
Cells(r, 5).Select 
Debug.Print Emp.Name 
r = r - 1 
End If 
Next Emp 

Range("F36:F36").Select 
r = 36 
For Each Emp In resourceCollect 
If Emp.City = "Kansas City (Missouri)" Then 
Cells(r, 6).Select 
Debug.Print Emp.Name 
r = r - 1 
End If 
Next Emp 

End Sub 

MISE À JOUR

réponse Per Joseph, voici ce que je l'ai essayé. Je ne l'ai pas encore travaillé.

Voici quelques sous-marins différents avec lesquels j'ai joué. Ils essaient tous d'accomplir le même problème.

Sub stackResources() 

Dim c As New Collection 

Dim r1 As Excel.Range 'an object 
Dim r2 As Excel.Range 
Dim r3 As Excel.Range 


Set r1 = Range("A1") 
Set r2 = Range("B1") 
Set r3 = Range("C1") 

c.Add r1 
c.Add r2 
c.Add r3 

Sheets("By Market").Select 
Range("A1").Select 

Dim i As Long 
For i = 1 To c.Count 
    Debug.Print c.Item(i) 
    Next 


End Sub 

Sub collectionTest() 
Dim c As New Collection 

Dim emp As Resource 


Sheets("DATA").Select 

Range("A1").Select 

Do Until Selection.Value = "" 
    emp.name = Selection.Value 
     ActiveCell.Offset(0, 1).Select 
    emp.Title = Selection.Value 
     ActiveCell.Offset(0, 1).Select 
    emp.city = Selection.Value 
     c.Add emp 

    Loop 


Sheets("By Market").Select 
Range("A1").Select 

Dim i As Long 
For i = 1 To c.Count 
    Debug.Print c.Item(i) 
    Next 




End Sub 

Sub printACollection() 

Dim c As New Collection 

Dim s1 As String 
Dim s2 As String 
Dim s3 As String 

Sheets("DATA").Select 

Dim r As Long 


r = 1 
For Each cell In Range("A1") 
    s1 = cell.Value 
    c.Add s1 
    ActiveCell.Offset(0, 1).Select 
    s2 = cell.Value 
    c.Add s2 
    ActiveCell.Offset(0, 1).Select 
    s3 = cell.Value 
    c.Add s3 
    Next 


    Sheets("By Market").Select 

     Dim i As Long 

    For i = 1 To c.Count 
     Debug.Print c.Item(i) 
    Next 



End Sub 
+1

Vous ne pouvez pas parcourir une collection vide. Vous devez d'abord ajouter des éléments ... –

Répondre

1

Voici une autre réponse basée sur vos commentaires. Je pense que c'est ce que vous cherchez. Si non, veuillez être plus descriptif et modifier votre question.

Vous avez un module de classe appelé employé avec le code:

Option Explicit 

Public Name As String 
Public City As String 
Public Title As String 

Puis, dans un module régulier, vous pouvez avoir quelque chose comme ci-dessous. Portez une attention particulière à l'exemple et modifiez-le selon vos besoins. J'ai laissé le code de tri pour que vous puissiez le faire vous-même. Notez également comment je divise le travail en fonctions/sous-sections distinctes. Cela permet de garder votre code propre et plus facile à suivre. J'espère que cela t'aides.

Option Explicit 

Public Sub main() 
    Application.ScreenUpdating = False 

    Dim c As Collection 
    Dim newWs As Excel.Worksheet 
    Dim rData As Excel.Range 

    Set rData = ThisWorkbook.Sheets("Sheet1").Range("A2:C3") 

    Set c = getData(rData) 
    Set newWs = ThisWorkbook.Worksheets.Add 

    newWs.Name = "New report" 

    Call putCollectionInWorksheet(newWs, c) 

    Call sortData(newWs) 

    Application.ScreenUpdating = True 
End Sub 

Private Function getData(ByRef rng As Excel.Range) As Collection 
    ' create new collection of data 
    Dim c As New Collection 
    Dim i As Long 
    Dim e As Employee 
    For i = 1 To rng.Rows.Count 
     Set e = New Employee 

     e.Name = rng.Cells(i, 1) ' name column 
     e.Title = rng.Cells(i, 2) ' title column 
     e.City = rng.Cells(i, 3) ' city column 

     c.Add e 
    Next i 

    Set getData = c 
End Function 

Private Sub putCollectionInWorksheet(ByRef ws As Excel.Worksheet, ByRef cData As Collection) 
    Dim i As Long, j As Long 
    Dim emp As Employee 

    ' create header info 
    ws.Range("A1:C1") = Array("Name", "Title", "City") 
    i = 2 ' current row 

    For Each emp In cData 
     ws.Cells(i, 1).Value = emp.Name 
     ws.Cells(i, 2).Value = emp.Title 
     ws.Cells(i, 3).Value = emp.City 

     i = i + 1 
    Next emp 
End Sub 

Private Sub sortData(ByRef ws As Excel.Worksheet) 
    ' code here 
End Sub 
2

Ce qui se passe est que resourceCollect n'a rien en elle, donc en effet que vous n'êtes pas Boucler dans quoi que ce soit. Vous devez ajouter des éléments à la collection pour pouvoir la parcourir.

Voici un tutoriel de base qui pourrait aider:

http://www.wiseowl.co.uk/blog/s239/collections.htm

EDIT: Pour répondre à votre commentaire:

Public Sub test() 
    Dim c As New Collection 

    Dim s1 As String 
    Dim s2 As String 
    Dim s3 As String 

    s1 = "hello" 
    s2 = "," 
    s3 = "world" 

    c.Add s1 
    c.Add s2 
    c.Add s3 

    Dim s As String 

    For Each s In c 
     Debug.Print s 
    Next 
End Sub 

Cela échouera parce que vous ne pouvez pas en boucle grâce à l'utilisation du type de données String ... parce que c'est juste un type de données et non un objet. Dans ce cas, vous devez boucle à travers les indices (indices?):

Dim i As Long 

    For i = 1 To c.Count 
     Debug.Print c.Item(i) 
    Next 

Cependant, si vous utilisez des objets qui sont connus pour VBA comme, par exemple, une plage:

Public Sub test2() 
    Dim c As New Collection 

    Dim r1 As Excel.Range ' an object 
    Dim r2 As Excel.Range 

    Set r1 = Range("A1") 
    Set r2 = Range("A3") 

    c.Add r1 
    c.Add r2 

    Dim r As Excel.Range 
    For Each r In c 
     Debug.Print r.Address 
    Next r 
End Sub 

Cette volonté fonctionne très bien. Si vous utilisez des classes personnalisées, vous pouvez parcourir une collection en utilisant l'objet comme nous l'avons fait avec un objet Range. Le lien que je référence explique sur les problèmes qui peuvent avoir et la solution de créer votre propre objet Collection.

+0

Merci pour l'info. Avez-vous un exemple de bouclage d'une colletion avec un numéro d'index? associez-vous le numéro d'index avec une clé? – STANGMMX

+0

Merci joseph. J'ai essayé cette méthode plusieurs fois et elle ne remplit toujours pas le deuxième onglet. Je mets à jour mon code en conséquence. – STANGMMX

+0

@STANGMMX merci de mettre à jour le code. Pouvez-vous préciser ce qui ne fonctionne pas? Je ne suis pas sûr à ce stade de ce que vous essayez d'accomplir.Je suis sûr que vos collections contiennent maintenant des éléments (ce qui était la question originale) –

Questions connexes