【问题标题】:Excel VBA: How to create loop and save output for each value in range?Excel VBA:如何为范围内的每个值创建循环并保存输出?
【发布时间】:2015-04-16 08:24:41
【问题描述】:

我正在尝试在 excel 中创建一个循环,但我被卡住了。

我的循环的目的是 - 遍历一系列值,例如 A1:A8760 并将其插入到单元格中,例如 B10 - 对于每个值范围,我想保存输出并将其复制到新列中,例如 C。

我尝试录制一个宏并从中创建一个循环。但它只是出错了,

gg = 1

   Dim myRange As Range
   Dim i As Long, j As Long

   Set myRange = Range("AJ4:AJ8763")
   For i = 1 To myRange.Rows.Count
      For j = 1 To myRange.Columns.Count
        myRange.Cells(i, j).Select
    Selection.Copy
    Range("D10").Select
    ActiveSheet.Paste
    Range("O7").Select
    Application.CutCopyMode = False
    Selection.Copy
  myRange.Cells(i, j + gg).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
      Next j
   Next i
End Sub

上面的代码示例是我到目前为止添加的。所以我的想法是我遍历从 AJ4 到 AJ8763 的一系列值并将其插入到单元格 D10 中, 下一步是复制单元格 O7 的输出并将其插入单元格 AK4 到 AK8763。

添加修正版

【问题讨论】:

  • 请补充一下你目前尝试过的,有什么问题。
  • 亲爱的 Arnon,我刚刚在原始帖子中添加了我的代码示例。
  • 重新计算 O 列中的新值的公式是什么?这可能会更好地完全在内存中完成。
  • “AK4 到 AJ8763” - 我假设你的意思是 AK4 到 AK8763?
  • @Jeeped 是对的。或者,如果您放弃循环,然后将公式一次正确地转换为值,则更好。

标签: excel vba loops


【解决方案1】:

抱歉 - 现在已编辑,我在我的机器上运行它 应该

myRange.Cells(i, j).Select

我认为应该这样做,我实际上并没有检查它是否在逻辑级别上工作,只是确保它可以编译。 你有两条这样的线。


如果我没记错的话——我还是个帮助别人的新手,

中的字符串
Range("myRange.Cells(i, j)").Select

有问题 - 您必须在代码中添加带有 '&' 的变量,如下所示:

Range("myRange.Cells(" & i & ", " & j & ")").Select

希望有帮助。

【讨论】:

  • 你说得对,这条线有问题,但你在这里写的也行不通。 myrange 是一个对象。 VBA 会将您所写的内容解释为字符串,而不会理解它。 myRange.Cells(i,j).Select 应该会更好,但我认为 cmets 正在探索更多基本问题。
  • 大家好,我设法通过使用“myRange.Cells(i,j).Select”来实现它。感谢您的快速回复!我自然不得不添加 myRange.Cells(i+1,j+1).Select 作为输出。
  • 是的,我在你评论的时候注意到了 :) 谢谢
【解决方案2】:

据我了解,O10 中有一个公式有一个或多个包含 D10 的先例。这意味着当一个新值进入 D10 时,一个新结果在 O10 中,您希望将该结果保存到一个新列中。

执行此操作的最快方法是将 AJ4:AJ8763 中的所有值收集到一个变量数组中。循环遍历 VBA 中的变量数组,并使用数学和函数重新计算值,就像 O10 中的公式一样。

完成后,只需将变量数组中的新值放回 AK4:AK8763。

Dim rws As Long, cls As Long, v As Long, vAJs As Variant

rws = 8760
cls = 1
With ActiveSheet
    vAJs = .Range("AJ4").Resize(rws, cls).Value2
    For v = LBound(vAJs) To UBound(vAJs)
        'something with Application.NPV on next line
        vAJs(v, 1) = vAJs(v, 1) * 2  'simple computation. If you need help with this line, show us the formula being used in O10.
    Next v
    .Range("AK4").Resize(rws, cls) = vAJs
End With

我使用了一个非常简单的计算作为实际工作应该发生的位置的占位符。与循环遍历每个单元格、将其复制到新位置然后获取公式的结果并将其粘贴到新列中相比,以这种方式运行代码速度快得令人眼花缭乱。

【讨论】:

  • 感谢您的建议。我的问题是使用的 NPV 函数来自另一张纸。函数为:NPV($D$9;I82:AG82)+H82..
  • @SKkumar - 在循环的第一段,来自 AJ4 的值被复制到 D10 中,而 O7 中的新计算结果被复制到 AK4 中(这是您最初的问题)。很抱歉,但我不知道 $D$9、I82:AG82 或 H82 是从哪里来的。我怀疑“另一张纸”!$D$9 是 NPV functionrate 参数的来源,但我看不出当您将新值放入 D10 时 O7 会如何变化。
  • 我知道,这有点复杂。 D10 是指能源系统运行的小时数 - 每年都会改变现金流量。这意味着,NPV 结果的变化取决于变化的现金流,而变化的现金流取决于 D10。我希望这能得到更好的澄清。如您所说,$D9$ 保持不变,但 I82:AG82(现金流)随 AK4:AK8763 变化
【解决方案3】:

myRange 让事情变得不必要的复杂,试试这个:

Sub S()
   Dim i As Long, j As Long

   For i = 1 To 8763
      For j = 36 To 36'AJ=36
        Cells(i, j).Select
        Selection.Copy
        Range("D10").Select
        ActiveSheet.Paste
        Range("O7").Select
        Application.CutCopyMode = False
        Selection.Copy
        Cells(i, j).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
      Next j
   Next i
End Sub

【讨论】:

  • 我无法让您的 VBA 示例代码工作?它给出了关于“Flash Fill”的错误。另外,输出应该粘贴在它旁边的行中,所以我假设它应该是 Cells(i+1,j),对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多