我有一大组数据(40,000+行),它都是多个id数。它们列在第1栏中,然后在第10栏中,我为它们符合条件的多个职位设置了一个SsoftGroup名称。我想把我所有的东西拉到一个单独的标签上我需要的数据.
我拥有的..。
第1栏10列EmplNum SsoftGroup 1大会1大会1清洁2烘焙2 2组装2烘焙3清洁3清洁3烘焙3 3组装4烘焙4烘焙
我在另一个标签上需要什么
第1栏第2栏1工作人员大会:工作人员清洁大会2工作人员大会3工作人员大会:工作人员面包店:工作人员清洁4工作人员面包店
我不知道如何做到这一点,因为我不是很熟悉的VBA宏。我知道一个级联可以用于我需要的第2列;我只是不知道如何做,因为有一个可变的数组大小。
发布于 2014-08-27 22:08:31
枢轴表。这样,您几乎可以使用简单的excel count
和if
以及sum
函数获取任何您想要的信息。也就是说,如果枢轴还没有提供您想要的信息的话。
如果要在工作表中实现要使用的VBA函数,可以使用以下方法:
Function JobCat(ByVal BaseValue, ByRef rng As Range, ByVal delim As String) As String
Dim a, i, k As Long
Dim last_col As Integer
Set jobs = New Collection
last_col = rng.Columns.Count
a = rng.Value
On Error Resume Next
For i = 1 To UBound(a, 1)
If Val(a(i, 1)) = Val(BaseValue) Then
jobs.Add "Staff " & a(i, last_col), "Staff " & a(i, last_col)
End If
Next
For k = 1 To jobs.Count
JobCat = JobCat & IIf(JobCat = "", "", delim) & jobs.Item(k)
Next
End Function
参数1是EmplNum,参数2是整个范围(两列),参数3是文本分隔符(如":“或”或“等)。在这张截图里
更新以显示它使用指定的范围:
发布于 2014-08-27 20:36:30
您可以使用Dictionary
对象将数据存储在键/值对中。Value
部件可以是任何数据类型,所以我们将只使用一个字符串&连接B列中的各个项,作为A列中唯一的ID值。
关于字典的.
字典以两种方式创建键/值,或者显式地通过.Add
方法,
dict.Add "key", "value"
或者通过引用一个尚未存在的键隐式地:
dict("key") = "value"
如果键已经存在,后者将覆盖现有值。因此,我们可以使用返回布尔值的.Exists
方法来查看该项是否已经存在。
If dict.Exists("key") then
dict("key") = dict("key") & " some other text!"
Else
dict.Add "key", "value"
End If
在您的例子中,我们只使用Instr
函数来检查和查看来自B列的值是否已经附加到A列中的每个ID的Value
中。
未经测试,但我认为这应该可以做到:
Sub foo()
Dim dict as Object
Dim rng as Range
Dim r as Range
Dim val as String
Dim id as String
Dim key as Variant
Dim i as Long
Set rng = Range("A1", Range("A1").End(xlDown)) 'Modify as needed
Set dict = CreateObject("scripting.dictionary")
'iterate the range.rows:
For each r in rng.Rows
'
id = r.Value
'get the value from the same row, cell in column 10 and prefix with "Staff "
val = "Staff " & r.Offset(0,9).Value
'Add this item if it doesn't already exist:
If Not dict.Exists(id) Then
dict.Add id, val
Else
'avoid printing duplicate "values" in the dictionary using some string functions:
If Instr(1, dict(id), val) = 0 Then
dict(id) = dict(id) & ":" & val
End If
End If
Next
'Print the data to another sheet in columns A, B:
With Worksheets("Sheet2") '<~~ MODIFY AS NEEDED TO USE YOUR SHEET NAME
For each key in dict.Keys()
.Range("A1").Offset(i).Value = key
.Range("B1").Offset(i).Value = dict(key)
i = i + 1
Next
End With
End Sub
发布于 2014-08-27 21:07:06
如果您对VBA不熟悉或不习惯,而且上面的解决方案很吓人,那么您也可以使用几个Excel函数和许多额外的列来完成您的目标。
基本上,您将创建一个表来计算与每个唯一作业组匹配的唯一员工ID的每个实例。您只需将员工in的非重复列表放在表的最左边列中,在最顶部的行中放置一个取消重复的作业组列表(使用transpose命令)。
下面是使用示例数据应该是什么样子的示例:
Column 1 Assembly Cleaning Bakery ... Column 2
1
2
3
4
...
然后你可以使用COUNTIFS(.)在表的每个单元格中放置一个逻辑值,可以在IF(.)中使用语句返回空白单元格或字符串.然后,将最后一列中该行中的每个单元格连接起来。
我在表单元格中使用了这个公式,它工作得很好(显然,您必须更改工作表名称并调整单元格引用):
=IF(COUNTIFS(Sheet1!$A:$A, $B4, Sheet1!$B:$B, D$2) > 0, "Staff " & D$2 & ":", "")
您知道在整个数据集中第10栏中有多少不同的职务组吗?将许多单元格连成一行可能会很乏味,所以如果超过50,您可能应该选择VBA路线。
https://stackoverflow.com/questions/25536051
复制相似问题