Страницы: 1
RSS
Вставка массива непустого массива в диапазон: вставляется пустота
 
добрый день.
помогите разобраться в чем может быть косяк.

Когда я присваиваю диапазону  значения массива, вставляется пустота, хотя массив состоит из текстовых элементов, что подтверждается msbox перед началом записи.
В нижеприведенном куске кода я присваиваю диапазону массив. Верхняя граница intersect = 1, т.е диапазон состоит из 1 ячейки.
Код
  Range(Cells(i + 1, 1), Cells(i + UBound(intersect, 1), width)).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Range(Cells(i + 1, 1), Cells(i + UBound(intersect, 1), 1)).Value = intersect

intersect был получен ранее в ходе выполнения процедуры arr_intersect , которая объединяет массивы, оставляя уникальные значения. Проверка msbox показывает, что в intersect записаны текстовые значения , и записаны правильно.
Код
intersect = arr_intersect(intersect, sp)
For m = 1 To UBound(intersect, 1)
                    MsgBox (intersect(m, 1))
Next m

Arr_intersect приведена ниже:
Код
Function arr_intersect(arr1() As String, arr2() As String)
 Dim arr3() As String
 Dim n As Integer, t As Integer, p As Integer
 On Error Resume Next
 If IsArrayEmpty(arr1) = False Then
    If IsArrayEmpty(arr2) = False Then
 n = 0
         For t = 1 To UBound(arr1, 1)
            For j = 1 To UBound(arr2, 1)
                If arr1(t, 1) = arr2(j, 1) Then
                n = n + 1
                End If
            Next
         Next
         ReDim arr3(1 To UBound(arr1, 1) + UBound(arr2, 1) - n, 1 To 1)
           For t = 1 To UBound(arr1, 1)
            arr3(t, 1) = arr1(t, 1)
      Next
       p = 0
        For j = 1 To UBound(arr2, 1)
        n = 0
            For t = 1 To UBound(arr1, 1)
              If arr2(j, 1) <> arr3(t, 1) Then
                n = n + 1
              End If
              Next
              If n = UBound(arr1) Then
                p = p + 1
                arr3(UBound(arr1, 1) + p, 1) = arr2(j, 1) 'записываем в конец новый элемент
              End If
        Next
arr_intersect = arr3
Else
arr_intersect = arr1
End If
Else
    If IsArrayEmpty(arr2) = False Then
    arr_intersect = arr2
   End If
End If
End Function

Проверка If IsArrayEmpty массива на пустоту , вроде была заимствована у ZVI.
Код
Function IsArrayEmpty(x) As Boolean
  Dim i&
  On Error Resume Next
  i = LBound(x, 1)
  IsArrayEmpty = Err <> 0
End Function

массив sp получался в результате обработки листа и получения списка значений в виде двумерного массива. В конкретном случае, он содержит 1 значение - слово.
Код
sp = ToInsert(kod, mas(1, k), mas(2, k))

Код
Function ToInsert(ByVal kod As String, ByVal name As String, ByVal bl_r As Integer) ', list1 As Worksheet)
Dim intersect() As String, sp() As String
Worksheets(name).Activate
   With ActiveSheet
   
        i = bl_r
       For i = bl_r To 6 Step -1
            j = 0
            If Cells(i, 2) = kod Then
               Do While Cells(i + 1 + j, 2) = ""
                   j = j + 1
               Loop
                If j > 0 Then
                ReDim sp(1 To j, 1)
                For k = 1 To UBound(sp, 1)
                    sp(k, 1) = Cells(i + k, 1).Value
                Next
                End If
            End If
        Next
    If IsArrayEmpty(sp) = True Then

    Erase sp
    ToInsert = sp
    Else
        ToInsert = sp
    End If
    End With
   End Function

Суть этой части программы в том, что по циклу пробегаем нужные листы, далее если в указанном столбце находим код, то берем в список sp значения из нижележащих ячеек соседнего столбца, у которых кода нет. Затем объединяем sp  и intersect (изначально пустой), переходим на следующий лист, опять заполняем sp, опять пересекаем и т.д. Затем в рабочем листе вставляем где нужно число строк соответствующее ubound(intersect,1) и значения intersect вставляется в ячейки. У меня строки добавляются, число строк правильное, но почему то диапазон заливается пустотой. Help.
 
Слишком много букв. Лучше приложите файл-пример. Как есть - Как надо
P/S/ использование зарезервированных слов VBA (intersect)  в качестве имен переменных плохой подход
Изменено: Sanja - 31.01.2019 18:24:19
Согласие есть продукт при полном непротивлении сторон
 
выкладываю файл. на листах База_i , Цех_i разное представление данных. На листе свод-подключены кнопки с одним и тем же макросом, настроенным на разные листы. Как видно из примера, если данные все есть, т.е подстроки строчки "люди" заполнены, макрос работает. Если же, как На листах База_ что то отсутствует, он вставляет пустоты. похоже все же не корректно работает функция arr_intersect..но проверить у меня не получается. уже мозг кипит.
 
Как я понимаю, чтобы сработал метод insert нужно сначала загнать что-то в буфер обмена (например Copy). Вообще-то в диапазон на листе двумерный и одномерный массив можно вывести просто оператором "=".
 
Цитата
Дорожный написал:
Как я понимаю, чтобы сработал метод insert нужно сначала загнать что-то в буфер обмена (например Copy). Вообще-то в диапазон на листе двумерный и одномерный массив можно вывести просто оператором "=".
так там это и сделано
вот же
Код
Range(Cells(i + 1, 1), Cells(i + UBound(inter, 1), 1)).Value = inter
если массив inter содержит 1 и более элементов, диапазон в левой части равенства представляет собой ячейу/ячейки в которые и заливаются данные из массива, простым присваиванием. Только вот не всегда срабатывает.
 
Цитата
NikitaV написал: Как видно из примера...
Из примера видно ЧТО-ТО, а вот как оно получается, каков алгоритм сбора данных, не понятно
Согласие есть продукт при полном непротивлении сторон
 
На листах книги С именем начинающимся на "база_" (или "цех_"для второй кнопки) содержатся таблицы. На листе " свод " та же таблица, только собранная из данных листов "база_". У каких то строк есть код, эти строки могут обладать подстроками. Мне необходимо перенести данные с листов "база" таким образом, чтобы подстроки собрались только уникальные. Т.е как сводной таблицой группируются подстроки строк с кодом.
Алгоритм: идем по 1 столбцу листа " свод", если значение ячейки = "люди", то в переменную "код" записываем код строки из ячейки 2  столбца.  Затем по циклу пробегаем 2-е столбцы листов "база", если код строки совпал с "код", то пока у строки есть непустые подстроки(непустые значения в нижних строках в 1 столбце), то записываем их значения в массив arr (Это делается процедурой  toinsert-  получаем массив для вставки значений). Затем применяем функцию arr_intersect которая объединяет массивы arr  , полученные с каждого листа, в массив inter. Важно, что при этом остаются лишь уникальные строки. Т.е если Иванов был на листе База_1, и на листе База_2, в массиве inter будет лишь одно значение Иванов. Также осуществляется проверка на пустоту массива. Если объединяются пустой и не пустой массив, получаем в точности не пустой, если 2 пустых , то применяем erase. Таким образом , если у строки "люди " нет подстрок, ничего вставляться в лист свод не должно.  А если есть, то вставляются строки, и записываются имена .
Изменено: NikitaV - 01.02.2019 10:52:11
Страницы: 1
Наверх