问题
I suspect that the .end(xlDown)
is acting a bit weird.
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
Upon CommandButton1_click
, the code will search in the column B for any matched criteria and then OffSet
to the right cell provided my conditions are all met. However, it prompt me a message Run-time error '1004': Application defined or object-defined error
.
I have no clue where is the problem. For illustration:

回答1:
Your current code
- Presumably finds
B2
asrfound
(Note: It would be better to test ifrfound
exists after theFind
with `If Not rfound Is Nothing Then) - Then
C2
isrfound.Offset(0, 1)
rfound.Offset(0, 1).End(xlDown)
find the last cell in column C as all other cells are blankrfound.Offset(0, 1).End(xlDown).Offset(1, 0)
tries to enter a value in the cell one row below the very last row - no can do.
Look up from the bottom instead, ie rather than
Then rfound.Offset(0, 1).End(xlDown).Offset(1, 0).Value = TextBox1.Value
useThen Cells(Rows.Count, rfound.Offset(0, 1).Column).End(xlUp).Offset(1, 0) = TextBox1.Value
回答2:
My three cents...
The beauty is not in writing complex codes but breaking it up in easy to understand lines so that it is easier to understand what the code does. Also it helps in debugging it if an error occurs...
- You already know that you have to write to Col C so why make it more complex by using
Offset
- Test if
rfound
exists as brettdj suggested - Use
xlUp
to find the last row.
See this example. (UNTESTED)
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
来源:https://stackoverflow.com/questions/14054906/endxldown-acting-weird