Have you considered OleDb

Code:
Public Function GetRange(ByVal SheetName As String, ByVal Range As String) As DataTable 
	Dim dt As New DataTable 

	Using cn As New OleDbConnection With {.ConnectionString = Connection.NoHeaderConnectionString(FileName)} 
		cn.Open() 

		Dim cmd As OleDbCommand = New OleDbCommand( 
			<Text> 
					SELECT * FROM [<%= SheetName %>$<%= Range %>] 
				</Text>.Value, 
			cn 
		) 

		dt.Load(cmd.ExecuteReader) 


	End Using 

	Return dt 

End Function
Usage

Dim dt As DataTable = GetRange("Sheet1", "C24:E29")