在 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 上方或下方有有用的数据,这些数据将被删除。
也许有更好的方法 -- 我很想知道您是否还有其他解决方案。
在 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 上方或下方有有用的数据,这些数据将被删除。
也许有更好的方法 -- 我很想知道您是否还有其他解决方案。