Доброго времени суток господа! Помогите с макросом который будет копировать значения только заполненных ячеек ( то есть пустые ячейки он не трогает) из одного массива в другой, В примере указан массив копирования и массив вставки. И чтобы имеющиеся значения в массиве вставке не затрагивались. Спасибо Так же указан желаемый результат. Прикрепленные файлы
Впитываю знания, как борщ после тренировки ^^) |
|
gling Пользователь Сообщений: 4024 |
Здравствуйте. Включаете запись макроса макрорекордером — Копируете Массив копирования — Активируете левую верхнею ячейку Массива вставки — открываете специальную вставку — ставите галку Пропускать пустые ячейки — ОК — Выключаете запись макроса. Всё макрос готов, можно пользоваться, при необходимости можно подправить и изменить ячейки. Но зачем это надо, если и без макроса можно быстренько всё сделать. Изменено: gling — 29.08.2020 02:12:32 |
Молодое_Поколение Пользователь Сообщений: 144 |
#3 29.08.2020 14:15:11 Помогите победить ошибку,excel не копирует разные фрагменты, что делать?
Впитываю знания, как борщ после тренировки ^^) |
||||
Borrusale Пользователь Сообщений: 173 |
Привет Быстрее молнии, быстрее ветра, быстрее калькулятора |
Mershik Пользователь Сообщений: 8277 |
#5 29.08.2020 15:30:55 Молодое_Поколение, Добрый день, еще вариант.
Не бойтесь совершенства. Вам его не достичь. |
||
Borrusale, в рабочем варианте большая таблица тормозит сильно, есть способы быстрее сделать? прикрепил пример рабочей таблицы с вашим макросом https://cloud.mail.ru/public/3FFv/CJdPrWkHY Mershik, ваш вариант неплохой, но он заменяет пробелы на «хххххх», а мне нужно чтобы он проблемы не трогал вообще, я сделал чтобы пробелы заменялись на «», так он все равно вставляет пробелы из первой таблицы во вторую. по производительности ваш быстрее, привел файл с примером рабочим в предыдущем сообщении Впитываю знания, как борщ после тренировки ^^) |
|
Кто разбирается в данной теме, подскажите решение этой проблемы Впитываю знания, как борщ после тренировки ^^) |
|
Михаил Витальевич С. Пользователь Сообщений: 10514 |
#8 30.08.2020 18:01:21
какой именно? Этой?
Так в его коде на «хххххх» заменяются не пробелы, а пустые ячейки. Вам что нужно? зы. Изменено: Михаил Витальевич С. — 30.08.2020 18:05:56 |
||||
Михаил Витальевич С., в сообщении #6 в облаке приведен последний пример кнопка «Borrusale» макрос help, он работает так как нужно, только медленный, мне нужно чтобы он работал быстрее и все Впитываю знания, как борщ после тренировки ^^) |
|
Borrusale Пользователь Сообщений: 173 |
Напишите адрес ячейки в которой есть пробел Быстрее молнии, быстрее ветра, быстрее калькулятора |
Михаил Витальевич С. Пользователь Сообщений: 10514 |
#11 30.08.2020 18:27:00 вот так будет чуть быстрее, но не очень:
######################################
не понял Изменено: Михаил Витальевич С. — 30.08.2020 18:33:19 |
||||
Borrusale, ваш макрос работает так как я и хотех единственное, что нужно быстрее — массив состоит из 35 000 ячеек, да и к тому же некоторые строки имеют по 250 символов …. очень долго… А пробел — первая таблица 37 строка Впитываю знания, как борщ после тренировки ^^) |
|
Borrusale Пользователь Сообщений: 173 |
#13 30.08.2020 18:37:24
у Вас всего 27 строк. Адрес ячейки пожалуйста ? Например «B15» «D7» Изменено: 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 Впитываю знания, как борщ после тренировки ^^) |
|
New Пользователь Сообщений: 4581 |
#16 30.08.2020 18:45:00 Может так подойдёт? )
Изменено: New — 30.08.2020 18:45:11 |
||
Borrusale Пользователь Сообщений: 173 |
#17 30.08.2020 18:47:37 Молодое_Поколение,я не могу его открыть . Мое предположение что в пустых ячейках что то есть. Замените IsEmpty на len в коде предложенном Mershik:
Изменено: Borrusale — 30.08.2020 18:47:58 Быстрее молнии, быстрее ветра, быстрее калькулятора |
||
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#18 30.08.2020 18:47:48
И что? У нас ограничение в 300. |
||
New, к сожалению нет, он удаляет пустые строки .. Впитываю знания, как борщ после тренировки ^^) |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
#20 30.08.2020 18:58:00
Вы это о чём? Я Вам напомнил, что ограничение не 100, а 300. Да и никому не нужен Ваш рабочий файл. Можно ведь создать НЕБОЛЬШОЙ аналог для форума. А Вы всё норовите рабочий вариант подсунуть. |
||
Hugo Пользователь Сообщений: 23249 |
Думаю технически быстрее будет сперва удалить эти немногие пустые строки в источнике (были тут супербыстрые коды, например от 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 |
Молодое_Поколение Пользователь Сообщений: 144 |
#22 30.08.2020 19:06:35 пока что лучшее решение вот это
Впитываю знания, как борщ после тренировки ^^) |
||
Hugo Пользователь Сообщений: 23249 |
Т.е. удаление не взлетает? Видел смотрели |
Михаил Витальевич С. Пользователь Сообщений: 10514 |
#24 30.08.2020 19:17:32
Вот объяснили б сразу нормально — еже б дано было сделано… |
||
Михаил Витальевич С., так точно! Надо научиться у вас правильно объяснять Впитываю знания, как борщ после тренировки ^^) |
|
Hugo Пользователь Сообщений: 23249 |
Ну тогда точно удалять — не вариант. Почему бы так и не сказать? Изменено: Hugo — 30.08.2020 19:32:48 |
Mershik Пользователь Сообщений: 8277 |
Hugo, хоть к 25 сообщению узнали истинную задачу Не бойтесь совершенства. Вам его не достичь. |
Михаил Витальевич С. Пользователь Сообщений: 10514 |
#28 30.08.2020 19:44:18 на основе макроса Mershik, из #5 и файла из первого сообщения:
Прикрепленные файлы
Изменено: Михаил Витальевич С. — 30.08.2020 19:54:34 |
||
Михаил Витальевич, дома буду обязательно посмотрю и дам обратную связь, спасибо за помощь 😎 Впитываю знания, как борщ после тренировки ^^) |
|
БМВ Модератор Сообщений: 21376 Excel 2013, 2016 |
#30 30.08.2020 20:27:02
Я что-то упустил? на примере из облака 1.7 секунды Изменено: БМВ — 30.08.2020 20:32:31 По вопросам из тем форума, личку не читаю. |
||
Макрос копирования непустых ячеек
Автор Bomont, 07.12.2011, 12:04
« назад — далее »
Господа, помогите с решением такой задачки:
есть столбец в котором есть пустые и непустые ячейки
необходимо макросом из него скопировать все непустые ячейки в соседний столбец с пропуском пустых ячеек
Как самый простой вариант, можно макросом перебирать все ячейки в стоблце и копировать каждую, если она не пустая. Однако если ячеек очень много и таких операций надо проводить много — это занимает много времени. Но наверняка найдется более лучший (бычтрый) способ?
P.S. вручную это делается так: ставится фильтр на столбец, где убирается галочка с пустых ячеей. Далее все это выделяется, копируется и при в ставке на новый лист — пустых ячеек уже нет.
ЦитироватьP.S. вручную это делается так: ставится фильтр на столбец, где убирается галочка с пустых ячеей. Далее все это выделяется, копируется и при в ставке на новый лист — пустых ячеек уже нет.
А Вы макрорекордером не пробовали пользоваться. Я по Вашему алгоритму попробовал, смотрите, что получилось.
Цитата: ShAM от 07.12.2011, 12:47
А Вы макрорекордером не пробовали пользоваться. Я по Вашему алгоритму попробовал, смотрите, что получилось.
Примерно то же самое, только макрорекодер подправлен немного
Скажи мне, кудесник, любимец ба’гов…
Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995
Или
Sub Макрос9()
Sheets("Лист3").Range("A:A").SpecialCells(2).Copy Sheets("Лист2").Range("A1")
End Sub
Скажи мне, кудесник, любимец ба’гов…
Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995
Цитата: nilem от 07.12.2011, 13:20
ИлиSub Макрос9()
Sheets("Лист3").Range("A:A").SpecialCells(2).Copy Sheets("Лист2").Range("A1")
End Sub
Всем большое спасибо! Вот одной строчкой и искал вариант! Еще раз спасибо за помощь!!!
- Профессиональные приемы работы в Microsoft Excel
-
►
Обмен опытом -
►
Microsoft Excel -
►
Макрос копирования непустых ячеек
Looks like you may be making some common rookie mistakes here (it’s okay we all did it).
VBA example with line-by-line explanations
TIP: Try not to use «Select» or «Copy». Why use select when all you have to do is reference the cells themselves? For example, instead of using
Sheets("codes").Select
Range("A5:A100").Select
Selection.Copy
Sheets("Sheet2").Select
Range("B28").Select
ActiveSheet.Paste
Just use
dim mySheet as Worksheet, myOtherSheet as Worksheet, myBook as Workbook 'Define your workbooks and worksheets as variables
set myBook = Excel.ActiveWorkbook
set mySheet = myBook.Sheets("codes")
set myOtherSheet = myBook.Sheets("Sheet2")
dim i as integer, j as integer 'Define a couple integer variables for counting
j = 28 'This variable will keep track of which row we're on in Sheet2 (I'm assuming you want to start on line 28)
for i = 5 to 100 'This is the beginning the the loop which will repeat from 5 to 100 . . .
if mySheet.Cells(i,1).value <> "" then ' . . . for each digit, it will check if the cell's value is blank. If it isn't then it will . . .
myOtherSheet.Cells(j,2).value = mySheet.Cells(i,1).value ' . . . Copy that value into the cell on Sheet2 in the row specified by our "j" variable.
j = j + 1 'Then we add one to the "j" variable so the next time it copies, we will be on the next available row in Sheet2.
end if
next i 'This triggers the end of the loop and moves on to the next value of "i".
I did the same thing all the time when I first started, and it never works out right. «Select» causes errors left and right. Use my code, read the comments, and you’ll be fine. A quick WARNING: I don’t have Excel on this computer so I couldn’t test the code. If it doesn’t work for some reason, leave me a comment and tomorrow I’ll fix it at work.
The above code will omit blank cells completely when copying the data over to your second sheet. If you want to input a certain text for blank cells instead (like «N/A»), then you can use the following:
dim mySheet as Worksheet, myOtherSheet as Worksheet, myBook as Workbook 'Define your workbooks and worksheets as variables
set myBook = Excel.ActiveWorkbook
set mySheet = myBook.Sheets("codes")
set myOtherSheet = myBook.Sheets("Sheet2")
dim i as integer, j as integer 'Define a couple integer variables for counting
j = 28 'This variable will keep track of which row we're on in Sheet2 (I'm assuming you want to start on line 28)
for i = 5 to 100 'This is the beginning the the loop which will repeat from 5 to 100 . . .
if mySheet.Cells(i,1).value <> "" then ' . . . for each digit, it will check if the cell's value is blank. If it isn't then it will . . .
myOtherSheet.Cells(j,2).value = mySheet.Cells(i,1).value ' . . . Copy that value into the cell on Sheet2 in the row specified by our "j" variable.
else 'If the cell is blank, then . . .
myOtherSheet.Cells(j,2).value = "N/A" ' . . . place the text "N/A" into the cell in row "j" in Sheet2.
end if 'NOTICE we moved the "end if" statement up a line, so that it closes the "if" statement before the "j = j + 1" statement. _
This is because now we want to add one to the "j" variable (i.e., move to the next available row in Sheet2) regardless of whether the cell in the "codes" sheet is blank or not.
j = j + 1 'Then we add one to the "j" variable so the next time it copies, we will be on the next available row in Sheet2.
next i 'This triggers the end of the loop and moves on to the next value of "i".
Скопировать все непустые ячейки из одного файла в другой |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в VBA Excel. Методы Cut, Copy и PasteSpecial объекта Range, метод Paste объекта Worksheet.
Метод Range.Cut
Range.Cut – это метод, который вырезает объект Range (диапазон ячеек) в буфер обмена или перемещает его в указанное место на рабочем листе.
Синтаксис
Параметры
Параметры | Описание |
---|---|
Destination | Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена. |
Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.
Метод Range.Copy
Range.Copy – это метод, который копирует объект Range (диапазон ячеек) в буфер обмена или в указанное место на рабочем листе.
Синтаксис
Параметры
Параметры | Описание |
---|---|
Destination | Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена. |
Метод Worksheet.Paste
Worksheet.Paste – это метод, который вставляет содержимое буфера обмена на рабочий лист.
Синтаксис
Worksheet.Paste (Destination, Link) |
Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.
Параметры
Параметры | Описание |
---|---|
Destination | Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект. |
Link | Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию). |
В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.
Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).
Примеры
Вырезание и вставка диапазона одной строкой (перемещение):
Range(«A1:C3»).Cut Range(«E1») |
Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:
Range(«A1:C3»).Cut ActiveSheet.Paste Range(«E1») |
Копирование и вставка диапазона одной строкой:
Range(«A18:C20»).Copy Range(«E18») |
Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:
Range(«A18:C20»).Copy ActiveSheet.Paste Range(«E18») |
Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:
Range(«A1»).Copy Range(«B1:D10») |