在Excel中更改SQL语句的列位置

在Excel中,我已经连接了我的Microsoft SQL Server数据库,以显示结果。 我制定的系统是build立在一个表格之上的。 如果用户select选项1,则查询结果将显示:

Select person, car, house from mytable1 

如果用户select选项2,查询结果将显示:

 Select job, person, land, truck from mytable2 

第一个select语句将按照我希望的列顺序给我一个表格。 但是,当用户再次使用表单时,它将重新查询它以使用请求的select语句。 当发生重新查询时,显示项目的列顺序在不同的区域。 即使select的陈述在相同的顺序内陈述。 有什么方法可以按特定顺序排列列?

我试图在数据区域属性中取消选中“保留列sorting”,但最终留下空列。 IE: Column1, Column2, Column3, etc.

您可能已经知道这一点,但由于Excel允许您移动表/ ListObject中的列,因此它会尽力保留您所做的任何更改。 所以,如果你运行一个查询:

 select one, two, three 

然后,当您重新运行您的查询时,移动“one”前面的列“three”,即使查询另有说明,它仍将按顺序保留在ListObject中。

这也意味着,如果添加一列,无论添加到哪里,MS Query将显示输出结果。

 select four, one, two three 

(“四”在Excel中即将结束,即使它在SQL中被列为第一位)

在你的例子中,“person”这个列在两个查询中是很常见的,所以Excel(MS Query)会把它移到第一个位置,然后把所有其他的列移动到第一个位置。

当Excel删除旧列时,会留下一个跟踪器 – 您可能会注意到,表格后面的列不是正常大小; 他们是被删除的字段的大小。 我叫他们“鬼”。

这是一个严重的黑客,但我知道缓解这个问题的唯一方法是运行一个假的查询(即select 1 ),删除鬼 – 删除整个列,然后运行你的第二个查询。 这里是我在VBA中使用的一些难看的代码:

 Dim lo As ListObject Set lo = Sheets("Sheet1").ListObjects("Table_ExternalData_1") Range(lo.HeaderRowRange.Offset(0, lo.HeaderRowRange.Columns.Count), _ Range("XFD1")).EntireColumn.Delete 

是的,这会删除表格后面的每一列,这意味着如果在表格之后的列的上方或下方存在有用的数据,那么这些数据将被清除。

也许有更好的方法 – 我很好奇,看看你是否有任何其他的解决scheme。