I solved the issue with the below code. The look-up table and the target table were switched in the Range.Find statement. This was causing exact matches to work, but partial (what I was going for) to fail, regardless of the code syntax.
I also added in a FindNext loop to search for all occurrences of each keyword, changed the error handling to deal with non-matches, and the code now runs as expected.
Private Sub CommandButton3_Click()
Dim ws As Worksheet
Dim DataRange As Range, UpdateRange As Range, aCell As Range, bCell As Range
Dim cCell As Range
Dim keeper As Range
On Error Resume Next
Set ws = Worksheets("Sheet1")
Set UpdateRange = ws.Range("A1:A8")
Set DataRange = ws.Range("H1:H4")
For Each aCell In DataRange
Set bCell = UpdateRange.Find(What:=aCell.Value, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False)
If Not bCell Is Nothing Then
Set keeper = bCell
bCell.Offset(0, 1) = aCell.Offset(0, 1)
Do
Set bCell = UpdateRange.FindNext(After:=bCell)
If Not bCell Is Nothing Then
If bCell.Address = keeper.Address Then Exit Do
bCell.Offset(0, 1) = aCell.Offset(0, 1)
Else
Exit Do
End If
Loop
Else
' MsgBox "Not Found"
'Exit Sub
End If
Next
Exit Sub
Err:
MsgBox Err.Description
End Sub