массив из непрерывных данных? - PullRequest
0 голосов
/ 20 ноября 2018

У меня довольно сложная проблема, которую я не могу обернуть ... надеюсь, вы мне поможете!

Допустим, мои данные в A1: G1, например:

A1   B1   C1   D1   E1   F1 G1

X    X    0    X    X    X   0  
or
Y    X    X    X    X    Z   X  

Мне нужно было бы придумать, как получить массив из этих данных в соответствии с X, НО, если, как в примере 1, в начале 2 раза X и 3 x рядом друг с другом, поэтому массив должен получится как {2; 2; 0; 3; 3; 3; 0}, поэтому я хочу, чтобы массив был длиной 7, а массив должен показывать число как x, сколько рядом друг с другом.

пример 2 должен выглядеть как {0; 4; 4; 4; 4; 0; 1}

если бы вы могли понять это, это действительно очень помогло бы мне!

Edit:

Попытка дать лучшее, более широкое представление о том, что я имею в виду ..

если данные:

    A   B   C  
1   X   X
2       X   X
3   X        

должно получиться как

    A   B   C
1:  2   4   0 
2:  0   4   2
3:  1   0   0

или в массиве {2 \ 4 \ 0; 0 \ 4 \ 2; 1 \ 0 \ 0}

на B1 и B2 должно быть 4, потому что формула должна учитывать горизонтальный, но и вертикальный континуум. Я пытался использовать формулу usmanhaqs, но я не смог изменить ее, поэтому счетчик сбрасывается в каждой строке. Реальный размер таблицы 7 раз 7 ячеек.

Я буду использовать массив с другим массивом (табло, которое также 7 раз 7 ячеек, и имеет номера 1, 2 или 3 в каждой ячейке), используя sumproduct, и оно выдаст очки этого игрока.

Я ценю ваши усилия по оказанию помощи начинающему ученику на vba:)

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Для решения с формулой я могу предложить только одно для особого случая, когда у вас есть только X и нули (пример 1):

=SUM(IF(A1:G1<>"X",0,INDEX(FREQUENCY(IF(A1:G1="X",COLUMN(A1:G1)),IF(A1:G1<>"X",COLUMN(A1:G1))),N(IF({1},SUBTOTAL(2,OFFSET(A1,0,0,1,COLUMN(A1:G1)))))+1,1)))

введено как формула массива с использованием Ctrl Shift Enter

Я обернул его в функцию SUM, чтобы продемонстрировать, что он генерирует массив, который может быть передан другой функции (результат:13) или он может быть введен в массив через несколько ячеек:

enter image description here

0 голосов
/ 20 ноября 2018

Вы можете проверить этот код

Function get_array(r As Range, match_chr As String)

    Dim check_val
    Dim array_value

    array_value = "{"

    For i = 1 To r.Count

    check_value = r.Item(i)

        If (check_value = match_chr) Then
            j = i + 1
            Do While (j <= r.Count) And (check_value = r.Item(j))

                j = j + 1
            Loop

            array_value = array_value & WorksheetFunction.Rept(j - i & ", ", j - i)
            i = j - 1
        Else
            array_value = array_value & "0, "
        End If

    Next

    array_value = Left(array_value, Len(array_value) - 2) & "}"
    get_array = array_value


End Function

Вы можете использовать его, как показано ниже

enter image description here

РЕДАКТИРОВАТЬ

найдите ниже другую функцию, чтобы получить массив значений, которые можно использовать в формулах

Function get_number_array(r As Range, match_chr As String)

    Dim check_val
    Dim array_value
    Dim number_array(1 To 50) As Long

    For i = 1 To r.Count

    check_value = r.Item(i)

        If (check_value = match_chr) Then
            j = i + 1
            Do While (j <= r.Count) And (check_value = r.Item(j))

                j = j + 1
            Loop

            For k = 1 To j - i
                number_array(i + k - 1) = j - i
            Next k

            i = j - 1
        Else
            number_array(i) = 0
        End If

    Next

    get_number_array = number_array


End Function

Вы должны использовать его так же, как и предыдущий, но он вернет массив Excel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...