.CommandText = "Select * From @ColumnName"
You can't do that - it won't work. The table name is evaluated and checked before the parameter substitution phase of comment execution in SQL.
You could concatenate the string, but you'd nave to do some extra work to ensure that it's safe or you leave yourself open to SQL Injection.
To add to that, it won't even compile: Datatable is a string:
Public Sub ReadTables(ColumNamer As String, Datatable As String)
And strings do not have a DataSource property:
Datatable.DataSource = dt.DefaultView