您可以使用 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

我也遇到了同样的问题。使用以下配方:

  1. CTRL+A // Select 整个 table.
  2. CTRL+H // 用 | 替换所有等号或您选择的角色。
  3. ALT+J+G // 转换为范围。
  4. ALT+H+S+U+O+L // 从左到右的特殊排序。选择排序行。
  5. CTRL+T // 转换回 Table。记得重命名!
  6. CTRL+H // 放回所有等号。

大功告成。警告:如果您有任何数组公式,则必须使用 CTRL+SHIFT+ENTER

重新提交它们