2013-04-15 2 views
0

이것은 VBA 스크립트입니다. 내 컬렉션이 "By Market"시트를 채우지 않는 이유를 모르겠습니다. 당 요셉의 대답내 컬렉션이 비어있는 이유는 무엇입니까?

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 

UPDATE

은, 여기에 내가 무엇을 시도했다입니다. 아직 작동하지 않습니다.

다음은 몇 가지 하위 항목입니다. 그들은 모두 같은 문제를 해결하려고 노력하고 있습니다.

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

빈 컬렉션을 반복 할 수 없습니다. 먼저 항목을 추가해야합니다. –

답변

1

귀하의 의견을 바탕으로 한 또 다른 답변입니다. 나는 이것이 당신이 찾고있는 것이라고 생각합니다. 그렇지 않은 경우 더 자세하게 설명하고 질문을 수정하십시오.

Option Explicit 

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

그런 다음, 일반 모듈에서, 아래처럼 뭔가를 할 수 있습니다

당신은 코드와 직원라는 클래스 모듈을 가지고있다. 예제에 세심한주의를 기울이고 필요에 맞게 수정하십시오. Sort 코드를 남겨 두었으므로 직접 코드를 작성할 수 있습니다. 또한, 작업을 별도의 함수/subs로 분리하는 방법에 주목하십시오. 이렇게하면 코드를 깨끗하고 쉽게 따라 할 수 있습니다. 희망이 도움이됩니다.

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

무슨 일이 발생하는지는 resourceCollect에는 아무 것도 없으므로 실제로 아무 것도 반복하지 않습니다. 루프를 통해 컬렉션에 항목을 추가해야합니다.

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

편집 : 여기

은 도움이 될 기본적인 튜토리얼의 의견에 대답하기 :

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 

이 실패를하기 때문에 할 수 있습니다 문자열 데이터 유형을 사용을 통해하지 루프 왜냐하면 그것은 단지 데이터 유형이고 객체가 아니기 때문입니다. 당신이 말처럼 VBA로 알려진 개체를 사용하는 경우,

Dim i As Long 

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

그러나 범위 : :

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 

이 뜻을이 경우 인덱스 (? 인덱스)를 통해 루프가 잘 작동합니다.

사용자 정의 클래스를 사용하는 경우 여기에서했던 것처럼 Range 객체를 사용하여 객체를 사용하여 컬렉션을 반복 할 수 있습니다. 내가 참조하는 링크는 가질 수있는 문제와 고유 한 Collection 객체를 만드는 솔루션에 대해 설명합니다.

+0

정보를 제공해 주셔서 감사합니다. 색인 번호가있는 colletion을 반복하는 예가 있습니까? 색인 번호를 키와 연결합니까? – STANGMMX

+0

감사합니다. joseph. 이 방법을 몇 번 시도했지만 두 번째 탭을 채우지 못했습니다. 그에 따라 내 코드를 업데이트하십시오. – STANGMMX

+0

@STANGMMX 코드를 업데이트 해 주셔서 감사합니다. 작동하지 않는 부분을 정확히 설명해 주시겠습니까? 나는이 시점에서 당신이 성취하려는 것을 확신하지 못합니다.나는 당신의 콜렉션에 아이템 (원래의 질문이었습니다)이 포함되어있을 것이라고 확신합니다. –

관련 문제