Страницы: 1 2 След.
RSS
Копирование только значений (НЕПУСТЫХ ячеек) из одного массива в другой
 
Доброго времени суток господа!

Помогите с макросом который будет копировать значения только заполненных ячеек ( то есть пустые ячейки он не трогает) из одного массива в другой, В примере указан массив копирования и массив вставки. И чтобы имеющиеся значения в массиве вставке не затрагивались. Спасибо :)

Так же указан желаемый результат.
Впитываю знания, как борщ после тренировки ^^)
 
Здравствуйте. Включаете запись макроса макрорекордером - Копируете Массив копирования - Активируете левую верхнею ячейку Массива вставки - открываете специальную вставку - ставите галку Пропускать пустые ячейки - ОК - Выключаете запись макроса. Всё макрос готов, можно пользоваться, при необходимости можно подправить и изменить ячейки. Но зачем это надо, если и без макроса можно быстренько всё сделать.
Хотите закрасить ячейки с числами, тоже не сложно. Выделяете диапазон--жмете F5 - Выделить - константы - оставляете галку на числа - ОК - Выбираете нужный цвет заливки ячеек.
Изменено: gling - 29.08.2020 02:12:32
 
Помогите победить ошибку,excel не копирует разные фрагменты, что делать?
Цитата
Данная команда неприменима для нескольких фрагментов
Код
Sub Макрос1()
With Worksheets("Лист1")
    Sheets("Лист1").Select
    Range("B5:F32").Select
    Selection.SpecialCells(xlCellTypeConstants, 1).Select
    Selection.Copy
    Range("J9:N36").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
            Application.CutCopyMode = False
End With
End Sub
Впитываю знания, как борщ после тренировки ^^)
 
Привет
Быстрее молнии, быстрее ветра, быстрее калькулятора
 
Молодое_Поколение, Добрый день, еще вариант.
Код
Option Base 1
Sub sss()
Dim arrin, arrout(1 To 27, 1 To 5)
arrin = Range("B6:F32")
For r = 1 To 27
    For c = 1 To 5
        If IsEmpty(arrin(r, c)) Then
            arrout(r, c) = "хххххххх"
        Else
            arrout(r, c) = arrin(r, c)
        End If
    Next c
Next r
Range("J6:N32") = arrout
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Borrusale, в рабочем варианте большая таблица тормозит сильно, есть способы быстрее сделать? прикрепил пример рабочей таблицы с вашим макросом
Файл весит 316кб - поместил в облако https://cloud.mail.ru/public/3FFv/CJdPrWkHY

Mershik, ваш вариант неплохой, но он заменяет пробелы на "хххххх", а мне нужно чтобы он проблемы не трогал вообще, я сделал чтобы пробелы заменялись на "", так он все равно вставляет пробелы из первой таблицы во вторую.    по производительности ваш быстрее, привел файл с примером рабочим в предыдущем сообщении
Впитываю знания, как борщ после тренировки ^^)
 
Кто разбирается в данной теме, подскажите решение этой проблемы
Впитываю знания, как борщ после тренировки ^^)
 
Цитата
Молодое_Поколение написал:
подскажите решение этой проблемы
какой именно? Этой?
Цитата
Молодое_Поколение написал:
о он заменяет пробелы на "хххххх",
Так в его коде на "хххххх" заменяются не пробелы, а пустые ячейки. Вам что нужно?

зы.
Вы ж сами показали, в "Как должно быть - "хххххх"
Изменено: Михаил Витальевич С. - 30.08.2020 18:05:56
 
Михаил Витальевич С., в сообщении #6 в облаке приведен последний пример кнопка "Borrusale" макрос help, он работает так как нужно, только медленный, мне нужно чтобы он работал быстрее и все  :)  
Впитываю знания, как борщ после тренировки ^^)
 
Напишите адрес ячейки в которой есть пробел  
Быстрее молнии, быстрее ветра, быстрее калькулятора
 
вот так будет чуть быстрее, но не очень:
Код
Sub help()
'
    Set SourceRng = Range("A1:ai1000")
    Set ResultRng = Range("AK1:BS1000")
    Set InsertRng = Range("AK1:BS1000")
    Application.ScreenUpdating = False 'отключаем экран
    For i = 1 To SourceRng.Count
        If Len(SourceRng.Item(i).Value) = 0 Then
            ResultRng.Item(i).Value = InsertRng.Item(i).Value
        Else
            ResultRng.Item(i).Value = SourceRng.Item(i).Value
        End If
    
    Next
    Application.ScreenUpdating = True 'включаем экран
   
End Sub


######################################
PS.
А почему нельзя
Код
Sub ttt()
    Range("A1").CurrentRegion.Copy Range("AK1")
End Sub

не понял :qstn:
Изменено: Михаил Витальевич С. - 30.08.2020 18:33:19
 
Borrusale, ваш макрос работает так как я и хотех единственное, что нужно быстрее - массив состоит из 35 000 ячеек, да и к тому же некоторые строки имеют по 250 символов .... очень долго...

А пробел - первая таблица 37 строка
Впитываю знания, как борщ после тренировки ^^)
 
Цитата
Молодое_Поколение написал:
37 строк
у Вас всего 27 строк. Адрес ячейки пожалуйста ? Например "B15" "D7"
Пробелы есть только в названиях таблиц (ctrl+F не находит на листе пробелы)
Изменено: Borrusale - 30.08.2020 18:40:06
Быстрее молнии, быстрее ветра, быстрее калькулятора
 
Михаил Витальевич С.,

для чего это мне нужно?

каждый день обновляется база новые значения копируются в таблицу, бывает так что некоторые значения не прогружаются и на их месте пустая ячейка - мне нужно чтобы пустые ячейки НЕкопировались.. Тоесть чтобы в таблице всегда были последние обновленные значения.
Изменено: Молодое_Поколение - 30.08.2020 18:39:39
Впитываю знания, как борщ после тренировки ^^)
 
