【问题标题】:VBA Selection.offset(0,18) as an object, but it moves too farVBA Selection.offset(0,18) 作为对象,但它移动得太远
【发布时间】:2022-01-12 23:31:40
【问题描述】:

我的 vba 代码要求我向右移动 18 个单元格。 由于我经常使用“Selection.offset(0,18)”,所以我决定变成一个变量。 但每次我使用“MoveEighteen.select”时,它都会向右移动大约 50 个单元格。这只发生在 IF 语句之后。第一个 MoveEighteen 运行良好。

   Dim AnchorDate As Range
    Dim CompareDate As Range
    Dim MoveEighteen As Range
    Set AnchorDate = Range("b2")
    Set MoveEighteen = Selection.Offset(0, 18)

    Range("B2").FormulaR1C1 = "=int(NOW())"
    Range("B2").Copy
    Range("B2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("B5").Select


    If Selection = AnchorDate Then
    MoveEighteen.Select

    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    ActiveCell.Offset(1, -3).Select`


    Do Until Selection <> AnchorDate
    MoveEighteen.Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    'go tonext date
    ActiveCell.Offset(1, -3).Select
    Loop
    
    Else: Selection.Select
    
    Else: Selection.Select
        If Selection < AnchorDate Then
            Do Until Selection = AnchorDate
            Selection.Offset(1, 0).Select
            Loop
        End If
        
        If Selection = AnchorDate Then
        MoveEighteen.Select
        Range(Selection, Selection.End(xlToRight)).Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False`

【问题讨论】:

  • Set MoveEighteen = Selection.Offset(0, 18) - 这只会运行 一次,所以你的 MoveEighteen 将始终是相同的范围。修复代码的最佳选择是不使用 Select/Activate。 stackoverflow.com/questions/10714251/…

标签: excel vba object offset


【解决方案1】:

可能不明白你是如何使用它的,但是把它变成一个变量使它成为静态的,你可能想要一个函数来代替?

Function MoveEighteen(target As Range) as Range
Set MoveEighteen = target.offset(0,18)
End Function

我认为引用的无法解释的移动是您粘贴命令的结果?我知道当你粘贴时公式会做那种事情,但不确定 VBA 是否也会这样做。经过测试,不确定是不是这样。

【讨论】:

  • 我意识到将其设置为对象只会起作用一次。每次我想使用 MoveEighteen 时,我都必须设置 MoveEighteen……这违背了使用 MoveEighteen 的目的。有什么方法可以确保 set 对象在使用后不会删除其值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2021-07-06
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多