当前位置: 首页 > 知识库问答 >
问题:

避免在具有可变范围的VBA Excel宏中选择

万俟亦
2023-03-14

我按照问题中的建议如何避免在Excel VBA宏中使用Select,但仍然得到“应用程序定义的或对象定义的错误”。

这是我的最后一个版本:

    Counter2 = 17
    For Counter1 = 12 To 150

    Dim S As Worksheet
    Dim R As Worksheet
    Dim SL As Range
    Dim RL As Range
    Set R = Sheets("Front")
    Set S = Sheets("CHECK LIST")
    Set SL = S.Range(Cells(Counter1, 1), Cells(Counter1, 10))
    Set RL = R.Range(Cells(Counter2, 1), Cells(Counter2, 10))

    Set curCell = Worksheets("CHECK LIST").Cells(Counter1, 6)
    Set checkCell = Worksheets("Front").Cells(3, 5)
        If curCell.Value = checkCell.Value Then

            With S
                .SL.Copy
            End With

            With R
                .RL.PasteSpecial
            End With

            Counter2 = Counter2 + 1

        End If
Next Counter1

这是否与范围中变量(Counter1、Counter2)的使用有关?

共有1个答案

田晨
2023-03-14

错误可能是由此代码块中的copypastespecial行引起的:

        With S
            .SL.Copy
        End With  
        With R
            .RL.PasteSpecial
        End With

一旦设置了一个范围变量,Excel就知道哪个工作表和哪个工作簿包含该范围变量。如果要对范围执行某些操作,则不需要包含工作表。因此,在您的代码中,您只需使用

SL.Copy
RL. PasteSpecial

考虑一下循环内部是否有应该在外部的代码,这总是一个好主意。在您的代码中,您在循环中设置工作表变量,但这应该在循环之前完成一次。在您的文章中添加评论,您的代码应该更改为:

Dim S As Worksheet
Dim R As Worksheet
Set R = Sheets("Front")
Set S = Sheets("CHECK LIST")

Counter2 = 17
For Counter1 = 12 To 150

    Dim SL As Range
    Dim RL As Range
    Set SL = S.Range(S.Cells(Counter1, 1), S.Cells(Counter1, 10))
    Set RL = R.Range(R.Cells(Counter2, 1), R.Cells(Counter2, 10))

    Set curCell = Worksheets("CHECK LIST").Cells(Counter1, 6)
    Set checkCell = Worksheets("Front").Cells(3, 5)
    If curCell.Value = checkCell.Value Then

        SL.Copy
        RL.PasteSpecial

        Counter2 = Counter2 + 1
    End If
Next Counter1

pastespecial方法有几个参数

.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, _
            Transpose:=False

如果你不使用这些,那么也许你可以做一个“正常”复制和粘贴?

SL.Copy RL
 类似资料:
  • 我有一个带有道具的组件,我想将值从false修改为true,但我有一个消息表单chrome控制台 在父组件中,我有一个函数(myFunction),它接受一个参数(value)。 我需要像这样保留我的参数,但我还需要从子组件检索emit的值,以更改myData的值,而不改变child中的props。 https://codesandbox.io/s/distracted-wiles-w8vwf 谢

  • 我得到警告: app.js:87486[Vue警告]:避免直接更改prop,因为每当父组件重新呈现时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。被变异的道具:“喜欢计数” 我的刀锋 Vue代码

  • 问题内容: 我有一个从或指令属性或任何其他属性中获得的字符串,我想基于此在作用域上创建一个变量。所以: 但是,如果字符串包含一个或多个点,我想将其拆分并实际上“向下钻取”到作用域中。所以应该成为。这意味着简单版本不起作用! 在读取基于字符串的变量时,您可以通过做来获得这种行为,但是在分配值时如何实现呢? 问题答案: 我发现的解决方案是使用$ parse。 “将Angular表达式转换为函数。” 如

  • 问题内容: python中最小和最大的值是什么? 问题答案: 看到这篇文章。 帖子的相关部分:

  • 我正在学习RxJava,但我遇到了避免可变状态的问题。 我正在解决的问题很简单:有一个条目的输入流和一个条目组的输入流。每个项目都属于一个组(有一个组标识符),并且有一些数据。每个组都有一个标识符和一些数据。许多项目可能属于同一组。目标是将这些输入流组合成一个(项、组)对的输出流,以便: 只有当项目及其组都已知时,才会发出(项目,组)对 每次接收更新的项目数据时,必须发出更新的(项目、组)对 当接

  • 我有一个问题与我的道具editToWork: app.js:42491[Vue warn]:避免直接修改道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具正在变异:“任务编辑” 组件TaskComponent.vue 组件EditTaskComponent: