Вывести формулу двумерного массива в виде отформатированной строки - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть формула массива в одной ячейке, которая выводит некоторый 2D-массив:

{={"a","b","c"; 1, 2, 3}}

(конечно, сложнее, но это последний шаг, если я пройдусь)

В В момент, когда я обертываю этот результат, возвращаем отформатированную строку следующим образом:

{="{" & TEXTJOIN(", ",TRUE,{"a","b","c";1,2,3}) &"}"}

, которая возвращает {a, b, c, 1, 2, 3} в виде строки. Это почти то, что я хочу, но массив уплощен, нет никакого способа различить 2 строки, так как отсутствует точка ;. Меня не волнует экранирование букв с помощью "" - мой фактический вариант использования - все целые числа

Есть ли способ преобразовать двумерный массив в некую строку, сохраняя различия строк? В идеале, без необходимости повторной ссылки на массив несколько раз, поскольку у меня нет места для промежуточных массивов, и было бы немного неэффективно пересчитывать много раз.


FWIW моя фактическая формула

{="{" & TEXTJOIN(", ",TRUE,INDIRECT([@Pt2])*INDIRECT([@Pm2])*INDIRECT([@Pb3])*INDIRECT([@Nt4])*INDIRECT([@Nm5])*INDIRECT([@Nb6])) &"}"}

, где [@...] указывают на имена именованных диапазонов, каждый из которых представляет собой матрицу 6x3 целых чисел от 0 до 2. Таким образом, формула вычисляет поэлементное произведение 6 различных двумерных массивов и выводит его в виде массива. Возможно, вы можете придумать лучший способ решения этой проблемы, но я пытался следовать менталитету KISS, и это казалось мне наиболее очевидным подходом.

Резюме

Итак я хочу, чтобы вывод массива поэлементного произведения

{0,2,0,0,2,1
0,2,2,1,1,0
0,0,0,1,1,0}

стал строкой "{0,2,0,0,2,1;0,2,2,1,1,0;0,0,0,1,1,0}" или любым другим однозначным представлением двумерного массива в одной ячейке. Надеюсь, что это имеет смысл:)

1 Ответ

0 голосов
/ 03 апреля 2020

Похоже, что TEXTJOIN() не "видит" двумерную структуру ввода. Однако, если вы введете (или введите массив) это в A1 :

={"a","b","c";1,2,3}

, а затем установите этот небольшой UDF:

Public Function joyn(rng As Range) As String
    v = rng.Value
    s = ""
    For i = LBound(v, 1) To UBound(v, 1)
        s = s & IIf(s = "", "", ";")
        For j = LBound(v, 2) To UBound(v, 2)
            s = s & v(i, j) & IIf(j = UBound(v, 2), "", ",")
        Next j
    Next i
    joyn = s
End Function

а затем в какой-то ячейке:

=joyn(A1:C2)

мы видим:

enter image description here

РЕДАКТИРОВАТЬ # 1:

Если вы хотите напрямую обернуть константу массива и уверены, что она двумерная, тогда мы можем пропустить шаги от диапазона к массиву:

Public Function joynAC(v As Variant) As String
    Dim s As String, i As Long, j As Long

    s = ""
    For i = LBound(v, 1) To UBound(v, 1)
        s = s & IIf(s = "", "", ";")
        For j = LBound(v, 2) To UBound(v, 2)
            s = s & v(i, j) & IIf(j = UBound(v, 2), "", ",")
        Next j
    Next i

    joynAC = s
End Function
...