您可以使用 VBA 将非结构化引用转换为结构化引用吗? (Excel 2010)
Can You Turn Unstructured References to Structured Using VBA? (Excel 2010)
我有一个 excel table(实际 table 即插入 > Table),它在所有公式中都使用结构化引用。示例:=[@[Predicted Total 2015 Days]]-COUNTA(All.Departments[@[1]:[40]])
我遇到的问题是我想从左到右对几列进行排序。 Excel 不允许您使用 table 执行此操作,只有范围(至少从我在该主题上发现的范围来看)所以看来我唯一的选择是取消列出 table(将其转换为范围)然后将其转换回来。但是,将其转换回 table 后,我的公式会丢失其结构化引用示例:=Sheet2!$V2-COUNTA(Sheet2!$X2:$BK2)
有没有办法将这些公式转换回结构化?或者更好的是,一种无需来回转换我的 table 即可从左到右排序的方法?
我能够在 Excel 2010 年使用结构化引用对列进行排序,没有任何问题。 table 中的公式使用对其他列和数据的结构化引用进行了排序。没有来回转换公式。
Option Explicit
Sub SortTable()
Dim ws As Worksheet
Dim tbl As ListObject
Set ws = ActiveSheet
Set tbl = ws.ListObjects("MyTable")
With tbl.Sort
.SortFields.Clear
.SortFields.Add Key:=ws.Range(tbl.Name & "[PredictedTotal]"), _
SortOn:=xlSortOnValues, Order:=xlDescending, _
DataOption:=xlSortNormal
.SortFields.Add Key:=ws.Range(tbl.Name & "[AllDepartments]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
.header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
我找到了一种将 table 转换为范围的方法。如果有人好奇,我决定 post 我的解决方案。
现在设置为复制整个 table,将其作为转置值粘贴到目标工作表中,然后在其中循环对每一列的日期从最旧到最新进行排序,然后将这些排序日期并将它们作为转置值粘贴回原始 table.
找到我自己的解决方案! =D
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.ScreenUpdating = False
Dim SourceWS As Worksheet
Dim DestWS As Worksheet
Dim TblRange As Range
Dim DataRange As Range
Dim LastRow As Long
Set SourceWS = Worksheets("For HR Use ONLY")
Set DestWS = Worksheets("Transposed Table")
DestWS.Visible = xlSheetVisible
DestWS.Cells.ClearContents
SourceWS.Activate
LastRow = SourceWS.Range("A1").CurrentRegion.Rows.Count
Set TblRange = SourceWS.Range("A1:BM" & LastRow)
TblRange.Copy
DestWS.Range("A1").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, True, True
Application.CutCopyMode = False
Set DataRange = SourceWS.Range("O2:BB" & LastRow)
DataRange.ClearContents
DestWS.Activate
Dim x As Long, LastCol As Long
LastCol = SourceWS.Range("A1").CurrentRegion.Rows.Count
For x = 2 To LastCol
Range(Cells(15, x), Cells(54, x)).Sort Key1:=Cells(15, x), Order1:=xlAscending, Header:=xlGuess
Next x
DestWS.Range(Cells(15, 2), Cells(54, LastCol)).Copy
SourceWS.Range("O2").PasteSpecial xlPasteValues, lPasteSpecialOperationNone, True, True
Application.CutCopyMode = False
DestWS.Visible = xlSheetHidden
SourceWS.Activate
SourceWS.Range("A1").Select
Set SourceWS = Nothing
Set DestWS = Nothing
Set TblRange = Nothing
Set DataRange = Nothing
Application.ScreenUpdating = True
End Sub
我也遇到了同样的问题。使用以下配方:
- CTRL+A // Select 整个 table.
- CTRL+H // 用 | 替换所有等号或您选择的角色。
- ALT+J+G // 转换为范围。
- ALT+H+S+U+O+L // 从左到右的特殊排序。选择排序行。
- CTRL+T // 转换回 Table。记得重命名!
- CTRL+H // 放回所有等号。
大功告成。警告:如果您有任何数组公式,则必须使用 CTRL+SHIFT+ENTER
重新提交它们
我有一个 excel table(实际 table 即插入 > Table),它在所有公式中都使用结构化引用。示例:=[@[Predicted Total 2015 Days]]-COUNTA(All.Departments[@[1]:[40]])
我遇到的问题是我想从左到右对几列进行排序。 Excel 不允许您使用 table 执行此操作,只有范围(至少从我在该主题上发现的范围来看)所以看来我唯一的选择是取消列出 table(将其转换为范围)然后将其转换回来。但是,将其转换回 table 后,我的公式会丢失其结构化引用示例:=Sheet2!$V2-COUNTA(Sheet2!$X2:$BK2)
有没有办法将这些公式转换回结构化?或者更好的是,一种无需来回转换我的 table 即可从左到右排序的方法?
我能够在 Excel 2010 年使用结构化引用对列进行排序,没有任何问题。 table 中的公式使用对其他列和数据的结构化引用进行了排序。没有来回转换公式。
Option Explicit
Sub SortTable()
Dim ws As Worksheet
Dim tbl As ListObject
Set ws = ActiveSheet
Set tbl = ws.ListObjects("MyTable")
With tbl.Sort
.SortFields.Clear
.SortFields.Add Key:=ws.Range(tbl.Name & "[PredictedTotal]"), _
SortOn:=xlSortOnValues, Order:=xlDescending, _
DataOption:=xlSortNormal
.SortFields.Add Key:=ws.Range(tbl.Name & "[AllDepartments]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
.header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
我找到了一种将 table 转换为范围的方法。如果有人好奇,我决定 post 我的解决方案。
现在设置为复制整个 table,将其作为转置值粘贴到目标工作表中,然后在其中循环对每一列的日期从最旧到最新进行排序,然后将这些排序日期并将它们作为转置值粘贴回原始 table.
找到我自己的解决方案! =D
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.ScreenUpdating = False
Dim SourceWS As Worksheet
Dim DestWS As Worksheet
Dim TblRange As Range
Dim DataRange As Range
Dim LastRow As Long
Set SourceWS = Worksheets("For HR Use ONLY")
Set DestWS = Worksheets("Transposed Table")
DestWS.Visible = xlSheetVisible
DestWS.Cells.ClearContents
SourceWS.Activate
LastRow = SourceWS.Range("A1").CurrentRegion.Rows.Count
Set TblRange = SourceWS.Range("A1:BM" & LastRow)
TblRange.Copy
DestWS.Range("A1").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, True, True
Application.CutCopyMode = False
Set DataRange = SourceWS.Range("O2:BB" & LastRow)
DataRange.ClearContents
DestWS.Activate
Dim x As Long, LastCol As Long
LastCol = SourceWS.Range("A1").CurrentRegion.Rows.Count
For x = 2 To LastCol
Range(Cells(15, x), Cells(54, x)).Sort Key1:=Cells(15, x), Order1:=xlAscending, Header:=xlGuess
Next x
DestWS.Range(Cells(15, 2), Cells(54, LastCol)).Copy
SourceWS.Range("O2").PasteSpecial xlPasteValues, lPasteSpecialOperationNone, True, True
Application.CutCopyMode = False
DestWS.Visible = xlSheetHidden
SourceWS.Activate
SourceWS.Range("A1").Select
Set SourceWS = Nothing
Set DestWS = Nothing
Set TblRange = Nothing
Set DataRange = Nothing
Application.ScreenUpdating = True
End Sub
我也遇到了同样的问题。使用以下配方:
- CTRL+A // Select 整个 table.
- CTRL+H // 用 | 替换所有等号或您选择的角色。
- ALT+J+G // 转换为范围。
- ALT+H+S+U+O+L // 从左到右的特殊排序。选择排序行。
- CTRL+T // 转换回 Table。记得重命名!
- CTRL+H // 放回所有等号。
大功告成。警告:如果您有任何数组公式,则必须使用 CTRL+SHIFT+ENTER
重新提交它们