Borrusale, Borrusale,

файл с 35 000 ячейками весит больше 100кб - поэтому я поместил его в облако

https://cloud.mail.ru/public/3FFv/CJdPrWkHY
Впитываю знания, как борщ после тренировки ^^)
 
Может так подойдёт? )

Код
Sub ttt()
Dim iRow As Long, LastRow As Long
    
    Application.ScreenUpdating = False
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Range("A1:AI" & LastRow).Copy Range("AK1")
    LastRow = Cells(Rows.Count, "AK").End(xlUp).Row
    For iRow = LastRow To 1 Step -1
        If Len(Cells(iRow, "AK")) = 0 Then Rows(iRow).EntireRow.Delete
    Next iRow
    Application.ScreenUpdating = True
End Sub
Изменено: New - 30.08.2020 18:45:11
 
Молодое_Поколение,я не могу его открыть . Мое предположение что в пустых ячейках что то есть. Замените IsEmpty на len в коде  предложенном Mershik:
Код
Option Base 1Sub sss()
Dim arrin, arrout(1 To 27, 1 To 5)
arrin = Range("B6:F32")
For r = 1 To 27
    For c = 1 To 5
        If len(arrin(r, c))=0 Then
            arrout(r, c) = "хххххххх"
        Else
            arrout(r, c) = arrin(r, c)
        End If
    Next c
Next r
Range("J6:N32") = arrout
End Sub
Изменено: Borrusale - 30.08.2020 18:47:58
Быстрее молнии, быстрее ветра, быстрее калькулятора
 
Цитата
Молодое_Поколение написал:
файл с 35 000 ячейками весит больше 100кб
И что? У нас ограничение в 300.
 
New, к сожалению нет, он удаляет пустые строки ..  :cry:  
Впитываю знания, как борщ после тренировки ^^)
 
Цитата
Молодое_Поколение написал:
Юрий М , вот так вот  
Вы это о чём? Я Вам напомнил, что ограничение не 100, а 300. Да и никому не нужен Ваш рабочий файл. Можно ведь создать НЕБОЛЬШОЙ аналог для форума. А Вы всё норовите рабочий вариант подсунуть.
 
Думаю технически быстрее будет сперва удалить эти немногие пустые строки в источнике (были тут супербыстрые коды, например от ZVI https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=8&TID=24531&TITLE_SEO=24531&MID=335928#message335928 ), а уже затем весь нормализованный диапазон и скопировать. Если ещё нужно.
Изменено: Hugo - 30.08.2020 19:01:09
 
пока что лучшее решение вот это
Код
Sub help()
'
    Set SourceRng = Range("A1:ai1000")
    Set ResultRng = Range("AK1:BS1000")
    Set InsertRng = Range("AK1:BS1000")
    Application.ScreenUpdating = False 'отключаем экран
    For i = 1 To SourceRng.Count
        If Len(SourceRng.Item(i).Value) = 0 Then
            ResultRng.Item(i).Value = InsertRng.Item(i).Value
        Else
            ResultRng.Item(i).Value = SourceRng.Item(i).Value
        End If
     
    Next
    Application.ScreenUpdating = True 'включаем экран
    
End Su
Впитываю знания, как борщ после тренировки ^^)
 
Т.е. удаление не взлетает? Видел смотрели :)
 
Цитата
Молодое_Поколение написал:
бывает так что некоторые значения не прогружаются и на их месте пустая ячейка - мне нужно чтобы пустые ячейки НЕкопировались.. Тоесть чтобы в таблице всегда были последние обновленные значения.
Вот объяснили б сразу нормально - еже б дано было сделано...
Т.Е, - диапазон у вас есть и его размер постоянен; ежедневно обновляется, но бывает, не все ячейки заполнены. Так? И вот, которые в новом пустые не должны затирать старые, в которых есть значения - правильно я понял?
 
Михаил Витальевич С., так точно!

Надо научиться у вас правильно объяснять :)  
Впитываю знания, как борщ после тренировки ^^)
 
Ну тогда точно удалять - не вариант. Почему бы так и не сказать?
Тогда быстрее добить эти пустые старыми (прежними) данными и вообще никуда больше ничего не копировать :)
Ну или копирнуть теперь всё это назад.
Изменено: Hugo - 30.08.2020 19:32:48
 
Hugo, хоть к 25 сообщению узнали истинную задачу
Не бойтесь совершенства. Вам его не достичь.
 
на основе макроса Mershik, из #5 и файла из первого сообщения:
Код
Sub ttt()
    Dim arrin(), arrout(), R&, C&
    arrin = Range("B6").CurrentRegion.Value
    arrout = Range("J10").CurrentRegion.Value
    
    For R = 1 To UBound(arrin)
        For C = 1 To UBound(arrin, 2)
            If Len(arrin(R, C)) = 0 Or arrin(R, C) = " " Then
        '        ни чего не делаем
            Else
                arrout(R, C) = arrin(R, C)
            End If
        Next C
    Next R
    Range("J10").CurrentRegion.Value = arrout
End Sub
Изменено: Михаил Витальевич С. - 30.08.2020 19:54:34
 
Михаил Витальевич, дома буду обязательно посмотрю и дам обратную связь, спасибо за помощь 😎
Впитываю знания, как борщ после тренировки ^^)
 
Код
    Range("B6").CurrentRegion.Copy
    Range("J10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True

Я что-то упустил? на примере из облака 1.7 секунды
Изменено: БМВ - 30.08.2020 20:32:31
По вопросам из тем форума, личку не читаю.
Страницы: 1 2 След.
Наверх