【问题标题】:VBA Runtime Error 1004 “Application-defined or Object-defined error” when setting Range in macro在宏中设置范围时 VBA 运行时错误 1004“应用程序定义或对象定义错误”
【发布时间】:2017-09-22 02:02:31
【问题描述】:

我要先说我对 VBA 很陌生,这是我第一个使用它的项目,但是我正在努力,因为否则它是手动复制粘贴 ~200 次。

不幸的是,对于第一个项目来说,这很困难。

为清晰而编辑(希望如此):主要思想是我需要从下拉列表的开头开始,复制列出的第一个字符串,然后将该字符串粘贴到该列中。这将更改右侧相邻的数值数据。然后我想选择这个新更改的数字数据并将其复制并粘贴到同一工作簿中 F 列第一个空白处的不同工作表中。然后我希望代码遍历下拉列表并对所有 51 执行此操作下拉列表中的字符串。但是,每次迭代都需要将偏移量粘贴 3 列,以将数据复制到另一张表中的正确列。

这是我目前的代码

Option Explicit

Sub PtComp()
'
' PtComp Macro
'

'
Dim List1 As String
Dim Range1 As Range
Dim Line1 As Range
Dim i As Integer
Dim Begin As Range


ActiveWorkbook.Sheets("Sample Data Summary").Activate
List1 = Selection
Set Range1 = Evaluate(ActiveSheet.Range(List1).Validation.Formula1)
For Each Line1 In Range1
    Selection.Copy
    ActiveSheet.Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    ActiveCell.Offset(0, 1).Select
    ActiveSheet.Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    ActiveSheet.Selection.Copy
    ActiveWorkbook.Sheets("Pt Comparison").Activate
    Begin = ActiveSheet.Range("F1").End(xlDown).Offset(-1, 0)
    For i = 0 To 148 Step 3
    Begin.Offset(0, i).Select
    ActiveSheet.PasteSpecial Paste:=xlPasteValues
    Next i
    Next Line1

End Sub

它突出显示了这一行

Set Range1 = Evaluate(ActiveSheet.Range(List1).Validation.Formula1)

任何帮助将不胜感激。对不起,如果我的代码是垃圾,就像我说的,第一次希望变得更好。

编辑:此外,我回顾了具有相同错误的旧问题,并认为这可能是因为不清楚我试图在哪个工作表中定义范围,因此我的代码中充满了“ActiveSheet”但仍然没有运气。

【问题讨论】:

  • 你觉得你用这条线得到了什么:List1 = Selection?
  • 在您的 List1 = Selection 行之后使用 msgbox List1。作为初学者,msgbox 是您的朋友……您可以在程序运行时打印到屏幕上。另外,学习使用调试器......它会让你知道你的变量在做什么以及你的逻辑是如何流动的。我怀疑 List1 没有合适的范围。
  • msgbox 更进一步的是ImmediateLocalsWatch 窗口。它们对于高效调试至关重要。
  • 更喜欢 Debug.PrintDebug.Assert 调用而不是 MsgBox 调用...
  • @ScottCraner 我在启动子时将 List1 定义为当前选择。因为我希望它从不同的位置开始。这本工作簿有大量数据,我仍在添加,每次添加后,我必须手动更改下拉列表并将粘贴复制到另一张工作表。运行并点击调试并突出显示 List1 后,它会显示所选单元格中的值,这也显示我是否在该行之后放置了 msgbox List1

标签: vba excel


【解决方案1】:

您的代码假定List1 包含一个有效的范围地址,因此该"Sample Data Summary" 工作表上的活动单元格包含一个有效的范围地址。

显然并非总是如此。搜索关于错误声明的更多详细信息,了解如何处理这种情况。

您需要阅读 How to avoid using Select in Excel VBA macros,并知道 clipboard operations in a tight loop 几乎是您在 Excel-VBA 中可以做的最慢的事情。


看来你想要这样的东西:

Set Range1 = Evaluate(Selection.Validation.Formula1)

您的代码在Range(List1) 上崩溃了,因为List1 不包含有效的范围地址。

【讨论】:

  • 所以我在这里的困惑就像我说这需要从不同的位置开始。即使定义List1 = Range("C168")(当前选择的单元格),我也会遇到同样的错误。编辑:我是否可能遇到错误,因为我希望范围是 C168 下拉列表中包含的值?我将如何定义它?
  • List1 = Range("C168") 然后Evaluate(ActiveSheet.Range(List1) 假定Range("C168") 包含有效的范围地址。 List1 到底应该是什么?
  • List1 只是我设置的试图包含下拉列表值的变量。几乎 C 中的每个单元格都有这个字符串下拉列表,然后更改 D 中相邻单元格中的值。我非常想复制 this post 迭代下拉列表。
  • @gbs6146 要明确:您的代码希望 List1 包含有效的范围地址,而不是事物列表,不是字符串,除了范围地址(或命名范围)。
  • 好的,我该如何解决这个问题,或者我应该怎么做才能让它识别下拉列表中的其他字符串?我需要它遍历列表中的每个字符串,然后复制相邻列中的数据吗?很抱歉,就像我说的,我对 VBA 非常陌生。
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多