excelmatrix中的对称expression式

我有时在MS-Excel(v2007和v2003)中使用对称matrix。

有没有一个选项可以帮助我将expression式从下面的三angular形复制到上面的三angular形?

它应该是像复制和粘贴/ transponse类似的东西,但这些function通常只适用于矩形区域。

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

要获得适当的单元格中的数字,我们可以使用OFFSET和单元格地址表格的基础。 请注意,如果在对angular线上input公式,将会产生* Circular Reference`错误。 该公式将适用于对angular线的两侧 – 您只需决定哪一个将保存数据,哪一个将保存公式。

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

用你的例子,在B2中的表格的起源,我们结束了以下公式:

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

你可以将这个公式复制到单元格中,并获得reflection。 现在你有了这个号码,你可以在reflection上做任何你需要的计算。 用你的例子,这将使公式:

 =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) 

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

下面的代码将在一个正方形选区上工作,并填充matrix的其余部分,而不pipe它是预先填充的matrix的下部还是上部。

 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 

我猜你需要的是一个返回matrixmatrix的“对angular线”值的函数,例如对于任何X(j,k) return 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中input了这个函数,你可以在你的方阵内部或外部使用它…你只需要确保你的参数(参数:Arg)在matrix内(参数:Reference)…或者你得到#N / A错误。 或者,如果matrix不是正方形,你会得到#REF错误。

所以在你的例子中,你可以inputB4: =10-DIAGONAL(B4,$B$2:$K$11)并将其复制到整个下三angular形中。

你甚至可以转置一个完整的matrix…在你的屏幕截图中,移动到单元格B13,input=DIAGONAL(B2,$B$2:$K$11)然后向右和向右复制9x

没有button,不需要明确地启动一个Sub …任何大小的nxnmatrix,处理string和数字,…

这是一个VBA的例子。 从一个未填充的表格和一个button开始。

屏幕截图1

然后让button运行代码:

 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 

最后观察结果

在这里输入图像说明

类似于肖恩的解决scheme,我也会使用公式。 为了得到转置的值,使用这个公式:

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

如果你想做一个更复杂的操作(例如=10-[transposedValue] ),我build议你使用一个命名范围:在名称pipe理器中插入一个新的名字,例如TransposedValue 。 提供上述公式,而不是单元格链接。 现在你可以直接在你的matrix中写下下面的公式:

 =10-TransposedValue 

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

你会爱上这个….

1)。 select包含上三angularmatrix和复制的平方范围。

2)。 在一个空的地方select一个单元格 ,然后执行以下两个步骤

  • a。)select性粘贴 – 值
  • b。)select性粘贴 – 值 – 移调 – 跳过空白

你有你的对称matrix:-)

阿尼尔。

将Ja72的填充代码与SeanC c的Excel函数代码混合在一起,我想我可以制作一个通用的matrix模板,它已经用dynamic的Excel公式正确预填了。 如此dynamic,可以重复使用,无需任何复制和粘贴。

 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,但我会尝试添加图片。 原始列表Matrixize

dynamic地将在西南半部input的数值转换为东北部的一半

简答题: INDIRECT(ADDRESS(COLUMN(D2), ROW(D2)))

Explnation:您可能还记得我们使用坐标和数字来表示笛卡儿坐标系统中的一个位置。 所以,很容易得到一个对angular线的对称值,例如只是改变(2,3)到(3,2)。

但是在Excel中,如果我们想这样做的话,我们需要一个说法。 因为,地址是由一个字母和数字的组合来标记的,比如B2 。 你不能把B2变成2B 。 幸运的是,我们仍然可以通过利用COW()和COLUMN()的function来使用数字来表示单元格。

在下图中, C2B3是对称的。 这说明如何把C2的值C2 B3在这里输入图像说明