你的问题只是3*3矩阵。
为了你看清程序,我举个5*5的例子。
首先,建1个新文件,然后建程序如下:
Public resCol As Collection '存放输出结果
Sub test()
Dim a(1 To 5) As String '待排列字符
Dim result(1 To 5) As String '暂存结果
Dim i As Integer '循环变量
Set resCol = New Collection '初始化结果集合
a(1) = "1" '初始化待排列字符
a(2) = "2"
a(3) = "3"
a(4) = "4"
a(5) = "5"
Insert result, a '排列
Sheets(1).Columns("A:A").ClearContents '清理结果位置,准备输出结果
For i = 1 To resCol.Count '将结果输出,因为在Excel中,所以输出到单元格
Sheets(1).Cells(i, 1) = resCol(i) '如果不是在Excel,可以输出到需要的地方
Next
End Sub
Sub test2()
Dim a() As String '待排列字符
Dim result() As String '暂存结果
Dim Total As Integer '总共多少个字符
Dim i As Integer '循环变量
Total = Sheets(2).Cells(1, 1) '获取总共的字符数
If Total > 26 Then
MsgBox "字符数太多,超出程序设计"
Exit Sub
End If
Set resCol = New Collection '初始化结果集合
ReDim a(1 To Total) '根据总字符数重新定义数组
ReDim result(1 To Total)
For i = 1 To Total
a(i) = Chr(i + 64) '初始化待排列字符
Next i
Insert result, a '排列
Sheets(2).Columns("B:B").ClearContents '清理结果位置,准备输出结果
For i = 1 To resCol.Count '将结果输出,因为在Excel中,所以输出到单元格
Sheets(2).Cells(i, 2) = resCol(i) '如果不是在Excel,可以输出到需要的地方
Next
End Sub
Sub Insert(ByRef arr() As String, ByRef InsStr() As String) 'arr:排列结果 insstr:尚需进行排列的字符
Dim i As Integer '循环变量
Dim j As Integer '循环变量
Dim b() As String '排列一次后,剩下的字符
Dim temp As String '排列结果临时变量
j = UBound(InsStr) 'j: 还有多少个字符需要排列
If j <> 1 Then '如果多于一个
ReDim b(1 To j - 1) '初始化剩余字符
For i = 1 To j - 1 '除掉Insstr中第一个字符,其余的将进行下次排列
b(i) = InsStr(i + 1) '剩余字符保存起来进行下次排列
Next
j = UBound(arr) '排列结果共包含多少字符
For i = 1 To j
If arr(i) = "" Then '如果排列结果尚未填满
arr(i) = InsStr(1) '在空位中填入第一个尚需进行排列的字符
Insert arr, b '剩下的字符进行到下一次递归过程!!!!!
arr(i) = "" '清理刚才的填充结果
End If
Next
Else '如果仅剩余了一个字符需要排列
For j = 1 To UBound(arr) '在排列结果中寻找仅剩余的一个空位
If arr(j) = "" Then '找到了
arr(j) = InsStr(1) '把剩余的一个字符填入
temp = "" '初始化临时变量
For i = 1 To UBound(arr)
temp = temp & arr(i) '整理排列结果
Next
resCol.Add temp '整理的结果保存入排列结果集合
arr(j) = "" '清理刚才的排列
Exit Sub '退出过程
End If
Next
End If
End Sub
然后在sheet1下,运行宏test,就会在sheet1的A列产生12345的所有排列,共120种。
然后
在b1写公式“=mid(a1,1,1)”
在c1写公式“=mid(a1,2,1)”
在d1写公式“=mid(a1,3,1)”
在e1写公式“=mid(a1,4,1)”
在f1写公式“=mid(a1,5,1)”
然后将上述公式下拉120行,于是12345的所有排列就被分散写开了。
然后copy下sheet1,数值粘贴到sheet2,删除第1列。
把要处理的正方形矩阵写在sheet3,从a1单元格写起。
然后写个宏,如下:
Sub work()
Dim k!
Dim lie!
Dim jieguo!
Dim m!, n!
For k = 1 To 120
jieguo = 0
For lie = 1 To 5
m = Sheet2.Cells(k, lie)
n = Sheet3.Cells(lie, m)
jieguo = jieguo + n
Next lie
Sheet2.Cells(k, 8) = jieguo
Next k
End Sub
在sheet2下运行宏,就在第8列显出了结果。
你可以根据第8列排序,看看最大值与最大值所对应的元素选法。
实际上,如果你的正方形矩阵如果恰是如你所写那种排列,则各种选法的结果都相同。