【问题标题】:How to copy and paste a column of dynamic data (as values) to another column in VBA?如何将一列动态数据(作为值)复制并粘贴到 VBA 中的另一列?
【发布时间】:2020-12-16 16:30:17
【问题描述】:

我在 F15:F1649 中有公式,当自动计算打开时,每次单击鼠标都会刷新值(例如,F15:F1649 的每个单元格中都有一个 RAND() 函数)。我正在尝试运行蒙特卡洛模拟,复制 F15:F1649 中的动态数据,并将其作为值粘贴到 G15:G1649,然后再次复制并将刷新的数据粘贴到 H15:H1649,依此类推,直到完成 1000 次试验。

我自己录制了一个宏,但是代码很草率。请参阅下面的代码示例行:

Sub Monte_Carlo_Sim()
'
' Monte_Carlo_Sim Macro
'

'
    Range("F15").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Selection.End(xlUp).Select
    Range("G15").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("H15").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("I15").Select

【问题讨论】:

  • 我不确定这里的实际问题是什么?此代码是否有效?您需要了解什么?
  • 代码有效,但是为了记录宏,必须手动将该范围作为值复制并粘贴到 1000 列中是非常麻烦的。此外,我目前只能进行大约 700 次试验,因为我相信我的代码行数可能会达到 VBA 允许的最大值?
  • 如果您有编程专业知识,这个问题似乎很容易。我猜你没有这个?你有没有这样的事情。如果您没有专业知识,明智的做法是使用不会让您感到困惑的解决方案,以便您以后可以自己修补它。但是,从编程的角度来看,这种解决方案可能效率低下。
  • 嗨,马克——你说得对,我没有任何编程专业知识哈哈。我只是在为数据集寻找更高效的宏。

标签: excel vba montecarlo


【解决方案1】:

您已经使用宏记录器生成了大部分代码。如果您对编程有基本的了解,您可以对其进行一些小改动并获得您想要的结果。

您的代码中的问题是您手动选择需要粘贴复制数据的位置。而不是这样做,您需要让代码识别最后一个空列以粘贴值,然后将其循环 1000 次,如下所示:

For i = 1 To 5
    Range("A2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Selection.End(xlToRight).Offset(0, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Next i

以下代码:Selection.End(xlToRight).Offset(0, 1).Select 标识最后一个未填充的列

注意:在上面的 For 循环中,您可以将值从 5 更改为所需的数字,以多次循环代码。但是先用 5 测试一下,看看它是否按预期工作。

【讨论】:

  • 重要提示:一般在VBA/Excel标签空间avoid Select回答。
  • 谢谢你,甘古拉。请原谅我缺乏编码知识,但我将您推荐的代码粘贴到 VBA 中并运行它,但它只在最后一个空列中粘贴了该范围的数据。不幸的是,它没有将范围粘贴为最后一列之前的 1000 列中的值,因为我也想要它。有什么建议吗?
  • 我更新了上面的代码并添加了一个 for 循环,检查是否是你所期望的
  • 非常感谢,甘古拉。它确实刷新了方程 5 次,但它只将最终值粘贴到 1 列中。我想做的是:复制一系列 RAND() 函数,将它们粘贴到右侧的列中。然后再次刷新 RAND() 函数,然后将这些值粘贴到右侧的另一列中,依此类推。最终结果应该是,对于一行中的每个 RAND() 函数,右侧的列中应该有 1000 个粘贴值。这有意义吗?
  • 我尝试时它不会将值粘贴到一列中。如果您能分享您的数据结构,我可以为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多