Vba “结束(xlDown)”行为怪异

Vba “结束(xlDown)”行为怪异,vba,excel,row,offset,Vba,Excel,Row,Offset,我怀疑.endxlDown的行为有点奇怪 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"), _ Comb

我怀疑.endxlDown的行为有点奇怪

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_,代码将在B列中搜索任何匹配的条件,然后偏移到右侧单元格,前提是我的条件都满足。但是,它会提示我一条消息运行时错误“1004”:应用程序定义的错误或对象定义的错误

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

您当前的代码

假设将B2作为rfound进行查找注意:最好在带有“if Not rfound Is Nothing”的Find之后测试rfound是否存在 然后C2被确定。偏移量0,1 rfound.Offset0,1.EndxlDown查找C列中的最后一个单元格,因为所有其他单元格都为空 rfound.Offset0,1.EndxlDown.Offset1,0尝试在最后一行下一行的单元格中输入值-不行。 改为从底部往上看

然后rfound.Offset0,1.EndxlDown.Offset1,0.Value=TextBox1.Value 使用 然后CellsRows.Count,rfound.Offset0,1.Column.EndxlUp.Offset1,0=TextBox1.Value

您当前的代码

假设将B2作为rfound进行查找注意:最好在带有“if Not rfound Is Nothing”的Find之后测试rfound是否存在 然后C2被确定。偏移量0,1 rfound.Offset0,1.EndxlDown查找C列中的最后一个单元格,因为所有其他单元格都为空 rfound.Offset0,1.EndxlDown.Offset1,0尝试在最后一行下一行的单元格中输入值-不行。 改为从底部往上看

然后rfound.Offset0,1.EndxlDown.Offset1,0.Value=TextBox1.Value 使用 然后CellsRows.Count,rfound.Offset0,1.Column.EndxlUp.Offset1,0=TextBox1.Value

我的三分钱

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

您已经知道必须写入C列,那么为什么要使用偏移量使其更复杂呢 测试是否存在BRETDJ建议的rfound 使用xlUp查找最后一行。 看看这个例子。未经测试

我的三分钱

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

您已经知道必须写入C列,那么为什么要使用偏移量使其更复杂呢 测试是否存在BRETDJ建议的rfound 使用xlUp查找最后一行。 看看这个例子。未经测试


你有时间深入研究这个问题吗?如果你愿意,我可以把我的代码贴在这里。谢谢。是的,先生,我有。但我的代码还有一部分将在B、C和D列中插入另一个新数据,使用.endxlUp。您有时间深入研究这个问题吗?如果你愿意,我可以把我的代码贴在这里。谢谢。是的,先生,我有。但是我的代码的另一部分将把另一个新的数据插入到使用.EntxLopb的B、C和D列中。请给我一点时间来考虑答案。谢谢。通过使用.endxlUp,请参考我上面的最后一张图片,如果我想在“公司A”中插入“产品”和“说明”,这是不可能实现的。在我们指出代码的错误后,您编辑了您的问题-我们很难猜到您会事先修改。如果你希望得到持续的帮助,那么我认为你适当地对待那些帮助你的人是合理的。我想我不应该如此急切地编辑我的问题。我将把我的问题改回未经编辑的状态。是的,我确实应该在问任何问题的时候修改自己,谢谢你提醒我,请给我一点时间考虑一下答案。谢谢。通过使用.endxlUp,请参考我上面的最后一张图片,如果我想在“公司A”中插入“产品”和“说明”,这是不可能实现的。在我们指出代码的错误后,您编辑了您的问题-我们很难猜到您会事先修改。如果你希望得到持续的帮助,那么我认为你适当地对待那些帮助你的人是合理的。我想我不应该如此急切地编辑我的问题。我将把我的问题改回未经编辑的状态。是的,当我问任何问题时,我确实应该修改自己,谢谢提醒@brettdjlRow=.range&.Rows.Count.EndxlUp.Row+1将在该列中查找空白前的最后一个单元格。我不希望发生这种情况。在这种情况下,您可以使用xlDown,但请确保您进行了正确的错误处理,以检查您是否尚未到达当前正在发生的行的末尾:是的,由于你们所有人的想法,我终于设法解决了我的问题。再次感谢大家!lRow=.RangeC&.Rows.Count.EndxlUp.Row+1将查找该列中空白前的最后一个单元格。我不希望发生这种情况。在这种情况下,您可以使用xlDown,但要确保您进行了正确的错误处理,以检查您是否尚未到达行的末尾,这就是我所希望的
目前正在发生什么事是的,由于你们所有人的想法,我终于设法解决了我的问题。再次感谢大家!
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