Re your initial code, as Paul mentioned before, you need to loop backwards when deleting, so:
Sub CrossReferenceAndDelete() Dim oakyFile As Workbook
Dim guestlineFile As Workbook
Dim oakySheet As Worksheet
Dim guestlineSheet As Worksheet
Dim oakyRange As Range
Dim guestlineRange As Range
Dim oakyReservationNumbers As Range
Dim guestlineReservationNumbers As Range
Dim cell As Range
Dim rowNum As Long
' Open the Oaky file
Set oakyFile = Workbooks("Oaky.xls")
Set oakySheet = oakyFile.Sheets("Transactions details")
' Open the Guestline file
Set guestlineFile = Workbooks("Guestline.xls")
Set guestlineSheet = guestlineFile.Sheets("Guestline")
' Get the range of reservation numbers in Oaky file
Set oakyRange = oakySheet.Range("A2:A" & oakySheet.Cells(Rows.Count, 1).End(xlUp).Row)
Set oakyReservationNumbers = oakyRange.SpecialCells(xlCellTypeConstants)
' Loop through the Guestline file
For rowNum = guestlineSheet.Cells(Rows.Count, "E").End(xlUp).Row To 2 Step -1
Set cell = guestlineSheet.Cells(rowNum, "E")
' Check if the reservation number is not found in Oaky file
If Application.CountIf(oakyReservationNumbers, cell.Value) = 0 Then
' Check if the row contains any of the specified words in column D
If Not ContainsWords(guestlineSheet.Cells(rowNum, "D").Value) Then
' Delete the entire row
guestlineSheet.Rows(rowNum).Delete
End If
End If
Next rowNum
' Save and close the files
guestlineFile.Save
guestlineFile.Close
oakyFile.Close
MsgBox "Cross-reference and deletion completed!"
' Cleanup memory
Set oakyRange = Nothing
Set oakyReservationNumbers = Nothing
Set oakySheet = Nothing
Set oakyFile = Nothing
Set guestlineRange = Nothing
Set guestlineReservationNumbers = Nothing
Set guestlineSheet = Nothing
Set guestlineFile = Nothing
End Sub
Function ContainsWords(ByVal text As String) As Boolean
Dim wordsToCheck As Variant
Dim word As Variant
wordsToCheck = Array("Balcony Room Upgrade", "Bicycle", "Breakfast Child Special Rate", "E Bike", _
"Lof Restaurant Reservation", "Olivier Bistro Reservation", "Parking", "Room Upgrade", _
"Room with a bath upgrade", "Special Breakfast Rate")
For Each word In wordsToCheck
If InStr(1, text, word, vbTextCompare) > 0 Then
ContainsWords = True
Exit Function
End If
Next word
ContainsWords = False
End Function