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

能否使用VBA将非结构化引用转换为结构化引用?(Excel 2010),excel,reference,jquery-ui-sortable,vba,Excel,Reference,Jquery Ui Sortable,Vba,我有一个excel表格一个实际的表格ie Insert>表格,它在所有公式中使用结构化引用。示例:=[@[预计2015总天数]]-所有部门[@[1]:[40]] 我遇到的问题是我想从左到右对几个列进行排序。Excel不允许您对表格执行此操作,只允许范围至少与我在主题上找到的范围相同,因此我唯一的选择似乎是取消列出表格,将其转换为一个范围,然后再将其转换回。但是,在将其转换回表格后,我的公式将丢失其结构化引用示例:=Sheet2$V2-COUNTASheet2$X2:$BK2 有没有办法将这些公式

我有一个excel表格一个实际的表格ie Insert>表格,它在所有公式中使用结构化引用。示例:=[@[预计2015总天数]]-所有部门[@[1]:[40]]

我遇到的问题是我想从左到右对几个列进行排序。Excel不允许您对表格执行此操作,只允许范围至少与我在主题上找到的范围相同,因此我唯一的选择似乎是取消列出表格,将其转换为一个范围,然后再将其转换回。但是,在将其转换回表格后,我的公式将丢失其结构化引用示例:=Sheet2$V2-COUNTASheet2$X2:$BK2


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

我能够使用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

我想出了一个办法把我的桌子变成一个靶场。如果有人好奇,我决定发布我的解决方案

它现在设置为复制整个表,将其作为转置值粘贴到目标工作表中,然后对每列的日期从最早到最新进行循环排序,然后将这些排序的日期作为转置值粘贴回原始表中

很高兴能想出我自己的解决办法=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//选择整个表格。 CTRL+H//将所有等号替换为|或您选择的字符。 ALT+J+G//转换为范围。 ALT+H+S+U+O+L//从左到右进行特殊排序。选择排序行。 CTRL+T//转换回表格。记得给它重命名! CTRL+H//将所有的等号放回原位。
你完了。警告:如果您有任何数组公式,则必须使用CTRL+SHIFT+ENTER重新提交它们

您本身无法排序,但可以移动表列。如果手动操作的任务太多,您可以编写代码来实现这一点-重新应用结构化引用可能比编写代码简单。如果所需的结构化引用完全相同,例如,它们不包含任何列索引,在列排序后需要更改,则可以将公式转换为文本,然后再转换为公式。您还可以尝试在排序期间关闭工作表计算。我不知道它是否有效,但如果Excel不计算单元格,它可能会忽略公式。必须有某种东西触发用原始范围替换结构化引用——也许可以抑制它。表本身有65列,大约120行。我所拥有的表的用户在其中的40列中输入日期。因此,手动重新排序绝不是一种选择。我已经试过关闭计算了,但没用。我想在将范围转换回表格后,我总是可以进行公式填充,但这会占用计算时间,我希望避免这种情况。我不想对列进行排序。我想从左到右排序。而且我不是按预测总数排序,我只是给出了我表中一个公式的例子,这样就不会有人把绝对或相对引用搞混了。我试着对120行包含40列日期的行进行排序。每一行的日期都不一样。我很抱歉从左到右漏掉了太多的部分,因为我太快地扔掉了代码!。那么每一行都从左到右单独排序,而不更改列标题?或者是否有一个主行指示排序?在这40列中,您已经暗示了一些列也是固定的。表中的每一行代表不同的员工,有一些列包含其他关于他们的详细信息,然后有40列用于输入他们的假期日期,我知道有更有效的方法来做到这一点,但是表格不是为我准备的,这是用户坚持的方式,我的目标是在加载工作簿时让表格按最早到最新的日期自动排序,而不会丢失我的结构化公式。