Excel 2007 – dynamic重复数据

所以我有这个Excel工作簿,基本上应该是每个员工的工作服的数据表。 我想要的是为每个人(名字和姓氏)一张纸,然后为每件衣服提供一张纸。

然后把一张纸合并在一起。 但是,这将涉及每个名称重复多次,因为有独特的布types。 很难解释,但我有一个工作簿可在这里下载: http : //www.mediafire.com/?dxurbdjq340su6j

Sheet2(用户)包含每个唯一用户的简单列表。 Sheet3(文章)包含每个独特的服装文章的列表。 然后最后我们有第一张工作表(摘要),其中包含了所有的合并清单。 基于这个汇总表,我将在稍后创build一个数据透视表。 但首先我需要这里的function是dynamic的。 每当添加或删除新用户或服装时,我只想在Sheet2或Sheet3中执行此操作。 无论在Sheet1中应该dynamic收集数据。

任何想法? 我将不得不创build一个macros来做到这一点?

编辑:好的,所以我创build了两个公共字典的模块。 这是我到目前为止的代码:

的ThisWorkbook

Private Sub Workbook_Open() ' Create dictionaries Set dictName = New Dictionary Set dictClothItems = New Dictionary ' Collect data collectDictName collectDictClothItems End Sub 

模块1:

 Public dictName As Dictionary Public dictClothItems As Dictionary Public Sub collectDictName() Dim v As Variant Dim rngName As Range ' Add values With ThisWorkbook.Sheets(2) Set rngName = .Range("A2", .Range("A" & Rows.Count).End(xlUp)) For Each strName In rngName dictName.Add strName, "" Next End With End Sub Public Sub collectDictClothItems() Dim v As Variant Dim rngName As Range ' Add values With ThisWorkbook.Sheets(3) Set rngName = .Range("A2", .Range("A" & Rows.Count).End(xlUp)) For Each strClothName In rngName dictClothItems.Add strClothName, "" Next End With End Sub 

所以,我在这里收集数据并将它们存储在一个数组中。 我不知道如何从范围中收集数据,所以我使用了For Each strName In rngName 。 看起来它收集了其他我并不需要的数据。 大概可以通过创build一个stringvariables并赋值我后面的值来解决这个问题。 然后将该string添加到Dictionary中。 无论如何,现在收集的数据,我需要比较,现在添加到实际的汇总表。 任何想法从哪里开始?

问题重述

所以基本上,你想要的是:

每当您在Sheet2(用户)或Sheet3(衣服)上添加新值时,您希望Excel在Sheet1(摘要)上为其他工作表(用户或衣服上的每个值的一个新行dynamic添加一行改变)

顺便说一下, 金额从哪里来?

回答

然而,要回答你的问题,最简单的方法就是用VBA来做,所以它是dynamic的。

以下是你可以做的事情:

  • 在Sheet2和Sheet3上添加en事件Worksheet_Change() (请参阅Chip Pearson网站上的如何操作)
  • 这个程序会监视这些表单上的每一个变化。 每次用户添加一个值,你都应该 循环在另一张纸上 从另一张表中获取值并填充一个数组 (衣服或用户,取决于数值)
  • 恕我直言,巩固数据最简单的方法是 创build 循环你创build的数组 (或使用字典 并将每一行添加到您的数组
  • 最终,您可以将数组添加到Summary表单中

不要犹豫,如果你需要更多的信息,或者问你一个新的问题,如果你仍然坚持你试过。


[编辑2]这是一个完整的工作解决scheme的文章(容易适应用户)

代码Sheet3(文章)

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim aSum() As String Dim sArticle As String, sPrice As Long Dim i As Integer, iLastrow As Integer If Intersect(Range("A:B"), Target) Is Nothing Then Exit Sub 'if no price, exit sub If Not Intersect(Range("A:A"), Target) Is Nothing Then If Target.Offset(0, 1).Value = Empty Then Exit Sub sArticle = Target.Value sPrice = CLng(Target.Offset(0, 1).Value) End If 'if no name, exit sub If Not Intersect(Range("B:B"), Target) Is Nothing Then If Target.Offset(0, -1).Value = Empty Then Exit Sub sArticle = Target.Offset(0, -1).Value sPrice = CLng(Target.Value) End If 'get the names in an array collectNames 'store the data in a new array so to map these values in the end ReDim aSum(UBound(vNames) - 1, 3) For i = 0 To UBound(vNames) - 1 aSum(i, 0) = vNames(i + 1, 1) aSum(i, 1) = sArticle aSum(i, 3) = sPrice Next 'store the data back to the Summary sheet With ThisWorkbook.Sheets("Summary") iLastrow = .Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & iLastrow & ":D" & iLastrow + UBound(vNames) - 1).Value = aSum End With End Sub 

代码在模块中

 Option Explicit Public vNames As Variant Public vClothes As Variant Public Sub collectNames() With ThisWorkbook.Sheets(2) vNames = .Range("A2", .Range("A" & Rows.Count).End(xlUp)) End With End Sub Public Sub collectClothItems() With ThisWorkbook.Sheets(3) vClothes = .Range("A2", .Range("B" & Rows.Count).End(xlUp)) End With End Sub 

我没有使用字典(也许@Issun可能有一个想法,他是一个字典专家),但数组,因为它更容易映射到工作表范围。