2011-09-12 69 views
0

我很欣赏那里有很多类似的问题,但我一直在搜索各种论坛三天现在还没有找到任何我需要的东西 - 所以要么我在做非常奇怪的事情或我的搜索技能不达标!试图合并列在Excel中的列

我真的很感激,如果有人能让我知道我哪里出错了,或者甚至可以将我联系到一个可能有帮助的解决方案,因为我没有找到一个解决方案。

我目前有一个包含六个工作表的电子表格。工作表2-6包含来自不同来源的物品的数据。工作表1目前包含四列,它使用我拼凑成四个单独列的宏来填充项目数据。工作表2包含一个'itemlist'列,我想从工作表2中的四列中的每一列复制数据。

我希望这是有道理的。在此刻,我的代码是下面:

Sub UpdateList() 
    'Clear the current ranges 
    Range("PharmacyItems").Clear 
    Range("PrelabelItems").Clear 
    Range("RestockItems").Clear 
    Range("TakehomeItems").Clear 
    Range("FullItemList").Clear 

    'Populate control with unique list 
    Range("PharmacyFullList").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("PharmacyItems"), Unique:=True 
    Range("PrelabelFullList").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("PrelabelItems"), Unique:=True 
    Range("RestockFullList").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("RestockItems"), Unique:=True 
    Range("TakehomeFullList").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("TakehomeItems"), Unique:=True 

    'Combine the four ranges into one 
    Range("UniqueLists!$A:$A, UniqueLists!$B:$B, UniqueLists!$C:$C, UniqueLists!$D:$D").Copy Sheets("Drug totals").Range("A2") 
    'Sort the data 
    Range("FullItemList").Sort Key1:=Range("FullItemList").Columns(1), Order1:=xlAscending, Orientation:=xlSortColumns, Header:=xlYes, SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption2:=xlSortNormal 
End Sub 

为了阐明以上,这里是一个定义其范围是:

PharmacyItems,PrelabelItems,RestockItems和TakehomeItems:这些是包含从每个数据工作表复制的唯一项目的单个列表。 FullList:上述四个的fulllist是源数据列出了哪些不是唯一列表 FullItemList:列进我希望所有从唯一列表中的数据,以最终

我之所以有其指定的范围内每列而不是使用命名范围是,我试图看看这是否会使它更好,因为它只是给我一个模糊和蓬松的范围问题的错误。使用该范围中定义的列,它会告诉我目标的大小/形状与源不匹配。

确切的错误是: 运行时错误'1004': 信息无法粘贴,因为复制区域和粘贴区域的大小和形状不一样。请尝试以下之一: - 单击一个单元格,然后粘贴 - 选择一个矩形,这是相同的大小和形状,然后粘贴

谁能帮助我?可悲的是我是一个SQL Server的女孩,我宁愿从数据库中提取数据,但我不允许这个数据库!

预先感谢您

夏季

+0

澄清 - 您想通过将四个“唯一”列表复制到一个列中来合并? –

+0

您是否需要四个唯一列表,或者您是否可以将值从xxxFullList直接复制到DrugTotals表单中? –

+0

我需要四个唯一的列表,因为他们正在用于其他事情。您添加了未经测试的代码的帖子非常棒,谢谢! – Elatesummer

回答

0

如果您不需要单独的唯一名单,但只是想创建所有的唯一值的单列那么这应该为你工作(虽然未经测试...)

Sub UpdateList() 

    Range("FullItemList").Clear 'Clear the full item list range 

    'Populate control with unique list 
    UniquesToFullItemList Range("PharmacyFullList") 
    UniquesToFullItemList Range("PrelabelFullList") 
    UniquesToFullItemList Range("RestockFullList") 
    UniquesToFullItemList Range("TakehomeFullList") 

    'Sort the data 
    Range("FullItemList").Sort Key1:=Range("FullItemList").Columns(1), _ 
     Order1:=xlAscending, Orientation:=xlSortColumns, Header:=xlYes, _ 
     SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _ 
     DataOption2:=xlSortNormal 

End Sub 

Sub UniquesToFullItemList(rngFrom As Range) 
    rngFrom.AdvancedFilter Action:=xlFilterCopy, _ 
    CopyToRange:=Sheets("Drug totals").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0), _ 
      Unique:=True 
End Sub 
+0

啊,谢谢你,改变了一些与我的情况相关的位,并像魅力一样工作! – Elatesummer

4

不能粘贴到一个范围内的整列开始第2行(或任何其他行比1),因为那时的最后一行(S)列不适合表格。这就是为什么Excel说“复制区域和粘贴区域大小不一样”。

而不是

Range("UniqueLists!$A:$A, UniqueLists!$B:$B, UniqueLists!$C:$C, UniqueLists!$D:$D").Copy Sheets("Drug totals").Range("A2") 

尝试将其粘贴在开始第一行。

Range("UniqueLists!A:D").Copy Sheets("Drug totals").Range("A1") 

但我猜你没有数据一直下到你的“UniqueLists”表的最底部?如果是这样,那么你为什么要复制整个列?只需复制你需要的部分。然后你就可以从单元格“A2”开始粘贴。例如:

Range("UniqueLists!A1:D1234").Copy Sheets("Drug totals").Range("A2") 
+0

谢谢 - 我没有设置列的长度的原因是它会改变,因为我将数据从其他工作表拖到这些列中。这些是按月使用的,因此长度将根据销售的药物类型而变化。 我已经修改了代码,因为您建议,但我仍然得到完全相同的问题关于我认为的大小/形状,因为我复制了四列的范围,并试图将其粘贴到一列。由于char限制,我无法在这里完整修改代码 - 但是感谢您的修改,这是比我的简单的代码! – Elatesummer

+0

不客气。我在发布之前测试了代码。把你修改后的代码作为编辑你的问题,并指出你在哪一行发生错误。此外,如果您找到有用的答案,请记住点击左侧的复选标记以接受答案。 –