【问题标题】:Copying data from another excel workbook - instead of one sheet it's copying all of them从另一个 excel 工作簿复制数据 - 而不是一个工作表,而是复制所有工作表
【发布时间】:2014-01-30 17:43:37
【问题描述】:

我有几个要合并的 Excel 文件。每个文件有 17 张,分别命名为 00、01、02、03 等。 现在,我打开每个工作簿并尝试将数据复制到一个文件中,该文件也有 16 个工作表,在工作表 x 上我想从工作表 x 中获取所有其他工作簿的信息。

现在,我打开文件,每个文件都有以下代码:

For i = 0 To 16

  Workbooks(nazwaPliku).Activate
  zakladka = Right("0" & CStr(i), 2)
  Sheets(zakladka).Activate
  ileWierszy = Application.WorksheetFunction.Max(Sheets(zakladka).Range("B:B"))
  wierszMin = Application.WorksheetFunction.Match("1", Sheets(zakladka).Range("B:B"), 0)
  zakresDoKop = "A" & wierszMin + 1 & ":" & "I" & wierszMin + ileWierszy + 1 '1 wiecej dla bezpieczenstwa
  Sheets(zakladka).Range(zakresDoKop).Resize(ileWierszy, 1).Value = rok & "_" & czesc
  Sheets(zakladka).Range(zakresDoKop).Copy
  ThisWorkbook.Sheets(zakladka).Activate
  ThisWorkbook.Sheets(zakladka).Range("A" & wsk(i)).PasteSpecial

  wsk(i) = wsk(i) + ileWierszy + 2
Next i

对于第一个文件,一切都很好(所有工作表的 wsk = 2),但是当我打开下一个工作簿时,发生了一些奇怪的事情。例如,当 i=2 时,代码从工作表 02 - 16 复制数据并将它们粘贴到此工作簿中。更重要的是,我通过删除工作簿中的第 16 表进行了测试,当 i 16 时,发生错误(因为它缺少一张表)。我想也许我不太了解这里的循环?

有什么想法吗?我知道如何以不同的方式编写它,但由于我花了最后 4 个小时试图弄清楚事情,我真的很想知道为什么会发生这种情况。

【问题讨论】:

  • 您的所有数据是否都按升序排列,以便 Max 始终获得最后一行?
  • 是的,最大行总是正确选择

标签: excel vba copy


【解决方案1】:

试试这样的:

未经测试

Dim wb As Workbook
Dim ws As Worksheet
Dim desWs As Worksheet
Dim firstRow As Long
Dim lastRow As Long
Dim lastColumn As Long
Dim pasteRow As Long

'I'm assuming you're looping through your workbooks... so set each open workbook to _
'the wb variable once you've opened it/when you open it.

'This will loop through each sheet in the workbook you just opened and paste the _
'values in the corresponding ThisWorkbook sheet.
For Each ws In wb.Sheets
    'Since the sheet names in ThisWorkbook are the same as in the other wb, we can _
    'use the current worksheet name for the destination sheet. (ws.Name)
    set desWs = ThisWorkbook.Sheets(ws.Name)
    firstRow = ws.Range("B:B").Find("*", searchdirection:=xlNext).Row + 1
    lastRow = ws.Range("B:B").Find("*", searchdirection:=xlPrevious).Row
    lastColumn = ws.Rows("1:1").Find("*", searchdirection:=xlNext).Column
    pasteRow = desWs.Range("A:A").Find("*", searchdirection:=xlPrevious).Row + 1
    desWs.Range(desWs.Cells(pasteRow, 1).Resize(lastRow-firstRow, lastColumn) = _
        ws.Range(ws.Cells(firstRow, 1), ws.Cells(lastRow, lastColumn)).Value
Next ws

请记住,此方法只复制值,而不是格式化。

【讨论】:

  • 它起作用了,谢谢:) 仍然 - 谁能回答为什么“复制”不起作用?
  • @kamila,副本正在运行,是您的wsk(i) 有问题。您每次都增加它,但每个 wsk(i) 都以初始化(可能为 0)开始并且是唯一的,因此您每次都在同一区域上重写。只需将wsk(i) 更改为wsk,即标量变量,而不是数组。
  • @LanceRobert 我不确定我是否理解,但我需要一个数组,因为每张纸上我有不同数量的数据。另外,我还在使用它,我已经改变了循环(对于sheets,而不是i)和复制部分,但wsk(i) 不是(我现在只是手动增加它每个循环):desWs.Range("A" & wsk(i)).Resize(ws.Range(zakresDoKop).Rows.Count, ws.Range(zakresDoKop).Columns.Count).Value2 = _ ws.Range(zakresDoKop).Value2 并且它正在工作
  • @kamila,我明白你的意思,但不能确定这不是问题,因为你没有显示循环通过不同工作簿的外部循环。您必须在遍历所有工作簿的整个循环中保留 wsk 数组(您可能正在这样做)。很高兴您现在有解决问题的方法,祝您好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多