首页 文章

VBA从循环中的变量中检索单元格值

提问于
浏览
0

我一直有一些问题从VBA中的宏获取我想要的数据 . 我对VBA很新,所以我可能会错过一些更容易的选项但是对于我的生活我找不到它 .

所以我需要做的是以下内容:

如果日期值小于60,则拉出单元格的值 . 我使用今天的日期 - 一年并将其设置为变量LDate . 将LDate与单元格值进行比较(这些单元格将始终为日期,因此我认为我不需要检查它们是否为日期) . 如果单元格值<= 60,那么我需要从行中的4个单元格中提取信息 . 这些单元格值中的每一个都分配给一个公共变量,然后用于稍后向适当的人发送电子邮件 . 在其他3列上重复此过程以获取每列中所需单元格的单元格值,然后对这4个值中的每一个使用datediff并检查其中哪些(如果有)小于60并根据以下内容构建电子邮件需要发送什么信息 .

这是我正在检查值以发送正确的电子邮件:

If ExampleHold_diff <= 60 And ExampleHold1_diff <= 60 And ExampleHold2_diff <= 60 And ExampleHold3 <= 60 Then
    Mail_Result = "Letter 1: " & ExampleHold_diff & vbNewLine & "Letter 2: " & ExampleHold1_diff & vbNewLine & "Letter 3: " & ExampleHold2_diff & vbNewLine & "Letter 4: " & ExampleHold3_diff

使用相同的选项减去其中一个示例值将重复上述检查,直到所有选项都用完为止 .

无论如何,我已经成功地让宏改变所有背景颜色取决于datediff(告诉我它正在处理所有内容),但是当报告每个单元格值时,它只报告最后一个单元格 . 范围 . 我知道它只是处理范围内的每个单元格,这就是为什么我只获取最后一个单元格值,我只是不明白如何在覆盖之前获取我需要的值 .

For Each Cell in Example_rng 'This same loop is used 3 other times with the only difference being the variables

    ExampleStart = Cell.Value
    If DateDiff("d", LDate, ExampleStart) <= 60 Then
        ExampleHold = Cell.Value 'This is the most important value that I need to retrieve. It determines the content of my email.
        PriExInf = Range("A" & ActiveCell.Row)
        AltExInf = Range("B" & ActiveCell.Row)
        ExNum = Range("C" & ActiveCell.Row)
        Cell.Interior.Color = RGB(255, 200, 205)
    ElseIf DateDiff("d", LDate, ExampleStart) > 60 And DateDiff("d", LDate, ExampleStart) < 180 Then
        Cell.Interior.Color = RGB(253, 251, 194)
    ElseIf DateDiff("d", LDate, ExampleStart) >= 180 Then
        Cell.Interior.Color = RGB(198, 250, 194)
    End If

Next Cell

我想我需要做一个For Each循环并将其他For Each循环嵌套在里面?或者也许是Do While循环?我已经尝试了这两个以及使用数组来保存所有的单元格值,然后引用它,我认为可以工作,但我没有太多运气调用数组中的数据,这可能只是我缺乏这方面的经验 .

这是我的范围(这些将永远不会改变,但范围内的数据将每周或每两周更改):

Dim Example_rng As Range
Set Example_rng = Worksheets("sheet1").Range("D2:D87")

Dim Example1_rng As Range
Set Example1_rng = Worksheets("sheet1").Range("E2:E87")

Dim Example2_rng As Range
Set Example2_rng = Worksheets("sheet1").Range("F2:F87")

Dim Example3_rng As Range
Set Example3_rng = Worksheets("sheet1").Range("G2:G87")

任何帮助和/或提示将不胜感激 . 让我知道我需要提供哪些信息,以帮助您制定最佳答案 .

1 回答

  • 0

    将所有“ActiveCell”引用更改为“Cell”:

    PriExInf = Range("A" & Cell.Row)
    AltExInf = Range("B" & Cell.Row)
    ExNum = Range("C" & Cell.Row)
    

    这,因为“ActiveCell”引用工作表中当前“活动”的单元格,并且在任何“选择”语句之后发生更改

    当您使用“Cell”作为循环变量循环遍历某个范围时,那么这是您需要使用的参考

相关问题