Страницы: 1
RSS
Вопрос по поводу копированию в вставке и переносе данных
 
Добрый день всем! Подскажите, пожалуйста, кто знает.
Есть два столбца, один из них с данными, второй пустой. Мне нужно с одного скопировать данные в другой и потом те, что я скопировал, удалить с первого. Зажав Ctrl я выделяю нужные строчки затем копирую и вставляю в другой столбец. Те данные, что я вставил во 2-й столбец становятся выделенными синим, а те строки, с которых я копировал с первого столбца обведены пунктиром, т.е. показываются места откуда было копирование. Мне теперь эти данные с первого столбца нужно удалить. Можно ли как-то быстро выделить те места, что подсвечены пунктиром в 1-м столбце и удалить, что бы заново с помощью Ctrl не выбирать каждую нужную строчку отдельно? Имею ввиду может есть какая-то комбинация клавиш...

Спасибо заранее!
 
Ну можно, например, присвоить вашему диапазону имя (через диспетчер имен), и выбирать его из выпадающего списка.  
 
Код
Sub Макрос1()
Dim rSel As Range
Set rSel = Selection
rSel.Copy
[B1].PasteSpecial Paste:=xlPasteValues
rSel.Delete shift:=xlUp
End Sub
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Владимир, если Вас не затруднит, можно поподробней? Макрос я включил, но как именно он работает?
 
Выделяете ячейки в столбце и нажимаете макрос. То что выделено попадет в столбец В, а из исходного столбца, где делали выделение, удалится со сдвигом ячеек вверх.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Попробую описать подробнее. Есть 1С с продажами за день. Все эти продажи я переношу в Excel-отчет в один общий столбец. Потом из этого столбца мне нужно перенести отдельно аксессуары, моб. тел., чехлы, услуги в свои другие столбцы. У каждого (аксессуары, моб. тел., чехлы, услуги) свой отдельный слолбец. Каждый товар я сам выбираю в какой столбец перенести. По этому из общего столбца я выделяю, например, чехлы с помощью Ctrl и копирую в нужный столбец. Теперь с общего столбца мне их нужно удалить, так как они уже есть в столбце "Чехлы". Их может быть очень много и поэтому второй раз через Ctrl выбирать занимает время. В то время когда скопировал и вставил в общем столбце они выделены пунктиром, а в столбце "Чехлы" выделены синим. Я вот и думал, может есть возможность этот пунктир обратить в выделение и удалить одним нажатием. И очень важно что бы не строки, ячейки удалялись, а именно только содержимое в них, так как ломается целостность отчета и формулы в нем.
Если нужно выгружу сам отчет для примера.
Буду очень благодарен, если поможете!
Изменено: artem-fdrv - 31.05.2016 12:15:33
 
Вопросов много, но лучше начать с примера. Возможно можно сразу по разным столбцам раскидать.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
https://drive.google.com/file/d/0B1NkUhCQPSbnZmxfYUtDLVBPZXM/view?usp=sharing    -   Вот пример того, что я хочу. Слева ячеки с которых скопировано содержимое, справа - скопированное содержимое. Теперь с левых ячеек, которые выделены пунктиром нужно удалить содержимое, не удаляя самих ячеек.

https://drive.google.com/open?id=0B1NkUhCQPSbnR01xVFk3V0VPNHM - Это и сам отчет
 
Если не нужно удалять ячейки, то исправьте строку - rSel.Delete shift:=xlUp на
rSel.ClearContents
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Это что-то похожее но все равно я же не могу выбирать куда вставлять выбранные позиции.
А если попробовать по-другому...?

есть вот такой макрос, который позволяет вырезать несвязные диапазоны и вставлять куда нужно. то есть могу вырезать отдельные строки и вставить куда нужно. Это почти то что нужно. Но разница заключается в том, что когда вырезаешь из столбца А  в столбец В то в столбце В ячейки заполняются так как и вырезались из столбца А. То есть если вырезаны через одну строку то и вставляться будут через одну. А если копируешь из столбца А  в столбец В то в столбце В они идут одна под одной, хотя вырезаны были через одну. Пример ---  
https://drive.google.com/file/d/0B1NkUhCQPSbnZmxfYUtDLVBPZXM/view?usp=sharing

Можно ли как-то доработать этот макрос так что бы ячейки(строки) вставлялись как при копировании, одна под одной, то есть, вырезаться могут через одну/две/три, но вставляться одна за другой?
Код
Option Explicit
Public rCopyRange As Range, bCut As Boolean
Sub Copy_Areas()
    Set rCopyRange = Selection: bCut = False
