title: How to speed up checking and copying in ListObject
body: <p>I have been working with project in which the workbook crashes if too many rows of data (too many being 3000 in this case) are added.
  While I have updated the workbook to now not crash at least, it is still running quite terribly slow - for adding 900 rows with only 5 columns it is taking about 33 seconds. The end table will likely have about 35 columns (of which approx 15 will be formulas) and over 5000 rows, so I am already concerned. The coworkers also wanted to be able to update using "non-matching" tables: importTable may have columns A, B, C, E and master will have A,C,E,F, and the actually needed columns (in adminTable) are A,C,E. 
  Does anyone have any ideas? This subs is already wrapped in another sub that turns off screenUpdating, DisplayAlerts, and Calculation. I am guessing the hiccup is in the .Copy line...</p>
  
  <pre><code>Sub detectChanges(adminTbl As ListObject, importTbl As ListObject, masterTbl As ListObject)
  
    Dim i                           As Long
    Dim j                           As Long
    Dim elements As Long
    Dim Header As Variant
    Dim foundHeader As Variant
    Dim cHead As String
    Dim ID As Variant
    Dim foundID As Range
  
    elements = 0
  
    'loops through the set admin headers. This format will not copy non-similar data, nor overwrite custom columns that have been added to the data
   'NOTE: Below assumed that unique identifier is ALWAYS in first column.
    For i = 1 To masterTbl.ListRows.Count
      'grabs ID
      ID = masterTbl.ListColumns(1).DataBodyRange(i)
      'tests for a ID match
      Set foundID = importTbl.ListColumns(1).Range.Find(IC, LookAt:=xlWhole)
  
      If Not foundID Is Nothing Then
          'only checks for changes in admin columns, skipping the ID column
          For j = 2 To adminTbl.ListColumns.Count
              cHead = adminTbl.ListColumns(j).Name
              If masterTbl.ListColumns(cHead).DataBodyRange(i) &lt;&gt; 
              importTbl.ListColumns(cHead).DataBodyRange(foundID.Row - importTbl.HeaderRowRange.Row) Then
              'This line changes the color of the changed element
  
                      importTbl.ListColumns(cHead).DataBodyRange(foundID.Row - importTbl.HeaderRowRange.Row).Copy masterTbl.ListColumns(cHead).DataBodyRange(i)
                      masterTbl.ListColumns(cHead).DataBodyRange(i).Interior.Color = RGB(255, 235, 156)
                                'keeping track of elements
                      elements = elements + 1
              End If
          Next j
  
      End If
  
  Next i
  
    'Say elements changed
   'MsgBox "Total elements changed in update: " &amp; elements
  
  End Sub
  </code></pre>