wsConfig is not needed. Give that sheet a code name e.g. ConfigSheet, and then use that identifier name in your code whenever you need to refer to that specific sheet. Note that you can only do this with worksheets that exist in ThisWorkbook at compile-time; see my CodeName: Sheet1 article for more information.
The One problem is the nesting of qualified and unqualified Worksheet member calls; the qualified member calls are made against the qualifying Worksheet object, but the nested, unqualified ones are referring to whatever the ActiveSheet happens to be at that time, and if that's not the Worksheet object that's qualifying the outer member call, then you can expect error 1004. Rubberduck's static code analysis tool flags these unqualified member calls as implicit ActiveSheet references.
wb.Worksheets("Roster").Range(Cells(wsConfig.Range("B4")), _
............................................................................
^ workbook qualifier          ^ Worksheet member call (unqualified)
   ^ Workbook member call           ^ worksheet qualifier
                        ^ Worksheet member call
The unqualified Cells member calls aren't necessarily going against the wb.Worksheets("Roster") sheet, but they clearly mean to. That should be made explicit.
A With block can solve this:
With wb.Worksheets("Roster")
    .Range(.Cells(ConfigSheet.Range("B4").Value, ConfigSheet.Range("B2".Value)) ...
End With
...but that's not ideal, because now everything is implicitly late-bound, because Worksheets returns an Object and now we lose compile-time validation.
Best declare a local variable for it... and now the compiler will start complaining about the Worksheet.Range call that has 3 arguments, instead of turning a blind eye (thanks to the implicit late binding) and only blowing up at run-time:
Dim rosterSheet As Worksheet
Set rosterSheet = wb.Worksheets("Roster")
Dim idSheet As Worksheet
Set idSheet = wb.Worksheets("Sharepoint IDs")
With rosterSheet
    .Range(.Cells(ConfigSheet.Range("B4").Value, _
           .Cells(ConfigSheet.Range("B2").Value), _
           .Cells(lastRow, .Cells(ConfigSheet.Range("B2").Value) _
    .Copy Destination:=idSheet.Cells(1, 1)
End With
Worksheet.Range takes 1 or 2 arguments: when given two arguments, it is expected that the first one is the upper-left cell, and the second one is the lower-right cell of the desired rectangular, contiguous range of cells.
I can't guess what specific range you're trying to copy, but this is what's going on. There isn't enough information in your post to come up with the actual working code; I'm assuming lastrow is whatever B4 says in the config sheet. If that's the case then this could be it:
Dim configColumn As Long
configColumn = ConfigSheet.Range("B2").Value
Debug.Assert configColumn > 0
Dim configRow As Long
configRow = ConfigSheet.Range("B4").Value
Debug.Assert configRow > 0
With rosterSheet
    .Range(.Cells(2, configColumn), .Cells(configRow, configColumn)) _
    .Copy Destination:=idSheet.Cells(1, 1)
End With
Avoid needlessly nesting Range and Cells calls, and always qualify them explicitly with a Worksheet object reference; also avoid continuating a line that isn't a full, complete, valid statement - kudos for not splitting the Destination:= named argument into multiple lines.
     
    
Workheets.Cells(wsConfig.Range("B4"))without a worksheet qualifier will always refer to the activesheet, so you should fix that first. Would help to show example values from the configuration sheet..Valueof aRange, would be good to be explicit about that.ListObjectin your configuration sheet. That way you'll never need to work out what the last row is.Cells(10,4)" -- where is this(10,4)coming from? Your post is unclear as it stands, it's impossible to come up with a working solution without making assumptions.