7even Пользователь Сообщений: 85 |
Из программы в которой приходится работать некорректно выгружается табличка. Данные которые должны быть в одной строки разбросаны в 2 строки. Нужен макрос который собирет разбросанное в 2 строки в 1 строку. Такое возможно? |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#2 13.07.2015 21:05:06
Прикрепленные файлы
<#0> |
||
7even Пользователь Сообщений: 85 |
JayBhagavan, |
7even Пользователь Сообщений: 85 |
JayBhagavan, к сожалению, с таблицей в 20000 строк макрос не работает. ничего не происходит. Или же удаляется вся таблица. возможно ли это поправить? Изменено: SevenZZ — 14.07.2015 10:51:27 |
vikttur Пользователь Сообщений: 47199 |
#5 14.07.2015 11:49:45 JayBhagavan, если данные в какой-то из ячеек будут отсутствовать, получится нехорошее смещение (я понял так: не удалять пустоты, а объединить две строки в одну).
Код сработает на активном листе. Обработка всего массива данных, т.е. если на листе есть данные, которые изменять не нужно, необходимо подправить код Аккуратнее с кнопкой! Можно и несколько раз нажать, но строк станет меньше Прикрепленные файлы
|
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Попробуйте такой вариант. Если на 20 000 строк будет медленно, то можно сделать на массивах. |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
А вот и вариант на массивах. |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
vikttur, каков пример — таков ответ. <#0> |
SevenZZ Пользователь Сообщений: 85 |
завтра на работе опробую все предложенные варианты. спасибо всем кто отозвался помочь. Изменено: SevenZZ — 14.07.2015 22:25:07 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#10 14.07.2015 22:34:57
Так КАК всё же нужно? |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
|
SevenZZ Пользователь Сообщений: 85 |
#12 15.07.2015 07:13:24
не принципиально как.
спасибо сегодня опробую. Только вот если в таблице 7 колонок, а не 5, то 2 последние на добавляются на 2 лист. |
||||
vikttur Пользователь Сообщений: 47199 |
Файл из сообщения 11: если перенести значение С9 в С10, последняя строка игнорируется. |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#14 15.07.2015 13:16:40
Мой недочёт… Исправил файл — скачайте его заново. Количество столбцов определяется автоматически. |
||
SevenZZ Пользователь Сообщений: 85 |
#15 15.07.2015 22:22:40
Спасибо, всё работает как надо. |
||
Разделение текста на части и перенос в другие ячейки |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
1 |
|
Перенос значений из одной ячейки в другую по условию29.05.2019, 12:46. Показов 7737. Ответов 28
Добрый день. Ситуация такая: есть таблица в один столбец, в котором стоят текстовые значения. Выглядит он так: ООО Ромашка Бьюсь над макросом. Алгоритм такой: проверить, если текст в ячейке жирный, переносить в столбец 2 (рядом с «ООО Ромашка», то есть на строчку вверх относительно начальной строчки), если нет, то проверить, если текст в ячейке не черный, переносить в столбец 3 (рядом с номером телефона, то есть на две строчки вверх относительно начальной строчки). И выбрать после этого следующую ячейку в том же столбце. Без цикла, то есть одно нажатие — одна проверка.
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||||||||||
29.05.2019, 13:09 |
2 |
|||||||||||
Как-то так? А лучше скиньте файл с Вашим макросом Добавлено через 3 минуты
Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 13:57 [ТС] |
3 |
Говорит, Type Mismatch на вот эту строчку: Cells(r, c).ClearContents
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||||||
29.05.2019, 14:12 |
4 |
|||||||
Type Mismatch — несоответствие типов. Проверьте какое значение принимают r и c. Скорее всего проблема здесь:
замените на
Добавлено через 2 минуты
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 14:18 [ТС] |
5 |
Теперь Unable to set the Copy property of the Range class на строчку Selection.Copy = Cells(r — 1, c + 1) (я там подправила по логике, потому что колонка тоже меняется на соседние)
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
29.05.2019, 14:20 |
6 |
Selection.Copy = Cells(r — 1, c + 1) Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 14:22 [ТС] |
7 |
Ощущение, что оно наоборот работает сейчас — в эту ячейку копирует значение из той, которая выше в другом столбце (то есть пустую ячейку).
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||||||
29.05.2019, 14:28 |
8 |
|||||||
Проверьте перед запуском макроса, какая ячейка выбрана. Selection — текущая ячейка, в которой проверяются условия. По этой логике:
Здесь, вообщем-то, Cells(r, s) = Selection
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 14:33 [ТС] |
9 |
Все, поняла. Отработало, спасибо. Сейчас с черным цветом еще допилю и будет оно.
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
29.05.2019, 14:33 |
10 |
Вот и славненько!
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 14:37 [ТС] |
11 |
If Selection.Font.Bold = True Then Selection.Copy Cells(r — 1, c + 1) Else If (Selection.Font.ColorIndex <> 1) Then Selection.Copy Cells(r — 2, c + 2) Вот так в итоге сделала, отрабатывает вроде бы.
0 |
Заблокирован |
||||
29.05.2019, 14:39 |
12 |
|||
Можно и без лишних переменных обойтись, наверно
1 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
29.05.2019, 14:40 |
13 |
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 14:41 [ТС] |
14 |
Спасибо!)
0 |
370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
|
29.05.2019, 14:44 |
15 |
Остап Бонд, переменные я оставил так как думал, потом нужно будет пустые строки удалять
0 |
Заблокирован |
|
29.05.2019, 14:48 |
16 |
Selection.Font.Bond Вот где моё погоняло ещё не звучало
1 |
DDana 0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
||||
29.05.2019, 15:05 [ТС] |
17 |
|||
Я сразу исправила и дальше как-то внимания не обращала) Пробую добавить цикл по столбцу через
но где-то, судя по всему, дальше лажаю с описанием выделения. Что нужно добавить, чтобы идти по каждой ячейке, выделяя ее и отправляя на проверку?
0 |
Vlad999 3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
||||
29.05.2019, 15:13 |
18 |
|||
вместо selection применить cell
1 |
Заблокирован |
|
29.05.2019, 15:17 |
19 |
DDana, у Вас же через три строки данные проверятся должны? Или это другая задача?
0 |
0 / 0 / 0 Регистрация: 29.05.2019 Сообщений: 19 |
|
29.05.2019, 15:21 [ТС] |
20 |
Остап Бонд, у меня таблица выглядит как простыня, в которой разное расстояние между заполненными строчками. Везде, где строчки заполнены, они заполнены вот по этому принципу — название, телефон жирным, адрес серым. Работающий макрос на ручную проверку по каждой строчке благодаря этой теме у меня есть (спасибо всем еще раз, реально круто получить ответ), я пытаюсь понять логику, каким образом можно заставить его работать в диапазоне нужных строчек (допустим, 100 строк). Не пытаюсь запускать по всей области, потому что в таблице 50к строчек и комп на этом месте просто давится.
0 |
Во время работы в Эксель нередко возникает необходимость в изменении порядка ячеек, например, требуется поменять местами некоторые из них. Как это сделать разными способами, разберем в данной статье.
Содержание
- Процедура перемещения ячеек
- Метод 1: копирование
- Метод 2: перетаскивание
- Метод 3: использование макросов
- Заключение
Процедура перемещения ячеек
Отдельной функции, позволяющей выполнить данную процедуру в программе Excel нет. А при использовании стандартных инструментов неизбежно будет происходить сдвиг остальных ячеек, которые нужно потом вернуть на место, что в результате приведет к дополнительным действиям. Однако методы для выполнения поставленной задачи есть, и о них пойдет речь ниже.
Метод 1: копирование
Это, пожалуй, самый простой способ, который предполагает копирование элементов в другое место с заменой начальных данных. Порядок действий следующий:
- Встаем в первую ячейку (выделяем ее), которую планируем переместить. Находясь в главной вкладке программы нажимаем на кнопку “Копировать” (группа инструментов “Буфер обмена”). Также можно просто нажать комбинацию клавиш Ctrl+C.
- Переходим в любую свободную ячейку на листе и нажимаем кнопку “Вставить” в той же вкладке и группе инструментов. Или можно снова воспользоваться горячими клавишами – Ctrl+V.
- Теперь выделяем вторую ячейку, с которой хотим поменять местами первую, и также копируем ее.
- Встаем в первую ячейку и жмем кнопку “Вставить” (или Ctrl+V).
- Теперь выделяем ячейку, в которую было скопировано значение из первой ячейки и копируем ее.
- Переходим во вторую ячейку, куда нужно вставить данные, и нажимаем соответствующую кнопку на ленте.
- Выбранные элементы успешно поменяны местами. Ячейка, в которой временно размещались скопированные данные, больше не нужна. Щелкаем по ней правой кнопкой мыши и в открывшемся меню выбираем команду “Удалить”.
- В зависимости от того, есть ли рядом с данной ячейкой заполненные элементы справа/снизу или нет, выбираем соответствующий вариант удаления и жмем кнопку OK.
- Вот и все, что нужно было сделать для того, чтобы поменять ячейки местами.
Несмотря на то, что для реализации данного метода нужно выполнить немало дополнительных действий, все же, им пользуется наибольшее количество пользователей.
Метод 2: перетаскивание
Данный метод также применяется для того, чтобы поменять местами ячейки, однако, в этом случае будет происходить сдвиг ячеек. Итак, выполняем следующие действия:
- Выбираем ячейку, которую планируем переместить в новое место. Наводим курсор мыши на ее границу, и как только он изменит вид на привычный указатель (с 4 стрелками в разные стороны на конце), нажав и не отпуская клавишу Shift, выполняем перенос ячейки в новое место с помощью зажатой левой кнопки мыши.
- Чаще всего, этот метод используется для того, чтобы поменять местами соседние ячейки, так как сдвиг элементов в данном случае не нарушит структуру таблицы.
- Если мы решим переместить ячейку через несколько других, это повлечет за собой изменение расположения всех остальных элементов.
- После этого придется восстанавливать порядок.
Метод 3: использование макросов
Мы упоминали в начале статьи, что в Excel, увы, нет специального инструмента, позволяющего оперативно “перекинуть” местами ячейки (за исключением метода выше, который эффективен только для смежных элементов). Однако сделать это можно с помощью макросов:
- Для начала нужно убедиться в том, что в приложении активирован так называемый “режим разработчика” (по умолчанию выключен). Для этого:
- Переключаемся во вкладку “Разработчик”, где жмем по значку “Visual Basic” (группа инструментов “Код”).
- В редакторе, нажав на кнопку “View Code”, вставляем в появившемся окне код ниже:
Sub ПеремещениеЯчеек()
Dim ra As Range: Set ra = Selection
msg1 = "Произведите выделение ДВУХ диапазонов идентичного размера"
msg2 = "Произведите выделение двух диапазонов ИДЕНТИЧНОГО размера"
If ra.Areas.Count <> 2 Then MsgBox msg1, vbCritical, "Проблема": Exit Sub
If ra.Areas(1).Count <> ra.Areas(2).Count Then MsgBox msg2, vbCritical, "Проблема": Exit Sub
Application.ScreenUpdating = False
arr2 = ra.Areas(2).Value
ra.Areas(2).Value = ra.Areas(1).Value
ra.Areas(1).Value = arr2
End Sub - Закрываем окно редактора, щелкнув привычную кнопку в виде крестика в верхнем правом углу.
- Зажав клавишу Ctrl на клавиатуре выделяем две ячейки или две области с одинаковым количество элементов, которые планируем поменять местами. Затем нажимаем кнопку “Макросы” (вкладка “Разработчик”, группа “Код”).
- Появится окно, в котором мы видим ранее созданный макрос. Выбираем его и щелкаем “Выполнить”.
- В результате работы макрос поменяет местами содержимое выделенных ячеек.
Примечание: при закрытии документа макрос будет удален, поэтому, в следующий раз его нужно будет создавать заново (при необходимости). Но, если вы предполагаете, что в дальнейшем придется часто выполнять подобные операции, файл можно сохранить с поддержкой макросов.
Заключение
Работа с ячейками в таблице Эксель предполагает не только внесение, редактирование или удаление данных. Иногда требуется перенести или поменять местами ячейки, содержащие определенные значения. Несмотря на то, что в функционале Эксель нет отдельного инструмента для решения данной задачи, выполнить ее можно путем копирования и последующей вставки значений, переноса ячейки или использования макросов.
How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this, including across worksheets and workbooks.
Sections:
Simple Copy/Paste
Copy Entire Range
Copy between Worksheets
Copy between Workbooks
Notes
Simple Copy/Paste
Range("A1").Copy Range("B1")
This copies cell A1 to cell B1.
Range(«A1»).Copy is the part that copies the cell.
Range(«B1») is the cell where the data will be copied.
This is a simple one line piece of code and it’s very easy to use.
Notice that there is a space between these two parts of the code.
Copy Entire Range
Range("A1:A5").Copy Range("B1:B5")
Range(«A1:A5»).Copy is the part that copies the range.
Range(«B1:B5») is the range where the data will be copied.
You can also write it like this:
Range("A1:A5").Copy Range("B1")
Notice that the range to where you will copy the data has only a reference to cell B1.
You only have to reference the very first cell to which the range will be copied and the entire range will copy in the cells below there.
NOTE: if you do it like this, you may end up overwriting data and Excel will not give you a warning about this; the data will simply be filled down as far as it needs to go to copy the first range.
Copy between Worksheets
Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("B1")
This follows the same pattern as the above examples except that we need to tell the macro from which sheet we want to get the data and to which sheet we want to copy the data.
Sheets(«Sheet1»). is placed in front of the first range and that means to get the data from Sheet1, which is the name of a worksheet in the workbook.
Sheets(«Sheet2»). is placed in front of the range to which we want to copy the data and Sheet2 is the name of the worksheet where the data will be copied.
Copy between Workbooks
Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet1").Range("A1").Copy Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet3").Range("A1")
Here, we follow the above examples and, this time, add a reference to the workbooks from which we want to get the data and to which we want to place the data.
Workbooks(«Copy and Paste Data using Macro VBA in Excel.xlsm»). is the code that says in which workbook we want to place the data. Copy and Paste Data using Macro VBA in Excel.xlsm is the name of the workbook. In this example I used this for both parts, the workbook from which the data comes and where it goes. This allows you to run this macro within a single workbook and still show you how it works. In a real-world example, the first part contains the name of the workbook where you get the data from and the second contains the name of the workbook where you want to place the data.
Read this tutorial to copy values from another workbook, even if it’s closed.
Notes
All examples in the attached workbook have been commented out. Simply remove the single quote from the line of code you want to test and then run the macro.
Download the attached file to get these examples in Excel.
Similar Content on TeachExcel
Activate or Navigate to a Worksheet using Macros VBA in Excel
Tutorial: Make a particular worksheet visible using a macro in Excel.
This is called activating a wo…
Get the Name of a Worksheet in Macros VBA in Excel
Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…
Get the Last Row using VBA in Excel
Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…
Remove Dashed Lines from Copy Paste VBA in Excel
Tutorial: How to remove the flashing dashes from a copy/paste range using VBA in Excel; this removes…
Copy one range and paste in another range
Tutorial: Below is a macro, just copy and paste it into a module in your workbook and go from there…
Guide to Combine and Consolidate Data in Excel
Tutorial: Guide to combining and consolidating data in Excel. This includes consolidating data from …