Математическое транспонирование в excel

Добрый день всем! В настоящее время я пытаюсь что-то понять в Excel, прежде чем внедрять в него VBScript. Мне нужно математически переставить несколько ячеек (10*10 или 5r*10c) в матрице:

-------------------------------
| .. | .. | .. | .. | .. | .. |
| 21 | 22 | 23 | 24 | 25 | .. |
| 11 | 12 | 13 | 14 | 15 | .. |
|  1 |  2 |  3 |  4 |  5 | .. |
-------------------------------

Должен стать

-------------------------------
| .. | .. | .. | .. | .. | .. |
|  3 | 13 | 23 | 33 | 43 | .. |
|  2 | 12 | 22 | 32 | 42 | .. |
|  1 | 11 | 21 | 31 | 41 | .. |
-------------------------------

Сейчас я не математик (на данный момент я более или менее программист), но я придумал: F(y)=((MOD(x,10)-1)*10)+(1+((x-MOD(x,10))/10)) (x значение в преблоке вверху, y значение в преблоке блок ниже.) Теперь это работает нормально до определенного момента (например, 10).

В VBScript я сначала написал следующее:

Function GetPosInSrcRack(Pos)
    Dim PlateDef(9), x, y, i, tmp

    ' Plate Definition
    ReDim tmp(UBound(PlateDef))
    For x = 0 To UBound(PlateDef)
        PlateDef(x) = tmp
    Next

    i = 1
    For x = 0 To UBound(PlateDef)
        For y = 0 To UBound(PlateDef(x))
            PlateDef(x)(y) = i
            i = (i + 1)
        Next
    Next

    'Dim msg ' Check definition
    'For x = 0 To (UBound(PlateDef))
    '    msg = Join(PlateDef(x), ", ") & vbCrLf & msg
    'Next

    ' Get the Position
    y = (pos Mod 10)
    x = ((pos - y) / 10)

    GetPosInSrcRack = PlateDef(y)(x)
End Function

Что, конечно, работает, но хреново.

Используя приведенную выше формулу, я бы написал:

Function GetPosInSrcRack(Pos)
    Pos = (((Pos MOD 10)-1)*10)+(1+((Pos - (Pos MOD 10))/10))
End Function

Но, как я уже сказал, это все еще неверно (10 дает -8). Кто-нибудь может мне помочь?


person van Nijnatten    schedule 14.02.2013    source источник


Ответы (2)


y=(MOD(x-1,10))*10+INT((x-1)/10)+1

(Кстати, то, что вы делаете, не является транспонированием матриц, но это делает то же, что и вы, только лучше.)

person Řídící    schedule 14.02.2013
comment
Кажется, это помогает! Спасибо! Он не идеален математически, но и не мой, и, как вы сказали, он делает то, что я хочу! Спасибо! Небольшое редактирование: +1-1 это 0, так что мы можем это убрать ;-) - person van Nijnatten; 14.02.2013
comment
@JvN Обратите внимание, что за пределами 10 строк или столбцов у вас наверняка возникнут проблемы. Простая причина в том, что, например, число 11 появляется в двух местах, а его транспонированием являются числа 2 и 101. Таким образом, для больших матриц формула, которую вы ищете, не может существовать. - person Řídící; 15.02.2013

Просто используйте опцию Paste Special > Transpose.

person Peter L.    schedule 14.02.2013
comment
Это было бы так, но я должен сделать это программно где-то еще. Где-то у меня нет диапазона ячеек, но где мне нужно найти, например, F(i), где i=5 (было бы 41). Заранее спасибо, конечно! - person van Nijnatten; 14.02.2013
comment
А как насчет функции TRANSPOSE? Введенная как формула массива с правильными размерами, она также вернет желаемый результат. - person Peter L.; 14.02.2013
comment
Transpose Тоже не поможет. Я пытаюсь понять это в excel, как это. Но после этого у меня не будет массива, поэтому функция Transpose Excel не будет работать. Однако я знаю количество строк и столбцов. Спасибо за комментарии! - person van Nijnatten; 14.02.2013