首页 > 解决方案 > 范围函数将数据发送到错误的行

问题描述

我正在尝试将数据添加到工作表中,虽然我知道我已经“正确”设置了 Range 函数(对于正确的值,包括“每隔一段时间工作一次”),而不是标记第 1 行,而是标记行2,并将第 2 行中的计算移至第 3 行。这仅是此工作表中此模块的问题。

我已经尝试过调试工具,但它们不会改变结果或在任何地方中断。第一行隐藏了,也没有冻结。无论我是否在范围调用之后附加“.value”,都会发生这种情况。

奇怪的是,第二组标签和计算(从“With Calcs.UsedRange”开始)最终出现在正确的单元格中。下面的代码:

Sub CalcGDD()
'Initialize
    Dim nb As Workbook
    Dim Clim, Vars, CC, Calc As Worksheet
    Dim LRow, RowL As Long

'Setup
    Set nb = ActiveWorkbook
    Application.ScreenUpdating = False
    Set Vars = nb.Sheets("Variables")
    Set CC = nb.Sheets("CoverCrop")
    Set Calcs = nb.Sheets("Summary")
    Set Clim = nb.Sheets("Climate")


'Calculations in Climate Sheet
    With Clim.UsedRange
        LRow = Cells(Rows.Count, "A").End(xlUp).Row
        .Range("H1") = "Plant Day"
        .Range("I1") = "Harv Day"
        .Range("J1") = "Fall GDDs"
        .Range("K1") = "Spring GDDs"
        .Range("H2:H" & LRow & "").FormulaR1C1 = (...calculations elided...)
    End With

'Summarize
    RowL = CC.Cells(Rows.Count, "A").End(xlUp).Row
    With Calcs.UsedRange
        .Range("A1") = "Year"
        .Range("B1") = "Fall GDD"
        .Range("C1") = "Spring GDD"
        .Range("D1") = "Total GDD"
        .Range("A2:A" & RowL & "").FormulaR1C1 = (...calculations elided...)

    End With
End Sub

为什么 Range("H1") 打印到 H2 的任何想法?非常感谢。

标签: excelvba

解决方案


.UsedRange可能会抵消您的寻址。With在两个语句中删除它。如果UsedRange从第 2 行开始,则"A1" in that range指的是该范围内的左上角单元格。如果您想写入绝对单元格地址A1(即不相对于UsedRange开始位置),请改用实际的工作表单元格。

'Calculations in Climate Sheet
    With Clim.UsedRange
        LRow = Cells(Rows.Count, "A").End(xlUp).Row

Cells呼吁隐含地与发生的任何ActiveSheet事情背道而驰。Worksheet使用您要使用的对象来限定它- 在这种情况下,很可能是With块变量:

'Calculations in Climate Sheet
    With Clim
        LRow = .Cells(Rows.Count, "A").End(xlUp).Row

查看Rubberduck(我管理的免费、开源 VBIDE 插件项目)是否可以发现更多隐式 ActiveSheet 引用(以及代码中的其他潜在问题,例如这些隐式 Variant 变量

Dim Clim, Vars, CC, Calc As Worksheet
Dim LRow, RowL As Long

还:

无论我是否在范围调用之后附加“.value”,都会发生这种情况

这是因为如果未指定.Value成员调用是隐式的。


推荐阅读