Привет Всем! Это мой первый пост, поэтому сильно не бейте)
Столкнулся с такой задачей. Существует динамическая треугольная корреляционная матрица. (построенная "Анализ данных\Описательная статистика\корреляция". Или в VBA - Application.Run "ATPVBAEN.XLAM!Mcorrel") Количество элементов может быть от 2 до 250.
Как зеркально симметрично заполнить матрицу до прямоугольной?
В голову приходит только: Создать доп лист, Транспонировать матрицу, и используя "Если" склеить 2 матрицы. Но это утяжелит расчет. Есть еще варианты как быстрее сделать?
P.S. Может еще кто знает почему рассчитывая матрицу вручную "Анализ данных\Описательная статистика\корреляция" по времени корматрица рассчитывается в 10ки раз быстрее, нежели средствами vba: Application.Run "ATPVBAEN.XLAM!Mcorrel". При Матрице 50 на 50 расчет в Вба занимает около 15 минут, а в ручную менее минуты.
Привет Всем! Это мой первый пост, поэтому сильно не бейте)
Столкнулся с такой задачей. Существует динамическая треугольная корреляционная матрица. (построенная "Анализ данных\Описательная статистика\корреляция". Или в VBA - Application.Run "ATPVBAEN.XLAM!Mcorrel") Количество элементов может быть от 2 до 250.
Как зеркально симметрично заполнить матрицу до прямоугольной?
В голову приходит только: Создать доп лист, Транспонировать матрицу, и используя "Если" склеить 2 матрицы. Но это утяжелит расчет. Есть еще варианты как быстрее сделать?
P.S. Может еще кто знает почему рассчитывая матрицу вручную "Анализ данных\Описательная статистика\корреляция" по времени корматрица рассчитывается в 10ки раз быстрее, нежели средствами vba: Application.Run "ATPVBAEN.XLAM!Mcorrel". При Матрице 50 на 50 расчет в Вба занимает около 15 минут, а в ручную менее минуты.Milken
Sub Zerk() Dim r&, c&, n&, v() With [A1].CurrentRegion.Offset(1, 1) With .Resize(.Rows.Count - 1, .Columns.Count - 1) v = .Value n = UBound(v) For r = 1 To n - 1 For c = r + 1 To n v(r, c) = v(c, r) Next c, r .Value = v End With End With End Sub
[/vba]
(где вместо [A1] можно написать любую ячейку треугольной матрицы)
Кстати, Вашу процедуру можно подсократить:
[vba]
Код
Public Sub OFZMX() With Sheets("forMXOFZ").[A1].CurrentRegion .Borders.LineStyle = xlContinuous 'рисовуем все границы '.Borders.Weight = xlThin ' не обязательно .BorderAround , xlMedium 'рисовуем внешние границы .Rows(1).Font.Bold = True 'жирная первая строка
On Error Resume Next Worksheets("MXOFZ").Activate 'если этого листа нет - создание листа с названием, иначе - очистка листа If Err Then Sheets.Add.Name = "MXOFZ" Else Sheets("MXOFZ").Cells.Clear
Application.Run "ATPVBAEN.XLAM!Mcorrel", .Cells, Range("A1"), "К", True 'запуск прил анализ данных/корреляция End With End Sub
[/vba]
так?
[vba]
Код
Sub Zerk() Dim r&, c&, n&, v() With [A1].CurrentRegion.Offset(1, 1) With .Resize(.Rows.Count - 1, .Columns.Count - 1) v = .Value n = UBound(v) For r = 1 To n - 1 For c = r + 1 To n v(r, c) = v(c, r) Next c, r .Value = v End With End With End Sub
[/vba]
(где вместо [A1] можно написать любую ячейку треугольной матрицы)
Кстати, Вашу процедуру можно подсократить:
[vba]
Код
Public Sub OFZMX() With Sheets("forMXOFZ").[A1].CurrentRegion .Borders.LineStyle = xlContinuous 'рисовуем все границы '.Borders.Weight = xlThin ' не обязательно .BorderAround , xlMedium 'рисовуем внешние границы .Rows(1).Font.Bold = True 'жирная первая строка
On Error Resume Next Worksheets("MXOFZ").Activate 'если этого листа нет - создание листа с названием, иначе - очистка листа If Err Then Sheets.Add.Name = "MXOFZ" Else Sheets("MXOFZ").Cells.Clear
Application.Run "ATPVBAEN.XLAM!Mcorrel", .Cells, Range("A1"), "К", True 'запуск прил анализ данных/корреляция End With End Sub