【问题标题】:Copy values of a worksheet to a new workbook将工作表的值复制到新工作簿
【发布时间】:2017-05-12 00:43:52
【问题描述】:

我正在尝试做一些看似简单,但一直给我带来麻烦的事情。

将活动工作表复制到没有公式的新工作簿中。

我用下面的代码试试运气:

Sub test()
ActiveSheet.Copy
With ActiveSheet.UsedRange
    .Value = .Value
End With
End Sub

但这很不可靠,因为它有时不会复制明显具有值的字段。 我的单元格需要在同一个该死的单元格中包含粗体和正常以及不同大小的文本。

上述方法不保留该格式。

我目前正在做的事情是这样的:

Sub EksporterExcel()
Dim ws As Worksheet
Dim wb As Workbook
Dim tid As String

Set ws = Sheets(ActiveSheet.Name)
tid = Format(CStr(Now), "hh.mm.ss")

Application.DisplayAlerts = False
Application.ScreenUpdating = False

ws.Copy
Set wb = Workbooks(ActiveWorkbook.Name)
ws.UsedRange.Copy
wb.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False

ActiveWorkbook.SaveAs _
        FileFormat:=51, _
        Filename:=Application.ThisWorkbook.Path & "\Udfyldte Indleveringsplaner\Excel\" & Date & "\" & ActiveSheet.Name & " Kl. " & tid & ".xlsx"

ActiveWorkbook.Close
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

这行得通。

但是速度很慢。非常非常慢。我假设这与首先复制工作表并返回复制单元格值有关,所以我想要一种避免这种情况的方法。

这种方式也不会将格式保留在具有多个格式选项的单个单元格中。然而,这是低优先级。

我很想知道是否有更有效的方法来做到这一点。

以下是使用代码的第一个sn-p时的结果示例,或者jkpieterse的答案中的代码。

复制前的原始工作表。

复制的表格

部分数据被复制后明显丢失

【问题讨论】:

  • “没有公式”是什么意思?粘贴到目的地作为值?将空值粘贴到源代码中有公式的目标位置?
  • 我需要用户在查看工作表时看到的值。显然,在所有情况下这都与 .Value 不同,因为第一段代码是不可靠的
  • 速度太慢的原因是您正在遍历整个工作簿/工作表。
  • 我可以通过简单地说明我需要复制的范围来避免这种情况吗?工作表具有固定大小
  • 使用ws.UsedRange.Copy会快一点,但不多

标签: vba excel


【解决方案1】:

这个版本怎么样(也整理了一些你的代码):

Sub EksporterExcel()
    Dim tid As String

    tid = Format(CStr(Now), "hh.mm.ss")

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    ActiveSheet.Copy

    ActiveSheet.UsedRange.Value2 = ActiveSheet.UsedRange.Value2

    ActiveWorkbook.SaveAs _
            FileFormat:=51, _
            Filename:=Application.ThisWorkbook.Path & "\Udfyldte Indleveringsplaner\Excel\" & Date & "\" & ActiveSheet.Name & " Kl. " & tid & ".xlsx"
    'Assume it is the active workbook you wanted to close...
    ActiveWorkbook.Close
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

【讨论】:

  • 这里的问题与上面的小sn-p代码相同。出于某种原因,并非所有值都被实际复制,并且复制的值似乎没有模式。我将在原帖中上传两张图片来说明问题
  • 听起来好像您的原始工作表以某种方式(部分)损坏了。工作表是否包含任何合并的单元格?如果是这样,如果你先取消合并会发生什么?
  • 为了我自己的利益,合并的单元格太多了,但我无能为力。你看,这不取决于我。为了实验,我尝试取消合并它们,但问题仍然存在
  • 我认为您可以放心地假设工作表已损坏。最好的办法是插入一个新的工作表并复制粘贴从旧到新的所有内容。然后尝试复制工作表技巧,看看新工作表是否按预期复制。如果再次失败,您将不得不通过复制和粘贴公式来重新创建工作表。一次执行一步,在每个中间步骤重试工作表副本。
  • 哦,天哪……复制太多了。工作簿中有 15 张纸。好吧,无论如何我都想这样做,因为出于某种原因,VBA 中有两个幻像表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
相关资源
最近更新 更多