将数组中的值与范围内的值进行比较,如果相等,则插入公式

时间:2015-07-08 13:53:05

标签: arrays excel vba

我试图将范围中的值与数组中的值进行比较。如果值相等,我想在列" O"中插入一个公式。在单元格的相应行中,该行的范围等于数组中的值。数组中的每个值都有一个相应的公式,但为了简洁起见,我只在下面的代码中包含了第一个公式。当我运行代码时,我没有收到任何错误消息,但是列" O"未填充任何数据。有关我的代码出错的地方的任何建议吗?我对数组很新。

Sub ScenarioData2()
    Dim arr1 As Variant, result As String, r As Long, rng As Range
    arr1 = Array(11, 12, 13, 14, 15, 16, 21, 22, 23, 24, 25, 26, 31, 32, 33, 34, 35, 36)

    Set rng = ThisWorkbook.Worksheets("Model2").Range("AJ3:AJ14458")

    Dim lastrow As Long
    lastrow = Cells(Rows.Count, 1).End(xlUp).Row

    For Each rng In ThisWorkbook.Worksheets("Model2").Range("AJ3:AJ14458")
        If rng.Value = arr1(11) Then
            With Sheets("Model2")
                For r = 3 To lastrow
                .Cells(r, "O").FormulaR1C1 = "=IF(R[]C[-6]<10,10,IF(R[]C[-1]>45,45,R[]C[-1])"
                Next r
            End With
        'Else
        End If
    Next rng

    End Sub

非常感谢您的帮助。

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:0)

您的代码首先将rng设置为等于特定标识范围(AJ3:AJ14458)。然后,您的代码会要求循环运行每个&#39; rng&#39;在ThisWorkbook.Worksheets(&#34; Model2&#34;)中。范围(&#34; AJ3:AJ14458&#34;)。只有1&#39; rng&#39;在ThisWorkbook.Worksheets(&#34; Model2&#34;)。范​​围(&#34; AJ3:AJ14458&#34;)中,因为您已经将rng定义为整个工作表。

事实上,你不需要设置“#”;等于任何东西。而是简单地将其定义为范围;即:

  

dim rng as Range

然后,当您执行循环时,ThisWorkbook.Worksheets(&#34; Model2&#34;)。范​​围(&#34; AJ3:AJ14458&#34;)将遍历每个&#39;范围&#39;在该区域内(即:它将通过每个单元格)。

将来,在检查代码是否存在类似错误时,请考虑的不仅仅是是否出现实际错误消息;当您希望找到所需的结果时,让代码给您一条消息 - 然后您可以检查实际计算的结果。例如,在你的&#34;如果rng.value = ...&#39;,在下一行放置:

  

debug.print rng.value

如果找到您的值,则会弹出一条消息。在这种情况下,虽然您的代码没有错误,但它也没有找到您的价值。所以,你知道你的问题不在你的#Cells中(r,&#34; O&#34;)。FormulaR1C1 = ...&#39;行,它在你的搜索方法中。

编辑关于如何告知找到的单元格插入公式,似乎还存在两个问题。应该如下:

If rng.Value = arr1(11) Then

            For r = 3 To lastrow
                Sheets("Model2")).Range("O" & r).FormulaR1C1 = "=IF(R[0]C[-6]<10,10,IF(R[0]C[-1]>45,45,R[0]C[-1]))"
            Next r
End If

请注意,我已经为公式本身添加了一个结束括号,我已经提到.Range(&#34; O&#34;&amp; r)[在循环期间简化为O4,O5等] ,你提到.Cells(&#34; O&#34;,r) - 其中O是一个字母而不是一个数字,所以单元格功能找不到你所指的单元格。

这对我有用,所以如果它不首先检查以确保你在AJ栏的某个地方确实有26个输入(数字格式,而不是文本格式)。

答案 1 :(得分:0)

它可能是您的.FormulaR1C1格式。我以前从未使用过它。你确定这是你想要使用的。我以前很容易使用过简单的.Formula。

也是小费。我曾经不得不硬编码我的范围,直到我找到usedRange。

所以这个

For Each rng In ThisWorkbook.Worksheets("Model2").Range("AJ3:AJ14458")

可以简单地替换为

Do While lRow <= ws.UsedRange.Rows.Count

这是整个循环。

lRow = 1
Do While lRow <= ws.UsedRange.Rows.Count

    'Do stuff here

lRow = lRow + 1
Loop

希望将来您的编码更容易。