代码之家  ›  专栏  ›  技术社区  ›  Demethostes90

定义“最后一行”值(在每周增长的图纸上)并在Range对象中使用

  •  0
  • Demethostes90  · 技术社区  · 1 年前

    再见,谢谢你抽出时间

    我正在开发一个工具,该工具旨在对一大块原始数据进行大量重格式化。数据大约有86列宽,这些列是固定的,不会增长。然而,这些行大约有176000行,每周增长几百行。

    鉴于我的技术水平极低,我将手动格式化过程记录为宏,并将其缩减为大约360行代码。我意识到这可以更好地优化,但我真正关心的只是Range()对象的一个问题。

    我的格式设置与“自动填充”工具配合得很好,在录制的代码中,它通常读起来是这样的:

    Selection.AutoFill Destination:=Range("J2:J176413")
    

    问题是,随着原始数据表每周的增长,最后一行J的数字将大于176413,并且宏不会自动填充或以其他方式格式化最新的行。

    为了解决这个问题,我强行使用了我的工具的第一个版本,在每个实例中手动将此行的值增加到250000,这为我争取了时间。例如

    Selection.AutoFill Destination:=Range("J2:J250000")
    

    它是有效的,但效率相当低,会生成大量的空白行,这些行只会减慢工作表的速度,尤其是在应用过滤器后试图向上滚动时。

    我追求的是什么 是在我的Sub开始时将最后一行(最新的)数据定义为变量的一种方式,然后在Range对象的整个宏中使用它,这样AutoFill就不会再往下走了。

    我的愿望的伪代码说明如下:

    Dim LastRowValue = Range("A1").SpecialCells(xlLastCell).Row
    
    code code code
    
    Selection.AutoFill Destination:=Range("J2:J**LastRowValue**")
    
    

    这样它就知道每次自动填充的最后一行是什么,而不必每周手动更新宏,也不必强行使用一些任意大的数字。

    我的技能非常有限,所以如果可能的话,我会寻求最短/最容易理解的解决方案-我已经从最终用户那里对宏进行了防白痴处理(密码保护,在使用过程中锁定屏幕,如果他们尝试任何愚蠢的事情,会有很多错误故障保护),所以我不需要优雅,只需要简单

    请提前感谢!

    以下尝试失败:

    我已经尝试过这样定义最后一行,但似乎无法获得在Range对象内部使用它的正确语法

       Dim LastRowChecker As Long
       Dim LastColumnChecker As Long
       LastColumnChecker = Range("A1").SpecialCells(xlLastCell).Column
    
    
       Set LastRowChecker = Range("A1").SpecialCells(xlLastCell).Row
       Dim LastRowValue As Range
       Set LastRowValue = Cells(1, 1).Resize(LastRowChecker, LastColumnChecker)
       
       
       MsgBox LastRowValue
    
    

    我似乎无法让Range对象使用LastRowChecker,当我试图借用Dim变量LastRowValue的值设置为Range时,它会生成一个错误,可能是关于不匹配的变量类型

    1 回复  |  直到 1 年前
        1
  •  0
  •   taller    1 年前
    • 假设列A可以用于确定最后一个行号。如果不是,请调整中的第二个参数 .Cells(.Rows.Count, 1) 如有必要。

    Microsoft文档:

    Range.End property (Excel)

    请尝试。

    With ActiveSheet ' modify as needed '
        Dim LastRowValue as Long
        LastRowValue = .Cells(.Rows.Count, 1).End(xlUp).Row
    
        ' code code code
    
        Selection.AutoFill Destination:=Range("J2:J" & LastRowValue)
    End With