您能否使用VBA将非结构化引用转换为结构化? (Excel 2010)

时间:2015-09-02 12:48:54

标签: excel-vba reference jquery-ui-sortable vba excel

我有一个excel表(实际表格,即Insert> Table),它在所有公式中使用结构化引用。示例:=[@[Predicted Total 2015 Days]]-COUNTA(All.Departments[@[1]:[40]])

我遇到的问题是我想从左到右排序几个列。 Excel不允许你使用表格,只有范围(至少从我在主题上找到的内容)这样做似乎我唯一的选择是取消列表(将其转换为范围)然后将其转换回来。但是,在将其转换回表后,我的公式会丢失其结构化引用示例:=Sheet2!$V2-COUNTA(Sheet2!$X2:$BK2)

有没有办法将这些公式转换回结构化?或者更好的是,一种从左到右排序的方法,而不必来回转换我的桌子?

3 个答案:

答案 0 :(得分:1)

我能够使用Excel 2010中的结构化引用对列进行排序,没有任何问题。使用对其他列和数据的结构化引用对表中的公式进行了排序。没有来回转换公式。

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

答案 1 :(得分:0)

我找到了将表格转换为范围的方法。如果有人好奇我决定发布我的解决方案。

现在设置为复制整个表格,将其作为转置值粘贴到目标工作表中,然后在其中循环对每个列的日期从最旧到最新排序,然后需要那些已排序的日期并将它们作为转置值粘贴回原始表格。

要弄清楚我自己的解决方案! = 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

答案 2 :(得分:0)

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

  1. CTRL + A //选择整个表格。
  2. CTRL + H //用|替换所有等号或者你选择的角色。
  3. ALT + J + G //转换为范围。
  4. ALT + H + S + U + O + L //特殊从左到右排序。选择排序行。
  5. CTRL + T //转换回表格。记得重命名吧!
  6. CTRL + H //放回所有等号。
  7. 你已经完成了。警告:如果你有任何数组公式,你将不得不用CTRL + SHIFT + ENTER重新发送它们