我有一张大表,其中包含系统的每日输入,其中的列如下所示:
天 商品名称1 商品数量1 商品名称2 商品数量2 .....
商品名称和数量相互独立。在某一天,有人可能会收到 10 件商品 A,而在另一天,有人可能会收到 5 件商品 D、6 件商品 B 和 234 件商品 C。在前一种情况下,只有 2 列有数据,而在后一种情况下,6 列有数据。所有其他列都将为空。示例:
Day N1 Q1 N2 Q2 N3 Q3
1 A 10
2 D 5 B 6 C 234
如何使用数据透视表来显示一年中每天的 A 数量,或者一年中 A 的非零值的数量?请注意,A 可能出现在多个列中,并且可能的项目有数百个,因此简单地创建一个包含每个变量的列的表是不可行的。
我尝试过多种方式添加所有列,但最终会返回 A 的值,给出 B 的所有值,给出 C 的所有值,这在值相关时很有用,但由于它们不相关,因此会使页面混乱。
如果这不可能,那么从电子表格中获取所需信息的最佳方法是什么?
答案1
您迫切需要重新组织您的数据。由于您现在遇到的原因,拥有不确定数量的列是一个非常糟糕的主意。我的建议是,正如其他人所建议的那样,将您的数据转换为一个简单的三列表,每行代表一个日常项目。
Day Item Quant
1 A 10
2 D 5
2 B 6
2 C 234
然后,您可以根据需要使用数据透视表来汇总和深入研究数据。
因此,现在的问题是如何在不确定数量的列中重新组织这些数据。幸运的是,一个相当简单的 VBA 程序可以做到这一点。将以下代码粘贴到新的 VBA 模块中(按Alt+ F11,然后转到Insert
> Module
)。
Sub SalvageMyTable()
Dim sOrig As Worksheet, sOut As Worksheet
Dim arrIn() As Variant
Dim rOut As Range, arrOut() As Variant
Dim i As Long, j As Long, k As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set sOrig = ActiveSheet
'Store original data in an array for faster processing
arrIn = sOrig.UsedRange.Value
'Create maximal output array. This can be resized before outputting the data.
ReDim arrOut(0 To 2, 0 To UBound(arrIn, 1) * (UBound(arrIn, 2) - 1) / 2) As Variant
'Loop through original table and copy values to output array.
For i = LBound(arrIn, 1) + 1 To UBound(arrIn, 1)
For j = LBound(arrIn, 2) + 1 To UBound(arrIn, 2) Step 2
If arrIn(i, j) <> "" Then
arrOut(0, k) = arrIn(i, LBound(arrIn, 2))
arrOut(1, k) = arrIn(i, j)
arrOut(2, k) = arrIn(i, j + 1)
k = k + 1
Else
Exit For
End If
Next j
Next i
'Resize output array
ReDim Preserve arrOut(0 To 2, 0 To k) As Variant
'Create output sheet and print output there.
Set sOut = Worksheets.Add
sOut.Name = "Reorganized Data"
sOut.Range("A1").Value = "Day"
sOut.Range("B1").Value = "Item"
sOut.Range("C1").Value = "Quantity"
sOut.Range("A2").Resize(k, 3).Value = Application.WorksheetFunction.Transpose(arrOut)
'Reset Excel settings
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
确保打开包含原始数据的工作表。然后转到 VBA 编辑器并运行此代码(按F5)。此代码将在名为“重新组织的数据”的新工作表中的三列中输出转换后的数据。
答案2
为了能够可靠地完成该数据集的数据分析,您需要更改数据的设置/组织/输入方式。
它可以在 Excel 中完成,但它也是一个非常容易设置的数据库。
物品表(物品编号、名称、描述)
车辆表(车辆编号、名称、描述、类型、品牌型号)
使用情况表(物品编号、车辆编号、日期、使用次数)
您也可以在 Excel 中使用不同的工作表执行此操作,并使用数据验证在用途表中提供项目和车辆的下拉列表。如果您没有编程经验,这可能是最好的选择。
很抱歉没有回答您的问题,但真正的问题是您的数据的组织。
答案3
您首先将表格转换为以下格式 Day NQ,样本数据如下
1 A 10
2 D 6
2 B 6
2 C 234
然后,如果您在此表上进行透视,您应该会得到结果。要转换为上面的表格,您需要创建一个新工作表。假设主工作表中有 10 行和 3 个名称数量对(假设 Sheet1 是工作表的名称,而不是标题行/列),那么您可以在新工作表中从第 1 行到第 30 行(10*3)使用以下公式
1 =Sheet1!A1 =Sheet1!B1 =Sheet1!C1
...
10 =Sheet1!A10 =Sheet1!B10 =Sheet1!C10
11 =Sheet1!A1 =Sheet1!D1 =Sheet1!E1
...
20 =Sheet1!A10 =Sheet1!D10 =Sheet1!E10
21 =Sheet1!A1 =Sheet1!F1 =Sheet1!G1
...
30 =Sheet1!A10 =Sheet1!F10 =Sheet1!G10
答案4
请参阅下面的图片。1 表示已维修的部分,0 表示“未更改”的部分。如果您的数据是这样表示的,那么您可以使用简单的数据透视表来解决您的问题。