добрый день.
помогите разобраться в чем может быть косяк.
Когда я присваиваю диапазону значения массива, вставляется пустота, хотя массив состоит из текстовых элементов, что подтверждается msbox перед началом записи.
В нижеприведенном куске кода я присваиваю диапазону массив. Верхняя граница intersect = 1, т.е диапазон состоит из 1 ячейки.
intersect был получен ранее в ходе выполнения процедуры arr_intersect , которая объединяет массивы, оставляя уникальные значения. Проверка msbox показывает, что в intersect записаны текстовые значения , и записаны правильно.
Arr_intersect приведена ниже:
Проверка If IsArrayEmpty массива на пустоту , вроде была заимствована у ZVI.
массив sp получался в результате обработки листа и получения списка значений в виде двумерного массива. В конкретном случае, он содержит 1 значение - слово.
Суть этой части программы в том, что по циклу пробегаем нужные листы, далее если в указанном столбце находим код, то берем в список sp значения из нижележащих ячеек соседнего столбца, у которых кода нет. Затем объединяем sp и intersect (изначально пустой), переходим на следующий лист, опять заполняем sp, опять пересекаем и т.д. Затем в рабочем листе вставляем где нужно число строк соответствующее ubound(intersect,1) и значения intersect вставляется в ячейки. У меня строки добавляются, число строк правильное, но почему то диапазон заливается пустотой. Help.
помогите разобраться в чем может быть косяк.
Когда я присваиваю диапазону значения массива, вставляется пустота, хотя массив состоит из текстовых элементов, что подтверждается 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.