Страницы: 1
RSS
Удаление элемента из массива
 
Здравия всем!    
Не могу найти метод удаляющий элемент из массива.    
 
       Рецептура = Лист.Range(Cell.Offset(0, -3), Cell.Offset(10, -3)).Value  
 
Получается, как я понимаю, массив значений. И вот хочу из этого массива удалить пустые элементы. Перебираю каждый и проверяю, но как удалить не могу найти.    
Рецептура(5,1).Delete ничё не удаляет... или можно как-то иначе?
 
в VBA уже никак.  
Записывайте сначала в промежуточный массив диапазон.  
Потом циклом в Рецептуру только непустые элементы.  
 
Или если у Вас, например, на листе пустые ячейки и константы, то можно выделить только константы:  
Рецептура = Лист.Range(Cell.Offset(0, -3), Cell.Offset(10, -3)).SpecialCells(xlCellTypeConstants, 23).Value
Bite my shiny metal ass!      
 
Можете попробовать мой вариант решения аналогичной проблемы:  
 
 
Sub ПримерИспользования()  
   On Error Resume Next  
   arr = [a1:d15]
   arr2 = DeleteBlankRows(arr, [a19])
   [f1:z111].Clear
   [f1].Resize(UBound(arr2, 1), UBound(arr2, 2)).Value = arr2
End Sub  
 
Function DeleteBlankRows(ByVal arr As Variant, ByVal col As Long) As Variant  
   ' осуществляет удаление пустых строк из массива  
   ' получает в качестве параметров исходный массив, и номер столбца,  
   ' по которому определяется, является ли строка постой  
   ' возвращает новый массив (с меньшей размерностью по вертикали)  
   If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical: Exit Function  
   If col > UBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function  
   If col < LBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function  
 
   Dim iCount As Long    ' кол-во непустых строк  
   For i = LBound(arr) To UBound(arr)  
       iCount = iCount - (arr(i, col) <> "")  
   Next i  
 
   ReDim narr(LBound(arr, 1) To iCount + LBound(arr, 1) - 1, LBound(arr, 2) To UBound(arr, 2))  
 
   iCount = LBound(narr)    ' счётчик записей  
   For i = LBound(arr, 1) To UBound(arr, 1)  
       If arr(i, col) <> "" Then  
           For j = LBound(arr, 2) To UBound(arr, 2)  
               narr(iCount, j) = arr(i, j)  
           Next j  
           iCount = iCount + 1  
       End If  
   Next i  
 
   DeleteBlankRows = narr  
End Function
 

Вот пример в виде файла: http://excelvba.ru/XL_Files/Sample__02-03-2010__11-33-02.zip <BR>Попробуйте ставить в желтую ячейку числа от 1 до 4, и нажимать зеленую кнопочку. <BR>В столбец будет записываться массив [a1:d15], только без пустых строк. Пустой строка считается в том случае, если в определённом столбце (номер которого написан в желтой ячейке) ячейка пустая.

 
Понадобилось копировать  диапазон с одного листа на другой (в примере - на тот же). Но диапазон не весь, а с разрывами. Расстояния между блоками и сами блоки разные. В блоках могут отсутствовать значения. В рабочем файле 8 блоков по 1-13 ячеек (всего 40 значений).  
Копировать можно последовательным перебором. В файле диапазон заносится в массив.  
Можно ли составить более простой код? Т.е. есть ли возможность упростить код, удалив ненужные элементы из массива?
 
Если блоки расположены в одном столбце, можно так  
 
Sub save_base2()  
Const BLOCK$ = "1,3:7,10:13,16:18" 'диапазоны блока  
 
With Worksheets("данные")  
   .[C3].Range("A" & Replace$(Replace$(BLOCK$, ",", ",A"), ":", ":A")).Copy
   .Cells(Rows.Count, "G").End(xlUp)(2, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _  
       SkipBlanks:=False, Transpose:=True  
   Application.CutCopyMode = False  
End With  
End Sub
 
Ух ты! С константами еще не работал.  
Спасибо, сейчас буду экспериментировать.
 
не совсем понял задачу. Такой вариант  
 
Sub io()  
Dim x, i As Integer  
i = 6  
With Cells(Rows.Count, 7).End(xlUp)(2)  
   For Each x In [c3.c20].Value
       If x <> "" Then  
           Cells(.Row, i).Value = x  
           i = i + 1  
       End If  
   Next  
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Николай, спасибо за попытку, но не то.  
Формируется база, определенным данным предназначено определенное место в строке. Если на данный момент данных в ячейке нет, ее теплое место в базе пустое.
 
Как по мне - так исходный вариант вполне удобный.  
Строк пусть и много - зато сразу понятно, что делает код, и подкорректировать легко. И всё просто.  
Вы ведь этот код не каждые полчаса будете заново переписывать.  
Ну а на скорость работы "много строк" не влияет в данном случае.
 
Вариант Алексея работает. Понравилось - для меня новое.  
Не понял с подстановкой, надо почитать.  
 
Игорь, согласен, все прозрачно, но душа требует гармонии :)
 
Подстановка превращает "1,3:7,10:13,16:18" в "A1,A3:A7,A10:A13,A16:A18", т.е. в правильный адрес диапазона. Если удобнее записывать строку в виде "1,3-7,10-13,16-18", подстановка будет  
 
   .[C3].Range("A" & Replace$(Replace$(BLOCK$, ",", ",A"), "-", ":A")).Copy
 
Полный сервис :)  
Я не понял, почему "А", а не "С" и сам позже разобрался бы, но раз уж есть... Спасибо за примеры и разъяснения.
Страницы: 1
Читают тему
Наверх