【问题标题】:Compare less than today date & Autofill Issue比较小于今天的日期和自动填充问题
【发布时间】:2020-02-13 08:19:34
【问题描述】:

需要有关我的代码的帮助。我有两个问题。

  1. 第一个问题是我尝试让我的代码循环,如果第 1 列的空单元格和日期小于今天的日期
    And .Cells(rw, 1) < Format(dt, "dd-mmm")
    但是这个

  2. 第二个问题是我想从前一行的第 5 列自动填充到第 9 列。我一直遇到范围错误
    Set rng = .Range(.Cells(rw - 1, 5), .Cells(rw, 9)) Selection.AutoFill Destination:=rng, Type:=xlFillDefault

    Selection.AutoFill Destination:=Range(.Cells(rw - 1, 5), .Cells(rw 1, 5)), Type:=xlFillDefault

Sub DataGrab()
Dim rw As Long, x As Range, rng As Range
Dim extwbk As Workbook, twb As Workbook

Set twb = ThisWorkbook
Set extwbk = Workbooks.Open("D:\Users\Desktop\Report " & Format(Now, "DD-MMM-YYYY") & ".xls")
Set x = extwbk.Worksheets("Summary").Range("A4:AF100")

dt = Date

With twb.Sheets("Sheet1")
    For rw = 3 To .Cells(Rows.Count, 1).End(xlUp).Row
        If .Cells(rw, 2) = "" And .Cells(rw, 1) < Format(dt, "dd-mmm") Then
            .Cells(rw, 2) = Application.VLookup(.Cells(rw, 1).Value2, x, 23, False)
            .Cells(rw, 3) = Application.VLookup(.Cells(rw, 1).Value2, x, 29, False)
            .Cells(rw, 4) = Application.VLookup(.Cells(rw, 1).Value2, x, 31, False)
            Set rng = .Range(.Cells(rw - 1, 5), .Cells(rw, 9))
            Selection.AutoFill Destination:=rng, Type:=xlFillDefault
            'Selection.AutoFill Destination:=Range(.Cells(rw - 1, 5), .Cells(rw 1, 5)), Type:=xlFillDefault
        End If
    Next rw
End With
extwbk.Close savechanges:=False
End Sub

【问题讨论】:

  • 尝试将.Cells(rw, 1) &lt; Format(dt, "dd-mmm") 更改为.Cells(rw, 1) &lt; CLng(dt) 。 Excel 不关心日期格式。它将日期保持为Long...
  • @DirkReichel 仍然遇到Autofill method of Range class failed
  • @FaneDuru .Cells(rw, 1) &lt; CLng(dt) 是的,这个帮助。非常感谢。
  • @LeoEY:很高兴为您提供帮助!我会将我的评论转移到答案...如果您勾选代码左侧的复选框,这会将其设置为接受的答案...
  • @FaneDuru 非常感谢。是的,标记在评论上打勾。剩下的第二个问题要排查

标签: excel vba


【解决方案1】:

尝试将 .Cells(rw, 1) &lt; Format(dt, "dd-mmm") 更改为 .Cells(rw, 1) &lt; CLng(dt) 。 Excel 不关心日期格式。它保持和操作日期为 Long。

【讨论】:

    【解决方案2】:

    (由于无法评论,我会通过答案来做)

    首先,您应该在模块的开头添加Option Explicit。 (这会迫使您在给变量赋值之前创建变量)

    接下来,您有 .Cells(rw, 2) = " " 我假设您正在尝试获取该单元格的值?

    如果您在代码中添加MsgBox .Cells(rw, 2),您会看到它不会返回该单元格的值。这就是为什么你需要使用.Cells(rw, 2).Value

    此外,我们不会使用 " " 而是使用 if IsEmpty(.Cells(rw, 2).Value) 检查空单元格

    这应该会把你推向正确的方向:)

    【讨论】:

    • .Value 可以为空。我只是在一张纸上检查了它:)
    • @Nemoko 我尝试使用.Cells(rw, 2) = " "' 它不起作用,但如果.Cells(rw, 2) = "" "" 之间没有空格,那么它会起作用。至于日期,我将我的代码从Format(dt, "dd-mmm") 更改为CLng(dt),现在它可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2019-03-03
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多