2017-05-01 103 views
0

我意识到我无法复制和粘贴任何东西,因为我的宏存储其他东西或清除我的剪贴板。运行宏影响复制/粘贴(剪贴板)

我的宏与我的机器上的其他任务和应用程序“交互”,并不奇怪,就像关闭num-lock;这是SendKeys的结果,您可以阅读关于它herethread。或者正如我所说的那样,它会影响我的剪贴板或关闭Adobe Acrobat,或者如果我没有重启机器一段时间,就停在代码中间。我认为这是正常的,因为它吸收了大量的内存,并且超出了我正在打印的PDF格式,或者编辑导致“复杂格式化”的警告错误的图表,这些错误无法通过Application.DisplayAlerts = False或甚至SendKeys {Enter}来处理。

除了所有这些,我需要在宏运行时编辑报表,以及在运行时无法复制/粘贴的事实难以忍受。值得一提的是我需要复制一个范围并粘贴它(不能将范围分配给另一个范围),所以我在我的代码中复制/粘贴。我不确定究竟是什么导致了这一点,所以只是说在我的代码中Application.CutCopyMode设置为False

编辑:这是一个过滤器和数据移动到新的工作表的一部分:

Sub Data_Filter(ic As Integer, sDate As Date, eDate As Date) 

'Needs setup 

    ap.CutCopyMode = False 

    cr1 = ">=" & sDate 
    cr2 = "<=" & eDate 

    wsh.Range("$A$2:$AZ$315746").AutoFilter 


    wsh.Range("$A$2:$AZ$315746").AutoFilter Field:=1, Criteria1:= _ 
        cr1, Operator:=xlAnd, Criteria2:=cr2 

    wsh.Range("$A$2:$AZ$315746").AutoFilter Field:=ic, Criteria1:="<>-" 


    wsh.Range(wsh.Cells(1, 1), wsh.Cells(1, 2).End(xlDown)).Copy 

    wsh1.Activate 
    wsh1.Range("A1").PasteSpecial xlPasteAll 

    For xx = 0 To 2 

     wsh.Activate 
     wsh.Range(wsh.Cells(1, ic + xx), wsh.Cells(1, ic + xx).End(xlDown)).Copy 



     Select Case wsh.Cells(2, ic + xx).Value 
      Case "Flow (MGD)" 
       ix = 1 
      Case "Depth (in)" 
       ix = 2 
      Case "Velocity (fps)" 
       ix = 3 
     End Select 
     wsh1.Activate 
     wsh1.Cells(1, 2 + ix).PasteSpecial xlPasteAll 
    Next xx 

    wsh.ShowAllData 
    wsh.Range("$A$2:$AZ$315745").AutoFilter 

End Sub 

问题:我认为问题是由拷贝将被保存在我的剪贴板该范围内造成记忆。纠正我,如果我错了。有没有办法解决这个问题,比如将复制的范围存储在其他地方而不是剪贴板内存中,以便我可以继续在我的机器上工作?

p.s.我很清楚选择/激活的缺点。

+1

为什么你必须复制/粘贴并且不能直接将数据/内容/格式写入目标单元格/范围?在这里发布代码,也许我们可以帮助您重写代码,避免使用复制/粘贴? – Ralph

+0

@Ralph我正在过滤我的表格,出于某种原因,当我复制/粘贴时,我没有在目标表单中获取过滤的值,但是直接写入时,它最终忽略了过滤器。 – Masoud

+0

然后复制“可见单元格”。你的问题很不清楚/很难回答,因为有很多事情可以“重置”剪贴板,而且你没有向我们展示任何东西。一般的经验法则,如果你需要复制+粘贴东西,在你复制之后立即粘贴*不要去打开工作簿或者做其他20件事:一旦你复制了你想要的东西,接下来要做的事情是粘贴它。这就是说我不知道​​这与你的问题有什么关系。请[edit]澄清。接近1K代表似乎你现在应该知道这些事情。 –

回答

0

经过一段时间的处理这个问题之后,我开始意识到如果您需要复制/粘贴范围(不仅仅是值),那么对于这个问题没有简单的解决方法。

如果您需要移动格式或边框或其他任何内容,而不是仅处理复制/粘贴,这会影响剪贴板,或尝试迭代范围并应用格式。格式如下所示;

Range("Destination1").NumberFormat = VarType(Range("Source1")) 
Range("Destination2").NumberFormat = VarType(Range("Source2")) 
'... 

但是,如果你不需要它们,那么你可以这样做如下:

Range("Destination").Value = Range("Source").Value 

在格式条款中,你也可以把它硬编码的模块中:

Range("Destination").NumberFormat = "hh:mm:ss" 

因此,基本上你需要将你正在做的事情复制/粘贴成片断,并避免复制到剪贴板内存没有问题。

+0

*你被复制范围并粘贴它所诅咒*这在技术上并非如此。假设您可以识别*您想要复制的内容。当然,您可以对源执行单元格迭代并将所需的属性从源分配到目标。 –

+0

@DavidZemens对于大约30万行和50列,技术上并不合理。 – Masoud

+0

@DavidZemens但我会考虑你的评论和编辑我的答案。谢谢。 – Masoud