【问题标题】:'End(xlDown)' acting weird'End(xlDown)' 行为怪异
【发布时间】:2012-12-12 20:33:48
【问题描述】:

我怀疑.end(xlDown) 的行为有点奇怪。

Dim rfound As Range

Set rfound = Columns("B:B").Find(What:=Me.ComboBox1.Value, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)

If ComboBox1.Value <> "" And WorksheetFunction.CountIf(Range("B:B"), _
ComboBox1.Value) > 0 And rfound.Offset(0, 1).Value <> "" Then
rfound.Offset(0, 1).End(xlDown).Offset(1, 0).Value = TextBox1.Value

CommandButton1_click 上,代码将在 B 列中搜索任何匹配的条件,然后在我的条件都满足的情况下将OffSet 搜索到右侧单元格。但是,它提示我一条消息Run-time error '1004': Application defined or object-defined error

我不知道问题出在哪里。举例说明:

【问题讨论】:

  • 请给我一点时间考虑答案。谢谢。
  • 通过使用.end(xlUp),参考我上一张图,如果我想在'Company A'中插入'Product'和'Description',是无法实现的。
  • 好吧,在我们指出您的代码有什么问题之后,您编辑了您的问题 - 我们几乎无法猜测您会事先修改。如果您期望得到持续的帮助,那么我认为您应该适当地对待那些帮助您的人。
  • 我想我不应该如此急切地编辑我的问题。我会将我的问题改回没有编辑的状态。是的,我确实应该在提出任何问题时修改自己,感谢@brettdj 的提醒

标签: vba excel row offset


【解决方案1】:

我的三分钱...

美妙之处不在于编写复杂的代码,而是将其分解为易于理解的行,以便更容易理解代码的作用。如果发生错误,它也有助于调试它......

  1. 您已经知道您必须写信给 Col C,所以为什么要使用 Offset 让它变得更复杂
  2. 测试 rfound 是否按照 brettdj 的建议存在
  3. 使用xlUp 查找最后一行。

请参阅此示例。 (未测试

Sub Sample()
    Dim rfound As Range
    Dim lRow As Long

    With ThisWorkbook.Sheets("Sheet1")
        Set rfound = .Columns(2).Find(What:=Me.ComboBox1.Value, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)

        If Not rfound Is Nothing Then
            If ComboBox1.Value <> "" And _
            WorksheetFunction.CountIf(.Range("B:B"), ComboBox1.Value) > 0 And _
            rfound.Offset(, 1).Value <> "" Then

                '~~> Find the next available row in Col C
                lRow = .Range("C" & .Rows.Count).End(xlUp).Row + 1

                '~~> Directly write to the cell
                .Cells(lRow, 3).Value = TextBox1.Value
            End If
        Else
            MsgBox "Not Found"
        End If
    End If
End Sub

【讨论】:

  • lRow = .Range("C" &amp; .Rows.Count).End(xlUp).Row + 1 将在该列中查找空白之前的最后一个单元格。我不希望这种情况发生。
  • 在这种情况下,您可以使用xlDown,但请确保您进行了适当的错误处理,以检查您是否还没有到达行尾,这就是目前正在发生的事情。 :)
  • 是的,最终我确实设法解决了我的问题,这要感谢大家提供的所有想法。再次非常感谢您!
【解决方案2】:

您当前的代码

  1. 大概发现B2rfound (注意:最好用`If Not rfound Is Nothing Then 来测试rfound 是否存在于Find 之后)
  2. 那么C2就是rfound.Offset(0, 1)
  3. rfound.Offset(0, 1).End(xlDown) 找到 C 列中的最后一个单元格,因为所有其他单元格都是空白的
  4. rfound.Offset(0, 1).End(xlDown).Offset(1, 0) 尝试在最后一行下方的单元格中输入一个值 - 不行。

改为从底部向上看,即而不是

Then rfound.Offset(0, 1).End(xlDown).Offset(1, 0).Value = TextBox1.Value
使用
Then Cells(Rows.Count, rfound.Offset(0, 1).Column).End(xlUp).Offset(1, 0) = TextBox1.Value

【讨论】:

  • 您有时间深入研究这个问题吗?如果你愿意,我可以在这里发布我的代码。谢谢。
  • 是的,先生,我做到了。但是我的代码的另一部分会将另一个新数据插入到使用.end(xlUp) 的列 B、C 和 D 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2012-08-05
相关资源
最近更新 更多