【问题标题】:Excel VBA Macro runs fine in debugger but error in full runExcel VBA 宏在调试器中运行良好,但在完全运行时出错
【发布时间】:2016-06-04 02:03:04
【问题描述】:

我在运行以下代码时遇到的问题是,当我完整运行宏时(通过按 F5、从分配给它的按钮调用它或从宏栏运行它)我收到:

运行时错误“91”:对象变量或未设置块变量。

但是,当我逐行运行调试器时,代码运行得非常好。在下面的代码中,调试器期间突出显示的行在星号“...code...”和 LastRow.Sheet1.Columns...

中概述

这个宏的基本前提是它会自动对列进行排序,以确保条目位于我在另一张工作表上的表单控制列表框的顶部。第二部分代码(“PopulateListBox”下方)旨在将这些数据点拉入列表框中。

如果您能提供任何帮助,我将不胜感激。

代码:

Sub Filter
  Sheet2.Select
  ActiveWorkbook.Worksheets("Data").Autofilter.Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("Data").Autofilter.Sort.SortFields.Add _
    Key:=Range("K2"), SortOn:=xlSortOnValues, Order:=xlDescending, _
    DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("Data").Autofilter.Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With
  Sheet1.Columns("M").ClearContents
  Sheet2.Columns("Z").ClearContents
  Sheet1.Columns("L").Copy
  Sheet1.Columns("M").PasteSpecial xlPasteValues
  Sheet2.Columns("Z").PasteSpecial xlPasteValues
  SendKeys ("{ESC}")
  Sheet1.Range("M1") = "Hardcoded Values"
  Sheet2.Range("A1").Select
  'PopulateListBox
  Set lb = Sheet2.Shapes("List Box 1")
  Dim LastRow As Integer
  **LastRow = Sheet1.Columns("M").Find("*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows, LookIn:=xlValues).Row**
  'MsgBox LastRow 'used to verify the above code was working correctly, commented out to speed up process
  lb.ControlFormat.RemoveAllItems
  lb.ControlFormat.ListFillRange = "Z2:Z" & LastRow
End Sub

【问题讨论】:

  • 哪一行?没有加粗的。
  • 而不是SendKeys ("{ESC}") 使用Application.CutCopyMode = False
  • 嗨,斯科特,我很抱歉。我试图对代码应用粗体,但它没有用。有问题的行靠近底部并以 LastRow.Sheet1.Columns 开头,并由星号(代码中不存在)勾勒出来。
  • 既然你知道这个专栏,试试这个,LastRow = Sheet1.Range("M" & Sheet1.Rows.Count).End(xlUp).Row
  • 嗨,斯科特,感谢您的帮助!您的第二个建议没有解决问题,但您从 SendKeys ("{ESC}") 移动到 Application.CutCopyMode = False 的第一个建议成功了。我不太确定为什么,如果你能解释一下那就太好了!否则,谢谢你的建议!你帮我省了很多麻烦。

标签: vba excel macros


【解决方案1】:

我可以猜测,为了删除过滤器,必须确保它已经在工作表中设置。 如果工作表“数据”中没有过滤器,则删除它的行将返回错误。因此,我建议在此行之前插入一行:

On Error Resume next

因此,在“删除过滤器”行之后,我会写

On Error Goto -1

【讨论】:

  • 您好乔安娜,感谢您的建议!不幸的是,这并没有解决问题。 Scott 从 sendkeys ("{ESC}") 切换到 Application.CutCopyMode=False 的第一个建议是修复它的关键。不太清楚为什么会有帮助,但确实有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多