End Sub
Sub Cut_Areas()
    Set rCopyRange = Selection: bCut = True
End Sub
Sub Paste_Areas()
    Dim rArea As Range, li As Long
    Debug.Print rCopyRange.Address
    For Each rArea In rCopyRange
        rArea.Copy Selection.Cells(1).Offset(rArea.Row - rCopyRange.Row, rArea.Column - rCopyRange.Column)
    Next rArea
    If bCut Then rCopyRange.Clear
End Sub
 
Примерно так...
Но тут получается проблемка с тем, что объединённые ячейки внизу (под удаляемыми ячейками) "ломаются"... Не сообразил как расширить диапазон...  :oops:
Можно заменить в коде:
Код
Application.DisplayAlerts = False ' блокируем сообщения excel (про объединённые ячейки)
rSel.Delete shift:=xlUp ' удаляем со сдвигом вверх
Application.DisplayAlerts = True
на:
Код
rSel.ClearContents
тогда перенесённые ячейки будут только очищаться и объединённые ячейки внизу не будут "ломаться"...
Успехов. И мне того же. Благодарю. :)
 
Ренат, спасибо огромное!!! Я немного передал макрос, сделал из двух один и получилось именно то, что я планировал!
Владимир, Вам тоже спасибо за помощь!!!
 
Проще:
Код
Public Sub www()
    On Error Resume Next
    With Selection
        .Copy Application.InputBox("Укажите ячейку куда копировать", Type:=8)
        .Clear
    End With
End Sub

artem-fdrv,  оформляйте код тегами, кнопка <...> на панели редактирования.
Я сам - дурнее всякого примера! ...
 
Возникла еще проблема, подскажите кто знает. Если данные вручную прописывать в строки и потом вырезать и вставлять их то все без проблем работает, а если скопировать из другого места то при вставке в excel выдает ошибку object variable o whith block variable not set. Вот пример кда
Код
Option Explicit
Public rCopyRange As Range, bCut As Boolean
Sub Copy_Areas()
ActiveSheet.Paste
Set rCopyRange = Selection: bCut = False
End Sub
Sub Cut_Areas()
Set rCopyRange = Selection: bCut = True
End Sub
Sub Paste_Areas()
Dim rArea As Range
ActiveSheet.Paste
rCopyRange.Copy
Selection.PasteSpecial Paste:=xlPasteValues
If bCut Then rCopyRange.Clear
End Sub
 
Цитата
если скопировать из другого места
копируете запуском этого макроса? или вручную?
Изменено: Ренат - 31.05.2016 18:06:47
Успехов. И мне того же. Благодарю. :)
 
Вручную,...
 
Т.е. rCopyRange у Вас не задаётся... А вставляете макросом, который "не находит" этот диапазон...? Я правильно понимаю?
Изменено: Ренат - 31.05.2016 18:23:08
Успехов. И мне того же. Благодарю. :)
 
Смотрите, если я вручную в excel начну вводить данные, просто печатать в строки то потом без проблем я могу вырезать и вставлять данные из ячеек. а если я, например, хочу какой-то текст скопировать из браузера или с 1с то когда Ctrl+V в Excel выдает ошибку object variable o whith block variable not set. Нажимаю Debug и подсвечивается строчка
Код
rCopyRange.Copy
 
Правильно выдаёт... Потому что этого диапазона нет... :)
Изменено: Ренат - 31.05.2016 18:33:45
Успехов. И мне того же. Благодарю. :)
 
А как правильно сделать что бы все как есть работало и можно было вставить данные из другого места?
 
Вы на Ctrl+V "повесили" запуск макроса "Paste_Areas"?
Если да, то уберите "эту связь", а макрос запускайте, например, кнопкой... или другой комбинацией... С комбинациями не советую дальше... кнопку лучше "нарисуйте"... или на панель Excel добавьте кнопку...
Успехов. И мне того же. Благодарю. :)
 
Цитата
Ренат написал:
кнопку лучше "нарисуйте"... или на панель Excel добавьте кнопку.

Подскажите как это сделать?
Изменено: artem-fdrv - 31.05.2016 19:01:51
 
Как сделать кнопку, что бы запускала и отключала макрос?
 
Это "уже другая история". Поиск Вам в помощь.
Вот тут, например, есть ответ:
http://www.planetaexcel.ru/techniques/3/59/
Успехов. И мне того же. Благодарю. :)
 
