I've found that Excel treats me a lot better when I use explicit references instead of using the Active* objects and the Application collections. Try setting the Workbook explicitly:
VB Code:
  1. Public Function AddSheetCopy(CopyName As String, NewName As String)
  2.  
  3.     Dim xlBook As Excel.Workbook, xlSource As Excel.Worksheet
  4.  
  5.     Set xlBook = xlApp.ActiveWorkbook                           'Get the current book.
  6.    
  7.     For Each xlSheet In xlBook.Worksheets                       'Make sure the NewName doesn't exist.
  8.         If xlSheet.Name = NewName Then
  9.             Debug.Print ("sheet exists")
  10.             Exit Function
  11.         End If
  12.     Next xlSheet
  13.    
  14.     Set xlSource = xlBook.Worksheets(CopyName)                  'Get a ref to the source sheet.
  15.     Call xlSource.Copy(, xlBook.Worksheets(xlBook.Worksheets.Count))    'Copy it.
  16.    
  17.     Set xlSheet = xlBook.Worksheets(xlBook.Worksheets.Count)    'Get a ref to the new copy.
  18.     xlSheet.Name = NewName                                      'Name it.
  19.    
  20.     Set xlBook = Nothing
  21.     Set xlSource = Nothing
  22.  
  23. End Function
Also, instead of just exiting if the CopyName is a duplicate, you can use this function to generate a garunteed unique name. It should always allow a rename to succeed if passed through it. You use something other than V.#, like Copy # of [Sheet], but the principle would be the same.
VB Code:
  1. Public Function UniqueName(xlBook As Excel.Workbook, sName As String) As String
  2.  
  3.     Dim sTest As String, lCount As Long, lNum As Long, lTop As Long, bDuped As Boolean
  4.    
  5.     lTop = xlBook.Worksheets.Count                  'Get the number of sheets in the book.
  6.     If lTop = 1 Then                                'One sheet, can't be a duplicate.
  7.         UniqueName = sName                          'Return it.
  8.         Exit Function
  9.     End If
  10.    
  11.     sTest = sName                                   'Set the testing name to the passed arg.
  12.     Do
  13.         bDuped = False                              'Reset the duplicated flag.
  14.         For lCount = 1 To lTop                      'Test the name against all sheets.
  15.             If xlBook.Worksheets(lCount).Name = sTest Then
  16.                 bDuped = True                       'If it's found, set the flag.
  17.             End If
  18.         Next lCount
  19.         If bDuped = True Then
  20.             sTest = sName & " V." & CStr(lNum + 2)  'Try V.#
  21.             lNum = lNum + 1                         'Increment the number counter.
  22.         End If
  23.     Loop Until bDuped = False                       'Loop until it's unique.
  24.  
  25.     UniqueName = sTest
  26.  
  27. End Function
It's called like this:
VB Code:
  1. xlSheet.Name = UniqueName(xlSheet.Parent, NewName)