将动态行复制到新工作簿并保存它

问题描述:

我是新来的。我有一个解决方案,但我可以找到我需要的东西。将动态行复制到新工作簿并保存它

,我发现我的答案的一部分,在这个帖子: Copying Dynamic Cells/Rows Into New Sheet or Workbook

但有2个,我需要更具体的行动,我不能弄明白的一个好办法。 首先我想将新工作簿与“原始文件”的名称保存在原始文件的相同位置。 第二件事是将第一行复制到每个新的工作簿。 这里我举的例子: 在我的数据库,重点进行排序,这样所有的字母都在一起,布拉沃和休息...

原始数据库(DB):

Name Position Key 
Bruce 1   Alpha 
Bruce 2   Alpha 
Alfred 2   Alpha 
Alfred 3   Bravo 
Robin 1   Bravo 
Robin 1   Bravo 

在第一个工作簿我想:

Name Position Key 
Bruce 1   Alpha 
Bruce 2   Alpha 
Alfred 2   Alpha 

,我想这个工作簿是保存为“Alpha.xlsx”在同一目录中的原始数据库(在桌面上的文件),然后,他关闭窗口

然后第二个工作簿将

Name Position Key 
Alfred 3   Bravo 
Robin 1   Bravo 
Robin 1   Bravo 

保存的名称为“Bravo.xlsx”也是在我的桌面上接近相同的文件,并保持与400个键

这里从代码去我在论坛上找到了帖子: 原代码被写了chiliNUT我做了更新,以适应我的DB

Sub grabber() 
Dim thisWorkbook As Workbook 
Set thisWorkbook = ActiveWorkbook 
last = 1 
For i = 1 To 564336 'my DB had 500K rows 
If Range("A" & i) <> Range("A" & (i + 1)) Then 
Range("A" & last & ":N" & i).Copy 
Set NewBook = Workbooks.Add 
NewBook.Sheets("Feuil1").Range("A1").PasteSpecial xlPasteValues 
last = i + 1 
thisWorkbook.Activate 
End If 
Next i 
End Sub 

这VBA完美的作品但它不会每次复制第一行,也不保存它。我有大约400个“键”,因此手动处理变得困难。 我不是专家。

能否请您在答案中复制完整的代码,以便我能够弄清楚? 非常感谢您的帮助。 我读了很多帖子,你总是想出来帮助别人。所以也为此感谢你。

你可能明白英语不是我的第一语言。对不起,错误和错误的语法。

提前致谢!

你可以这样做(在我的电脑上工作的数据示例)。记得添加Microsoft脚本运行时,使字典工作:

Sub grabber() 
    Dim thisWs As Worksheet: Set thisWs = ActiveWorkbook.ActiveSheet 
    'To make dictionaries work, and the line to make sense, you need to reference Microsoft Scripting Runtime, Tools-> References, and check of "Microsoft Scripting Runtime" 
    Dim myDict As New Scripting.Dictionary 
    Dim pathToNewWb As String 
    Dim currentPath, columnWithKey, numCols, numRows, uniqueKeys, uKey 

    'to avoid the screenupdating being false in case of unforseen errors, I want the program to jump to unfreeze if errors occur 
    On Error GoTo unfreeze 

    'with 400 keys it would end up with a lot of flicker + speeds it up: 
    Application.ScreenUpdating = False 


    'get the path of the active workbook 
    currentPath = Application.ActiveWorkbook.Path 

    'I hardcode the reference to the key column 
    columnWithKey = 3 
    'And assume that the worksheet is "just" data, why the number of used rows and columns can be used to identify the data 
    numCols = thisWs.UsedRange.Columns.Count 


    'extract the index of the last used row in the active sheet of the active workbook 
    numRows = thisWs.UsedRange.Rows.Count 

    'use a dictionary to get a list of unique keys by running over the key column in the used rows 
    For i = 2 To numRows 
     vKey = thisWs.Cells(i, columnWithKey) 
     If Not myDict.exists(vKey) Then 
      myDict.Add vKey, 1 
     End If 
    Next i 

    uniqueKeys = myDict.keys() 

    For Each uKey In uniqueKeys 
     pathToNewWb = currentPath & "/" & uKey & ".xlsx" 

     'Filter the keys column for a unique key 
     thisWs.Range(thisWs.Cells(1, 1), thisWs.Cells(numRows, numCols)).AutoFilter field:=columnWithKey, Criteria1:=uKey 

     'copy the sheet 
     thisWs.UsedRange.Copy 

     'Open a new workbook, chang the sheets(1) name and paste as values, before saveas and close 
     Set NewBook = Workbooks.Add 
     With NewBook 
      .Sheets(1).Name = "Feuil1" 
      .Sheets(1).Range("A1").PasteSpecial xlPasteValues 
      .SaveAs pathToNewWb 
      .Close 
     End With 

     'remove autofilter (paranoid parrot) 
     thisWs.AutoFilterMode = False 

    Next 

    Set myDict = Nothing 

unfreeze: 
    Application.ScreenUpdating = True 

End Sub 

在适应您提供的代码,我用下面的帖子:

的字典:(Does VBA have Dictionary Structure?

的自动筛选:( VBA for filtering columns

为另存为&关闭:(Excel VBA Open workbook, perform actions, save as, close

+0

每时间我对你们印象深刻。似乎没有问题,没有答案给你!谢谢。 但有些东西我不能这样做是在工具选项卡中激活参考。这是灰色的,我不能有acces所以我不能尝试你的杰作。 关于这方面的任何线索? – Newbie2000 2014-10-09 13:41:01

+0

也许这是有点复杂(至少对我来说) 因为我尝试了我引用的第一个代码,并且它似乎即使使用400个键也能完成这项工作。所以我的问题是,如果你有时间,你可以向我解释SaveAs action是否取第3列的名称,并且你的代码是否每次都为每个“提取”复制第一行?“如果你没有任何时间谢谢你为你的答案,我会尽力弄清楚 – Newbie2000 2014-10-09 13:49:54

+0

关于灰色的引用,你不能在调试模式。如果问题在未调试时仍然存在,则无法回答。 代码复制每次迭代的标题。代码在键列上应用过滤器,复制整个工作表并将其粘贴为值。结果是只有未过滤的值才被粘贴到新工作簿中。新工作簿的名称在pathToNewWb中设置,并且只是从原始工作簿的路径和唯一键组成的字符串。尝试添加几个断点并检查当地人(查看 - >本地窗口) – 2014-10-09 14:05:21