excel矩阵中的对称表达式

时间:2013-10-14 13:12:59

标签: excel matrix excel-formula

我有时使用MS-Excel中的对称矩阵(v2007和v2003)。

是否有选项可以帮助我将表达式从下三角形复制到上三角形?

它应该像复制和粘贴/转发一样,但这些功能通常只适用于矩形区域。

在添加的图片中,你可以看到一个表达式的例子,我必须通过链接矩阵的上三角形中的对称值来复制。 symmetric expression matrix

8 个答案:

答案 0 :(得分:9)

要获取相应单元格中的数字,我们可以使用OFFSET,单元格地址表格作为表格的基础。请注意,如果在对角线上输入,公式将产生* Circular Reference`错误。该公式适用于对角线的两侧 - 您只需决定哪一个将保存数据,哪个将保留公式。

Offset采用Row和Column来决定目标。通过从当前位置减去基本单元行和列,我们可以反转行和列,并获取数据。

使用您的示例,使用 B2 中表格的来源,我们最终得到以下公式:

=OFFSET($B$2,COLUMN()-COLUMN($B$2),ROW()-ROW($B$2))

您可以将此公式复制到单元格中,并获得反射。现在你有了数字,你可以在反射上做任何你需要的计算。使用您的示例,这将使公式:

=10-OFFSET($B$2,COLUMN()-COLUMN($B$2),ROW()-ROW($B$2))

结果:

example

使用INDEX使其变为非易失性会略微改变公式。首先,我们需要引用整个表格,而不仅仅是顶部单元格。其次,我们需要在行/列计算中加1,因为它将第一个单元格称为行/列1,而不是前一个公式的0偏移量。

=INDEX($B$2:$K$11,COLUMN()-COLUMN($B$2)+1,ROW()-ROW($B$2)+1)

你的10-Cell的例子将成为:

=10-INDEX($B$2:$K$11,COLUMN()-COLUMN($B$2)+1,ROW()-ROW($B$2)+1)

答案 1 :(得分:2)

正如上面的答案之一所示,这可以通过使用Excel公式来完成。然而,我发现这是一个非常繁琐的程序。特别是如果这是你需要定期做的事情。在这种情况下,VBA可以为您节省大量时间。

以下代码适用于方形选择并填充矩阵的其余部分,无论它是预填充矩阵的下部还是上部。

Option Explicit

Sub FillSymetricMatrix()
    Dim i As Integer, j As Integer
    Dim SelRng As Range
    Dim FillArea As String
    Dim FRow As Integer
    Dim FCol As Integer

    Set SelRng = Selection
    FRow = SelRng.Rows(1).Row
    FCol = SelRng.Columns(1).Column

    'Returns information about which area to fill
    If ActiveSheet.Cells(FRow + SelRng.Rows.Count - 1, FCol).Value <> vbNullString Then       'Lower filled
        If ActiveSheet.Cells(FRow, FCol + SelRng.Columns.Count - 1).Value = vbNullString Then 'Upper empty
            FillArea = "Upper"
        Else
            FillArea = "Error"
        End If
    Else
        If ActiveSheet.Cells(FRow, FCol + SelRng.Columns.Count - 1).Value <> vbNullString Then 'Upper filled
            FillArea = "Lower"
        Else
            FillArea = "Error"
        End If

    End If

    'Determines if the selection is square
    If SelRng.Rows.Count <> SelRng.Columns.Count Then FillArea = "Error"


    'Fills empty area of the square (symetric) matrix
    Select Case FillArea
        Case Is = "Upper"
            For i = 0 To SelRng.Rows.Count - 1 Step 1
                For j = 0 To SelRng.Columns.Count - 1 Step 1
                    If i <= j Then ActiveSheet.Cells(i + FRow, j + FCol).Value = ActiveSheet.Cells(j + FRow, i + FCol).Value
                Next j
            Next i

        Case Is = "Lower"
            For i = 0 To SelRng.Rows.Count - 1 Step 1
                For j = 0 To SelRng.Columns.Count - 1 Step 1
                    If i <= j Then ActiveSheet.Cells(j + FRow, i + FCol).Value = ActiveSheet.Cells(i + FRow, j + FCol).Value
                Next j
            Next i

        Case Else
            MsgBox "The procedure cannot be performed on the current selection!"
    End Select
End Sub

答案 2 :(得分:2)

我猜你需要的是一个函数,它返回一个方阵的“对角线”值,例如:对于任何X(j,k)返回X(k,j)

试试这个:

Function DIAGONAL(Arg As Range, Reference As Range) As Variant
Dim MyRow As Long, MyCol As Long

    If Reference.Rows.Count <> Reference.Columns.Count Then
        DIAGONAL = CVErr(xlErrRef)
    Else
        MyRow = Arg.Row - Reference.Row + 1
        MyCol = Arg.Column - Reference.Column + 1
        If MyRow < 1 Or MyCol < 1 Or MyRow > Reference.Rows.Count Or MyCol > Reference.Columns.Count Then
            DIAGONAL = CVErr(xlErrNA)
        Else
            DIAGONAL = Reference(MyCol, MyRow)
        End If
    End If

End Function

在VBA中输入此功能后,您可以在方形矩阵内部或外部使用它...您只需要确保您的参数(参数:Arg)在矩阵内(参数:参考)...或者你得到一个#N / A错误。或者,如果矩阵不是正方形,则会出现#REF错误。

因此,在您的示例中,您将进入B4:=10-DIAGONAL(B4,$B$2:$K$11)并将其复制到整个下三角区。

您甚至可以在屏幕截图中转置完整的矩阵...,移至单元格B13,输入=DIAGONAL(B2,$B$2:$K$11)并向下复制9x&amp;右

没有按钮,不需要明确地启动Sub ...任意大小的n x n矩阵,处理字符串和数字,......

答案 3 :(得分:1)

以下是VBA的示例。从未填充的表格和按钮开始。

SCREEN1

然后按下按钮运行代码:

Option Explicit

Private Sub symmButton_Click()
    MakeSymmetric Range("B2")
End Sub

Public Sub MakeSymmetric(ByRef r As Range)

    Dim M As Long
    M = CountCols(r)

    Dim vals() As Variant
    vals = r.Resize(M, M).Value2

    Dim i As Long, j As Long
    For i = 2 To M
        For j = 1 To i - 1
            vals(i, j) = vals(j, i)
        Next j
    Next i

    r.Resize(M, M).Value2 = vals
End Sub


Public Function CountCols(ByRef r As Range) As Long
    If IsEmpty(r) Then
        CountCols = 0
    ElseIf IsEmpty(r.Offset(0, 1)) Then
        CountCols = 1
    Else
        CountCols = r.Worksheet.Range(r, r.End(xlToRight)).Columns.Count
    End If
End Function

最后观察结果

enter image description here

答案 4 :(得分:1)

与Sean的解决方案类似,我也会使用公式。要获得转置值,请使用以下公式:

=INDEX($B$2:$G$7,COLUMN()-COLUMN($B$2)+1,ROW()-ROW($B$2)+1)

如果您想进行更复杂的操作(例如=10-[transposedValue]),我建议您使用命名范围:插入新名称,例如名称管理器中的TransposedValue。而不是单元链接,提供上述公式。现在你可以在矩阵中写下以下公式:

=10-TransposedValue

答案 5 :(得分:0)

我有这种方式。正如你所说的复制粘贴转置矩形范围的工作。而你的问题是你有一个三角范围。

你会爱上这个......

1)。选择包含上三角矩阵的方形范围和复制。

2)。在空白处选择单元格并执行以下两个步骤

  • a。)选择性粘贴 - 值
  • b。)选择性粘贴 - 值 - 转置 - 跳过空白

你有对称矩阵: - )

阿尼尔。

答案 6 :(得分:0)

将Ja72的填充代码与SeanC c的Excel功能代码混合在一起,我想我可以制作一个通用矩阵模板,该模板已正确预装了动态Excel公式。如此动态,无需任何复制和粘贴即可重复使用。

Public Sub MakeSymmetric(ByRef r As Range)

    Dim M As Long
    M = 300
    ' Was CountCols(r), but I just limited to 300 columns for now

    Dim vals() As Variant
    vals = r.Resize(M, M).Value2

    Dim i As Long, j As Long
    For i = 2 To M
        For j = 1 To i - 1
            vals(j, i) = "=OFFSET($B$2,COLUMN()-COLUMN($B$2),ROW()-ROW($B$2))"

        Next j
            'Make diagonal down the middle show ---
            vals(j, i) = "---"
    Next i
    vals(1, 1) = "---"

    r.Resize(M, M).Value2 = vals
End Sub

Sub FillSymmetric()
    MakeSymmetric Range("B2")
End Sub

我真的不知道任何VB,所以我还没有弄明白如何填充标题。我也不知道Stackoverflow,但我会尝试添加图片。 Original List to Matrixize

Dynamically transposing values typed in SouthWest half to NorthEast half

答案 7 :(得分:0)

简短回答:INDIRECT(ADDRESS(COLUMN(D2), ROW(D2)))

Explnation:您可能还记得我们使用带数字的坐标来表示笛卡尔坐标系中的位置。因此,很容易获得对角线对称值,例如只需将(2,3)更改为(3,2)。

但是在Excel中,如果我们想这样做,我们需要一个词。因为地址由字母和数字组合标记,例如B2。您不能只将B2更改为2B。 幸运的是,我们仍然可以通过利用COW()和COLUMN()的功能来使用数字来表示单元格。

在下图中,C2B3是对称的。这显示了如何将C2的值设置为B3enter image description here