Цитата
artem-fdrv написал:
хочу какой-то текст скопировать из браузера или с 1с то когда Ctrl+V в Excel выдает ошибку object variable o whith block variable not set. Нажимаю Debug и подсвечивается строчка
- т. е. Вы где-то че-то копируете и потом вместо просто нажать Ctrl+V, пишете макрос, тулите его вместо зарезервированного сочетания Ctrl+V(отлично кстати работающего во всей ОС) и бодро пытаете форум "чтозана...?"? О, мудрейший!
Я сам - дурнее всякого примера! ...
 
Здравствуйте!

Подскажите, пожалуйста, как можно вставить скопированные ячейки с другой книги в конкретные ячейки так, чтобы при при вставке данных, вставка данных была только как значения, при этом не нажимаю специальную вставку. Грубо говоря через ctrl C - ctrl V и сразу как значения, так как объем данных приходит в большом потоке и нужно быстро его обработать, в какой-то момент можно упустить специальная вставка значения и все слетает.

Суть проблемы заключается в том, что если случайно один раз вставить не так скопированные данные, в диапазон  С6:С37, то результата расчета  стоимости работ не будет, и в дальнейшем появляются ошибки (код работает некорректно и выводит либо не все, либо не то).

В ячейках С7:С37 есть функция ВПР, это берется из другой вкладки, и при копировании аналогичных символов, в ячейку С7 "Вид работы" ВПР перестает работать, потому что ссылка идет на ВПР из другого файла где аналогичные названия.

Подскажите, пожалуйста, как можно уйти от этой проблемы? Часть информации поместилась по объему символов именно в сам ВПР поэтому там такой ошибки как в ячейке C7 не возникает, а вот длинные названия не помещаются в ВПР из-за этого при копирование идет ссылка на другую книгу, а в текущей ВПР уже не работает.


Пытался как-то сделать через подобный макрос, но ничего не срабатывало:

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim changedCells As Range
    Dim cell As Range
    
    ' Проверяем, была ли изменена ячейка из именованного диапазона "Work"
    If Not Intersect(Target, Range("Work")) Is Nothing Then ' ЗАКРАСКА ЯЧЕЕК ЗЕЛЕНЫМ ЦВЕТОМ
        ApplyColorBasedOnWorkCell
    End If
    
    ' Проверяем, была ли вставка в диапазон C6:C34
    Set changedCells = Intersect(Target, Me.Range("C6:C34"))
    If Not changedCells Is Nothing Then
        Application.EnableEvents = False ' Отключаем события
        
        ' Преобразуем вставленные данные в значения
        changedCells.Value = changedCells.Value
        
        Application.EnableEvents = True ' Включаем события обратно
    End If
    
    ' Устанавливаем диапазон для форматирования (C6:C37)
    Set rng = Me.Range("C6:C37") ' Весь диапазон
    
    ' Проверяем, была ли изменена ячейка в нашем диапазоне
    If Not Intersect(Target, rng) Is Nothing Then
        Application.EnableEvents = False ' Временно отключаем обработку событий для предотвращения рекурсии
      ' Обрабатываем каждую измененную ячейку в пересечении Target и нашего диапазона
        For Each cell In Intersect(Target, rng)
            ' Применяем форматирование в зависимости от адреса ячейки
            Select Case cell.Address
                ' Для ячеек C15 и C16 устанавливаем числовой формат без десятичных
                Case "$C$15", "$C$16":
                    cell.NumberFormat = "0"
                ' Для ячеек C35 и C36 устанавливаем формат даты
                Case "$C$35", "$C$36":
                    cell.NumberFormat = "DD.MM.YYYY"
                ' Для всех остальных ячеек в диапазоне устанавливаем текстовый формат
                Case Else:
                    cell.NumberFormat = "@"
            End Select
        Next cell
        
        Application.EnableEvents = True ' Включаем обработку событий обратно
    End If
    
    ' ДОБАВЛЕННЫЙ КОД ДЛЯ ФОРМАТИРОВАНИЯ ШРИФТА В ДИАПАЗОНЕ C3:C38
    ' Проверяем, была ли изменена ячейка в диапазоне C3:C38
    If Not Intersect(Target, Me.Range("C3:C38")) Is Nothing Then
        Application.EnableEvents = False ' Временно отключаем события
        
        ' Обрабатываем каждую измененную ячейку в диапазоне
        For Each cell In Intersect(Target, Me.Range("C3:C38"))
            ' Устанавливаем шрифт Times New Roman
            cell.Font.Name = "Times New Roman"
            ' Устанавливаем размер шрифта 14
            cell.Font.Size = 14
        Next cell
        
        Application.EnableEvents = True ' Включаем события обратно
    End If
End Sub
:
Страницы: 1
Читают тему
Наверх