【问题标题】:How to self reference a cell in VBA如何在 VBA 中自引用单元格
【发布时间】:2018-01-30 14:19:21
【问题描述】:

我有 600k 行并且想要删除起始和尾随空格。我有以下内容,但速度很慢:

Sub Macro1()
'
' Macro1 Macro
'

'
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "=TRIM(RC[-1])"
    Range("D1").Select
    Selection.AutoFill Destination:=Range("D1:D4")
    Range("D1:D4").Select
    Columns("D:D").Select
    Selection.Copy
    Range("C1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Columns("D:D").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("C1").Select
End Sub

有没有一种方法可以将函数应用到自身上。我想避免在空列中运行函数,然后将值复制到原始列。

我尝试了VBA to fill formula down till last row in column 以及加快公式。我有几列要做这个,想知道是否可以只处理 C 列并修剪空白而不需要额外的计算。

谢谢

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这不使用第二列,而是执行 C 列中的所有值。它将值移动到数组中,迭代数组并修剪多余的空间,并用数组覆盖 C 中的值。

    Sub macro1()
    Dim rng As Variant
    Dim ws As Worksheet
    Dim i As Long
    
    Set ws = Worksheets("Sheet1") 'Change to your sheet name.
    
    With ws
        rng = .Range("C1", .Cells(.Rows.Count, 3).End(xlUp)).Value
        For i = LBound(rng) To UBound(rng)
            rng(i, 1) = Application.Trim(rng(i, 1))
        Next i
        .Range("C1", .Cells(.Rows.Count, 3).End(xlUp)).Value = rng
    End With
    End Sub
    

    【讨论】:

    • 我设置了一些虚拟数据来尝试,并在进入定义 rng 的行时出现错误:“运行时错误'9':下标超出范围”
    • 它对我有用,没有错误。您确定将"Sheet1" 更改为您的工作表名称并且您正在查看C 列吗?
    • 关闭 VBA 并重新启动。现在工作。不知道为什么会出现上述错误。确实很奇怪。 Excel :?
    【解决方案2】:

    像这样更改代码,这样您就不会使用Select。使用SelectSelection 会大大降低一切速度。

    Sub Macro1()
        Range("D1").FormulaR1C1 = "=TRIM(RC[-1])"
        Range("D1").AutoFill Destination:=Range("D1:D4")
        Columns("D:D").Copy
        Range("C1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
        Columns("D:D").ClearContents
    End Sub
    

    【讨论】:

    • 可以分三行完成:Range("D1:D4") .FormulaR1C1 = "=TRIM(RC[-1])":Columns("C:C").Value = Columns("D:D").Value:Columns("D:D").ClearContents
    • @ScottCraner 工作得很好,而且不会让我的系统太慢!喜欢它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多