Excel VBA:如何为范围内的每个值创建循环并保存输出?

时间:2015-04-16 08:24:42

标签: excel vba loops

我正在尝试在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。

添加了更正后的版本

3 个答案:

答案 0 :(得分:1)

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

myRange.Cells(i, j).Select

我认为应该这样做,我还没有真正检查它是否在逻辑层面工作,只是确保它编译。 你有两条线。


如果我没有弄错的话 - 我还是新手帮助别人,

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

有问题 - 您必须使用'&'添加变量。在这样的代码中:

Range("myRange.Cells(" & i & ", " & j & ")").Select
希望有所帮助。

答案 1 :(得分:0)

你正在使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

答案 2 :(得分:0)

据我了解,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

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