Excel 为什么我的收藏是空白的?
这是一个VBA脚本。我不知道为什么我的收藏没有在“按市场”的表格中出现 更新 根据约瑟夫的回答,我已经试过了。我还没有让它工作 这里有几个不同的潜艇我一直在搞乱。他们都在努力解决同一个问题Excel 为什么我的收藏是空白的?,excel,vba,Excel,Vba,这是一个VBA脚本。我不知道为什么我的收藏没有在“按市场”的表格中出现 更新 根据约瑟夫的回答,我已经试过了。我还没有让它工作 这里有几个不同的潜艇我一直在搞乱。他们都在努力解决同一个问题 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 =
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
所发生的事情是,
resourceCollect
中没有任何内容,因此实际上您没有遍历任何内容。您必须将项目添加到集合中,才能在集合中循环
以下是一个可能有帮助的基本教程:
编辑:回答您的评论:
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已知的对象,例如范围:
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对象所做的那样。我参考的链接解释了可能存在的问题以及创建您自己的收集对象的解决方案。发生的事情是,
resourceCollect
中没有任何内容,因此实际上您没有进行任何循环。您必须将项目添加到集合中,才能在集合中循环
以下是一个可能有帮助的基本教程:
编辑:回答您的评论:
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已知的对象,例如范围:
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对象所做的那样。我参考的链接解释了可能存在的问题以及创建自己的收藏对象的解决方案。以下是基于您的评论的另一个答案。我想这就是你要找的。如果没有,请更具描述性并修改您的问题 您有一个名为Employee的类模块,其代码为:
Option Explicit
Public Name As String
Public City As String
Public Title As String
然后,在一个常规模块中,您可以有如下内容。请密切关注该示例,并根据您的需要对其进行修改。我把分类代码忘在外面了,所以你可以自己试一试。另外,请注意我是如何将工作分解为单独的函数/子函数的。这将使您的代码保持干净和易于遵循。希望这有帮助
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
根据你的评论,这里是另一个答案。我想这就是你要找的。如果没有,请更具描述性并修改您的问题 您有一个名为Employee的类模块,其代码为:
Option Explicit
Public Name As String
Public City As String
Public Title As String
然后,在一个常规模块中,您可以有如下内容。请密切关注该示例,并根据您的需要对其进行修改。我把分类代码忘在外面了,所以你可以自己试一试。另外,请注意我是如何将工作分解为单独的函数/子函数的。这将使您的代码保持干净和易于遵循。希望这有帮助
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
您不能在空集合中循环。您首先必须向其中添加项目…不能在空集合中循环。您首先必须添加项目到它…感谢您提供的信息。您是否有使用索引号循环收集的示例?您是否将索引号与键关联?谢谢。我尝试过这种方法几次,但仍然没有填充第二个选项卡。我会相应地更新我的代码。@STANGMMX感谢您更新代码。你能详细说明什么不起作用吗?在这一点上,我不确定你想要完成什么。我确信你们的藏品现在包含了一些物品(这是最初的问题),一列是名字,下一列是标题,最后一列是城市。当我提取每个名字、头衔、城市时,我将进入一个新的工作表并组织它。因此,新的表格将把休斯顿所有员工的名字放在一个专栏中,然后西雅图所有经理的名字放在另一个专栏中,等等。我将从一个标签到另一个标签做一些不同的事情。最后的希望是,我可以只更新数据选项卡,它将填充其他选项卡。有什么想法吗?还是有点困惑。谢谢你的信息。您是否有使用索引号循环收集的示例?您是否将索引号与键关联?谢谢。我尝试过这种方法几次,但仍然没有填充第二个选项卡。我会相应地更新我的代码。@STANGMMX感谢您更新代码。你能详细说明什么不起作用吗?在这一点上,我不确定你想要完成什么。我确信你们的藏品现在包含了一些物品(这是最初的问题),一列是名字,下一列是标题,最后一列是城市。当我提取每个名字、头衔、城市时,我将进入一个新的工作表并组织它。因此,新的表格将把休斯顿所有员工的名字放在一个专栏中,然后西雅图所有经理的名字放在另一个专栏中,等等。我将从一个标签到另一个标签做一些不同的事情。最后的希望是,我可以只更新数据选项卡,它将填充其他选项卡。有什么想法吗?还是有点困惑。