我有时使用MS-Excel中的对称矩阵(v2007和v2003)。
是否有选项可以帮助我将表达式从下三角形复制到上三角形?
它应该像复制和粘贴/转发一样,但这些功能通常只适用于矩形区域。
在添加的图片中,你可以看到一个表达式的例子,我必须通过链接矩阵的上三角形中的对称值来复制。
答案 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))
结果:
使用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的示例。从未填充的表格和按钮开始。
然后按下按钮运行代码:
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
最后观察结果
答案 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)。在空白处选择单元格并执行以下两个步骤
你有对称矩阵: - )
阿尼尔。
答案 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)