【问题标题】:Finding a cell based on the header of a section of data, then selecting the last row of that section根据数据部分的标题查找单元格,然后选择该部分的最后一行
【发布时间】:2017-05-24 02:22:42
【问题描述】:

我正在尝试根据单元格相对于单击的单元格的值来查找标题行的文本。我尝试执行此操作的方式如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim var1 As Variant
  Dim var2 As Variant
  Dim var3 As Variant
  Dim FormName As String
  FormName = "New Form"
  Static NewFormCell As Range
  Application.ScreenUpdating = False

  If Not Intersect(Target, Range("G16:X80")) Is Nothing Then
    If Target.Cells.Count = 1 Then
      var1 = Cells(Target.Row, 2).Value
      var2 = Cells(15, Target.Column).Value     
      If Not (IsEmpty(var1)) And Not (IsEmpty(var2)) And var2 <> "+" And Target.Interior.ColorIndex <> 2 And Target.Borders(xlEdgeLeft).LineStyle <> xlNone Then
        If IsEmpty(Target) Then
          Target.Value = "X"
          Target.HorizontalAlignment = xlCenter
          Target.VerticalAlignment = xlCenter
          Target.Font.Bold = True
          Dim Header As Range
          Set Header = Range("A54:E160").Find(var2, LookIn:=xlValues)
            Header.Offset(1, 1).End(xlDown).EntireRow.Select
          Dim CopyCell As Range

          'Header.End(xlDown).EntireRow.Insert
          'Set CopyCell = Header.End(xlDown). [offset?]
          'CopyCell.Value = var1
        Else
          Target.ClearContents
        End If
      Else
        Exit Sub
      End If
    End If
  End If
  Application.ScreenUpdating = True

End Sub  

问题是 VBA 抛出运行时错误 91(“对象变量或未设置块变量”)。然后它突出显示该部分代码中的最后一行。由于我在上一行中设置了该变量,因此我不确定为什么会收到此错误,或者我是否以正确的方式进行此操作。

任何意见将不胜感激!

编辑:我通过更广泛的搜索清除了上述问题。我要选择的单元格已合并,但我仍然假设该值存储在 A 列中。但是这段代码仍然没有完全按照我的意愿进行:

我想选择该部分的最后一行(不是工作表中的最后一行数据,而是 B 列中的最后一个连续数据),但现在我的代码一直跳到底部表。

【问题讨论】:

  • 这就是全部代码吗?您能否发布其余的相关代码(即任何声明等)。这是 worksheet_change 事件吗?你为什么要.Select一个单元格? (最好avoid using .Select/.Activate)你的范围内可能没有var2
  • sub 中还有许多其他 If 语句,但我已将上面的代码块更新为整个 sub 减去与此问题无关的 If 语句。在这种情况下,var2 返回“Mobile”,我的标题行具有以下公式 (=CONCAT(H15," Form")),其中 H15 是包含“Mobile”的单元格。因此,当我的 .Find 函数在公式中搜索时。
  • 哪一行会报错?您注释掉了一些行。
  • 在我设置了调用该变量的 Header 变量之后的任何一行。我尝试了一个简单的 MsgBox Header,也抛出了错误。
  • 您确定var2 在您指定的范围内吗?在Set Headerline 之后,添加Msgbox(h is Nothing) 并查看是否显示TRUEFALSE

标签: vba excel


【解决方案1】:

问题是您的.Find 没有找到价值。在这种情况下,您可以添加一些代码来处理。

...
Dim Header As Range
Set Header = Range("A59:A159").Find(var2, LookIn:=xlFormulas)

If Header Is Nothing Then
    ' There's no value found, so do something...
    msgbox(var2 & " was not found in the range, will exit sub now."
    Exit Sub
End If

MsgBox Header
...

...当然,您可以通过多种方式/事情来处理这个问题。如果您仍想执行其他代码,请将所有内容包装在 If Header is Nothing Then // 'do something // Else // 'other code // End IF 类型的东西中。

这真的取决于你想做什么。同样,您的错误是由于没有找到 var2 造成的,所以在这种情况下只需找到其他事情要做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多