在 Excel 2016 中使用 VBA 将选定范围移动到一列上

Posted

技术标签:

【中文标题】在 Excel 2016 中使用 VBA 将选定范围移动到一列上【英文标题】:Move selected range over one column with VBA in Excel 2016 【发布时间】:2018-01-17 14:48:36 【问题描述】:

我需要有能力

    在 A 列中查找值 选择该值及其上方的所有内容 在一列上偏移所有这些值

下面的代码就是这样做的——但是,我试图加快代码执行速度,而复制和粘贴操作会减慢它的速度。有没有办法在没有剪切/粘贴的情况下做到这一点?我想坚持使用 VBA(副公式),因为这是更大程序的一部分。

谢谢!

Sub FindValueAndAboveThenMoveOver ()
    Dim sht1 as Worksheet
    Set sht1 = Sheets("Convert")

    sht1.Columns("A:A").Find("XXXX"), LookIn:=xlValues).Select
    Range(ActiveCell.Offset(0, 0), "A1").Select
    Selection.Cut
    Range("B1").Select
    ActiveSheet.Paste
End Sub

【问题讨论】:

粘贴数据时,是只想要数据还是格式? 【参考方案1】:

剪切和粘贴没有问题,但您可以避免它,避免选择会加快速度。另外,您应该首先检查您是否找到了避免错误的内容。

Sub FindValueAndAboveThenMoveOver()

Dim sht1 As Worksheet, r As Range

Set sht1 = Sheets("Convert")
Set r = sht1.Columns("A:A").Find("XXXX", LookIn:=xlValues)

If Not r Is Nothing Then
    'should add sheet references here too
    With Range("A1").Resize(r.Row)
        Range("B1").Resize(r.Row).Value = .Value
        .ClearContents
    End With
End If

End Sub

【讨论】:

If 语句中,确保将Range() 链接到工作表(我假设sht1.Range(...))。 @BruceWayne - 是的,因此是我的评论。我没有添加一张表,以防万一是不同的。会看看 OP 说了什么,如果有的话。 哦,抱歉,我错过了评论。【参考方案2】:

这可能会稍微快一点:

Sub FindValueAndAboveThenMoveOver()

    Dim sht1 As Worksheet, r As Range
    Set sht1 = Sheets("Convert")

    With sht1
        Set r = Range(.Range("A1"), .Columns("A:A").Find("XXXX", LookIn:=xlValues))
    End With

    r.Offset(0, 1).Value = r.Value
    r.Clear
End Sub

【讨论】:

(别忘了Set r = .Range(...中的. @BruceWayne 如果里面的项目有 dots,你就不需要外面的 dot 哦,真的吗?酷,我不知道!不过想想也有道理。

以上是关于在 Excel 2016 中使用 VBA 将选定范围移动到一列上的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA删除范围内的空白行

使用 VBA 从 Access 表中将选定的列导入 Excel

从 Excel 调用 VBA 函数 - 在选定工作表上的选定列中查找

对 VBA 中的选定单元格执行修剪功能

Excel VBA获取选定数据透视表行的项目详细信息

为多个选定的 Excel 文件运行 vba