I think you have the right idea regarding the code that you have so far. But I would consider using dynamic range names instead to set the list of employee numbers. So you might have as a rangename.
Create a new rangenamed called "EmployeeNum" with the following formula
=OFFSET("EMP_NUM!$A1",0,0,COUNTA("EMP_NUM!$A:$A"),1)
This makes the loop code a little easier to deal with
Sub getEmployeeData()
Dim rCell As Range
Dim dblPasteRow As Double
'Start pasting in first row
For Each rCell In Range("EmployeeNum")
dblPasteRow = dblPasteRow + CopyData(rCell.Value, dblPasteRow)
Next rCell
End Sub
I am using a function to do the copying. Firstly, it splits the code up into the two small jobs you need. Second, a function can return data so we can let the calling sub know how many rows of data we pasted.
Function CopyData(strEmpNum As String, dblPasteStart As Double) As Double
Dim wksEmployee As Worksheet
Dim dblEndRow As Double
'If there is an error, we are adding 0 rows
CopyData = 0
'Error handling - if sheet isn't found
On Error GoTo Err_NoSheetFound
'Set a worksheet object to hold the employee data sheet
Set wksEmployee = Sheets(strEmpNum)
On Error GoTo 0
With wksEmployee
'Find the last row on the worksheet that has data in column A
dblEndRow = .Range("A4").End(xlDown).Row
'Copy data from this sheet
Range(.Range("A4"), .Range("T" & dblEndRow)).Copy
End With
'Paste data to master sheet - offset to column B
Range(Worksheets("MASTER").Range("B" & dblPasteStart), Worksheets("MASTER").Range("U" & dblPasteStart + dblEndRow)).Paste
'Write employee numbers next to the data
Range(Worksheets("MASTER").Range("A" & dblPasteStart), Worksheets("MASTER").Range("A" & dblPasteStart + dblRowEnd)).Value = strEmpNum
'Let the calling sub know how many rows we added
CopyData = dblEndRow
Exit Function
'Only runs if an error is found
Err_NoSheetFound:
Debug.Print "Can't find employee number: " & strEmpNum
End Function
I haven't run the code so there could be some bugs in it. I hope it at least points you in the right direction.