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

Change Column location of SQL statement in Excel

在 excel 内,我已将我的 Microsoft SQL 服务器数据库连接到它,以显示结果。我设置的系统是根据表格构建的。如果用户选择选项 1,查询结果将显示:

Select person, car, house from mytable1

如果用户选择选项2,查询结果会显示:

Select job, person, land, truck from mytable2

第一个 select 语句将按照我想要的列顺序给我一个 table。但是,当用户再次使用该表单时,它将重新查询它以使用请求的 select 语句。当重新查询发生时,显示项目的列顺序在不同的区域。即使 select 声明在同一订单中。有没有一种方法可以按特定顺序对列进行排序?

我试图在数据范围属性中取消选中 "Preserve Column Sort",但最终留下空列。 IE。 : Column1, Column2, Column3, etc.

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

select one, two, three

然后在重新运行查询时将列"three"移到"one,"前面,即使查询另说。

这也意味着,如果您添加一列,无论您将其添加到何处,它都会在 MS Query 呈现输出时结束。

select four, one, two three

("four" 在 Excel 中结束,即使它在 SQL 中排在第一位)

在您的示例中,"person" 列在两个查询中很常见,因此 Excel(MS 查询)会将其移至第一个位置并将所有其他列放在该位置之后。

当 Excel 删除旧列时,它会留下一个跟踪器 -- 您可能会注意到 table 之后的列不是正常大小;它们是已删除字段的大小。我称他们为"ghosts."

这是一个严重的 hack,但我知道缓解这个问题的唯一方法是 运行 一个虚假查询(即 select 1),删除 ghosts -- 删除整个列,然后 运行 您的第二个查询。这是我在 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

是的,这会删除 table 之后的每一列,这意味着如果在 table 之后的列中 table 上方或下方有有用的数据,这些数据将被删除。

也许有更好的方法 -- 我很想知道您是否还有其他解决方案。