Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Очистить диапазон и сразу вставить данные - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Очистить диапазон и сразу вставить данные (Макросы/Sub)
Очистить диапазон и сразу вставить данные
lopuxi Дата: Среда, 10.02.2016, 12:20 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 110
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007, 2013
Добрый день.

У меня какая задача. Есть отдельная табличка, которую я копирую, заношу ее в буфер обмена.
Далее я иду в другую книгу, и через кнопку "Вставить" вставляю данную табличку.

Используя для этого вот такой код

[vba]
Код

NumCol = 1
While Cells(1, NumCol).Value <> ""
    NumCol = NumCol + 1
Wend
NumRow = 1
While Cells(NumRow, 1).Value <> ""
    NumRow = NumRow + 1
Wend

'If MsgBox("Очистить лист?", vbOKCancel + vbExclamation, "Очистить?") = vbOK Then: Range(Cells(2, 2), Cells(NumRow, NumCol + 3)).ClearContents
If ActiveSheet.Name = "Affinity" Then '  условие проверяет имя активного листа. Если оно = Affinity
    Range(Cells(1, 1), Cells(NumRow, NumCol)).ClearContents ' чистим лист
    Cells(1, 1).Select ' выделяем первую ячейку
     
    On Error Resume Next
    Selection.PasteSpecial Paste:=xlValues ' вставляем как значение
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Paste:=xlValues
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:=False
    If Err Then MsgBox "Нечего вставлять или Ошибка: " & Err.Number & vbCrLf & Err.Description
End If

[/vba]

И все бы нечего, но при чистке диапазона, стирается все что было в буфере обмена. И вставить ничего не получается.
А диапазон старой таблицы перед вставкой новой, нужно удалить...

Спасибо.


О_о ...и так можно было?
 
Ответить
СообщениеДобрый день.

У меня какая задача. Есть отдельная табличка, которую я копирую, заношу ее в буфер обмена.
Далее я иду в другую книгу, и через кнопку "Вставить" вставляю данную табличку.

Используя для этого вот такой код

[vba]
Код

NumCol = 1
While Cells(1, NumCol).Value <> ""
    NumCol = NumCol + 1
Wend
NumRow = 1
While Cells(NumRow, 1).Value <> ""
    NumRow = NumRow + 1
Wend

'If MsgBox("Очистить лист?", vbOKCancel + vbExclamation, "Очистить?") = vbOK Then: Range(Cells(2, 2), Cells(NumRow, NumCol + 3)).ClearContents
If ActiveSheet.Name = "Affinity" Then '  условие проверяет имя активного листа. Если оно = Affinity
    Range(Cells(1, 1), Cells(NumRow, NumCol)).ClearContents ' чистим лист
    Cells(1, 1).Select ' выделяем первую ячейку
     
    On Error Resume Next
    Selection.PasteSpecial Paste:=xlValues ' вставляем как значение
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Paste:=xlValues
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:=False
    If Err Then MsgBox "Нечего вставлять или Ошибка: " & Err.Number & vbCrLf & Err.Description
End If

[/vba]

И все бы нечего, но при чистке диапазона, стирается все что было в буфере обмена. И вставить ничего не получается.
А диапазон старой таблицы перед вставкой новой, нужно удалить...

Спасибо.

Автор - lopuxi
Дата добавления - 10.02.2016 в 12:20
mower07 Дата: Среда, 10.02.2016, 12:31 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 24
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
А если сначала очистить, а потом вставить?
 
Ответить
СообщениеА если сначала очистить, а потом вставить?

Автор - mower07
Дата добавления - 10.02.2016 в 12:31
lopuxi Дата: Среда, 10.02.2016, 12:37 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 110
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007, 2013
А если сначала очистить, а потом вставить?


если даже на отдельную кнопку сделаю очистить, то из буфера обмена, все равно удаляется информация. Хотелось бы максимально упростить процесс замены таблицы.
Так то код у меня предварительно все чистить.
Вопрос, можно ли не трогать буфер обмена при чистке листа.


О_о ...и так можно было?
 
Ответить
Сообщение
А если сначала очистить, а потом вставить?


если даже на отдельную кнопку сделаю очистить, то из буфера обмена, все равно удаляется информация. Хотелось бы максимально упростить процесс замены таблицы.
Так то код у меня предварительно все чистить.
Вопрос, можно ли не трогать буфер обмена при чистке листа.

Автор - lopuxi
Дата добавления - 10.02.2016 в 12:37
_Boroda_ Дата: Среда, 10.02.2016, 12:45 | Сообщение № 4
Группа: Модераторы
Ранг: Экселист
Сообщений: 9367
Репутация: 3940 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А если вот так попробовать?
Сначала вставляем справа, а потом удаляем столбцы, которые были
[vba]
Код
Sub tt()
    Application.ScreenUpdating = 0
    NumCol = 1
    While Cells(1, NumCol).Value <> ""
        NumCol = NumCol + 1
    Wend
    NumRow = 1
    While Cells(NumRow, 1).Value <> ""
        NumRow = NumRow + 1
    Wend
    
    'If MsgBox("Очистить лист?", vbOKCancel + vbExclamation, "Очистить?") = vbOK Then: Range(Cells(2, 2), Cells(NumRow, NumCol + 3)).ClearContents
    If ActiveSheet.Name = "Affinity" Then '  условие проверяет имя активного листа. Если оно = Affinity
        On Error Resume Next
        Cells(1, NumCol + 1).PasteSpecial Paste:=xlValues ' вставляем как значение
        If Err Then Err.Clear: ActiveSheet.PasteSpecial Paste:=xlValues
        If Err Then Err.Clear: ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:=False
        If Err Then MsgBox "Нечего вставлять или Ошибка: " & Err.Number & vbCrLf & Err.Description
        
        Range("A1").Resize(, NumCol).EntireColumn.Delete ' чистим лист
    End If
End Sub
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА если вот так попробовать?
Сначала вставляем справа, а потом удаляем столбцы, которые были
[vba]
Код
Sub tt()
    Application.ScreenUpdating = 0
    NumCol = 1
    While Cells(1, NumCol).Value <> ""
        NumCol = NumCol + 1
    Wend
    NumRow = 1
    While Cells(NumRow, 1).Value <> ""
        NumRow = NumRow + 1
    Wend
    
    'If MsgBox("Очистить лист?", vbOKCancel + vbExclamation, "Очистить?") = vbOK Then: Range(Cells(2, 2), Cells(NumRow, NumCol + 3)).ClearContents
    If ActiveSheet.Name = "Affinity" Then '  условие проверяет имя активного листа. Если оно = Affinity
        On Error Resume Next
        Cells(1, NumCol + 1).PasteSpecial Paste:=xlValues ' вставляем как значение
        If Err Then Err.Clear: ActiveSheet.PasteSpecial Paste:=xlValues
        If Err Then Err.Clear: ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:=False
        If Err Then MsgBox "Нечего вставлять или Ошибка: " & Err.Number & vbCrLf & Err.Description
        
        Range("A1").Resize(, NumCol).EntireColumn.Delete ' чистим лист
    End If
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 10.02.2016 в 12:45
lopuxi Дата: Среда, 10.02.2016, 12:57 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 110
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007, 2013
Сначала вставляем справа, а потом удаляем столбцы, которые были


Идея хорошая, только у тебя он колонки удаляет, вместе со вставленной таблицей. Ну по крайней мере я у себя вставил твой код и он у меня все почикал)

И мне бы не колонки удалить надо а строки, под диапазоном, после вставки.
Excel вставленный объект выделяет, а значит знает его диапазон и последнюю строку.

Как бы мне получить эту последнюю строку что бы после нее все удалить? Есть идеи?


О_о ...и так можно было?

Сообщение отредактировал lopuxi - Среда, 10.02.2016, 12:59
 
Ответить
Сообщение
Сначала вставляем справа, а потом удаляем столбцы, которые были


Идея хорошая, только у тебя он колонки удаляет, вместе со вставленной таблицей. Ну по крайней мере я у себя вставил твой код и он у меня все почикал)

И мне бы не колонки удалить надо а строки, под диапазоном, после вставки.
Excel вставленный объект выделяет, а значит знает его диапазон и последнюю строку.

Как бы мне получить эту последнюю строку что бы после нее все удалить? Есть идеи?

Автор - lopuxi
Дата добавления - 10.02.2016 в 12:57
_Boroda_ Дата: Среда, 10.02.2016, 13:30 | Сообщение № 6
Группа: Модераторы
Ранг: Экселист
Сообщений: 9367
Репутация: 3940 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
у тебя он колонки удаляет, вместе со вставленной таблицей. Ну по крайней мере я у себя вставил твой код и он у меня все почикал)

А у меня не почикал, а отработал именно так, как было описано в первом посте. Я же не виноват, что Ваше описание расходится с реальными действиями и что файлы Вы не приложили?
И мне бы не колонки удалить надо а строки, под диапазоном, после вставки.

Вы считаете, что проще удалять строки? По-моему, лучше столбцы. Впрочем, дело Ваше, удаляйте строки, если Вам так хочется.
Как бы мне получить эту последнюю строку

В общем случае вот так
[vba]
Код
r_=Selection.Row + Selection.Rows.Count-1
[/vba]
[p.s.]Мы с Вами давно на "ты" перешли? Я, наверное, сильно пьян был - совершенно не помню этого момента.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
у тебя он колонки удаляет, вместе со вставленной таблицей. Ну по крайней мере я у себя вставил твой код и он у меня все почикал)

А у меня не почикал, а отработал именно так, как было описано в первом посте. Я же не виноват, что Ваше описание расходится с реальными действиями и что файлы Вы не приложили?
И мне бы не колонки удалить надо а строки, под диапазоном, после вставки.

Вы считаете, что проще удалять строки? По-моему, лучше столбцы. Впрочем, дело Ваше, удаляйте строки, если Вам так хочется.
Как бы мне получить эту последнюю строку

В общем случае вот так
[vba]
Код
r_=Selection.Row + Selection.Rows.Count-1
[/vba]
[p.s.]Мы с Вами давно на "ты" перешли? Я, наверное, сильно пьян был - совершенно не помню этого момента.

Автор - _Boroda_
Дата добавления - 10.02.2016 в 13:30
lopuxi Дата: Среда, 10.02.2016, 13:55 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 110
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007, 2013
Ваше описание расходится с реальными действиями и что файлы Вы не приложили?


Я сначала не понял вашу логику, что происходит удаление старой таблицы слева, а новая вставляется справа. И почему то он у меня не вставил таблицу справа.

Я не думал что потребуется файл, вроде казалось все легко.
Сейчас прикладываю файл.
В нем есть таблица, она может быть разной длинны.
Ее приходится заменять в книге, которая из данной таблицы черпает нужные себе данные. Всю книгу я прикладывать не стал, она по размеру сюда просто не входит.
По этому приложил конкретный лист, с кодом, таблицей и кнопкой. На соседний лист поместил копию таблицы.

Что делает пользователь, он из отдельной книги, берет эту таблицу Ctrl+C и вставляет. И тут часто возникает проблемы, что диапазон заранее не был почищен и вставляют поверх старой. Ну я и подумал сделать кнопку - чистка/вставка, сразу и то и другое делает.
К сообщению приложен файл: __.xlsm(26Kb)


О_о ...и так можно было?
 
Ответить
Сообщение
Ваше описание расходится с реальными действиями и что файлы Вы не приложили?


Я сначала не понял вашу логику, что происходит удаление старой таблицы слева, а новая вставляется справа. И почему то он у меня не вставил таблицу справа.

Я не думал что потребуется файл, вроде казалось все легко.
Сейчас прикладываю файл.
В нем есть таблица, она может быть разной длинны.
Ее приходится заменять в книге, которая из данной таблицы черпает нужные себе данные. Всю книгу я прикладывать не стал, она по размеру сюда просто не входит.
По этому приложил конкретный лист, с кодом, таблицей и кнопкой. На соседний лист поместил копию таблицы.

Что делает пользователь, он из отдельной книги, берет эту таблицу Ctrl+C и вставляет. И тут часто возникает проблемы, что диапазон заранее не был почищен и вставляют поверх старой. Ну я и подумал сделать кнопку - чистка/вставка, сразу и то и другое делает.

Автор - lopuxi
Дата добавления - 10.02.2016 в 13:55
lopuxi Дата: Среда, 10.02.2016, 14:25 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 110
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007, 2013
_Boroda_,
Спасибо большое. Насамом деле Вы навели меня на хорошую мысль показали как ее можно реализоваться.

Я сделал то что хотел.
Код выполняет то что мне нужно.
[vba]
Код

Option Explicit

Dim NumCol As Long, NumRow As Long, r As Long

Sub Очистить_лист()
'Application.ScreenUpdating = 0
NumCol = 1
While Cells(1, NumCol).Value <> ""
    NumCol = NumCol + 1
Wend
NumRow = 1
While Cells(NumRow, 1).Value <> ""
    NumRow = NumRow + 1
Wend

'If MsgBox("Очистить лист?", vbOKCancel + vbExclamation, "Очистить?") = vbOK Then: Range(Cells(2, 2), Cells(NumRow, NumCol + 3)).ClearContents
If ActiveSheet.Name = "Affinity" Then '  условие проверяет имя активного листа. Если оно = Affinity
    Cells(1, 1).Select ' выделяем первую ячейку
     
    On Error Resume Next
    Selection.PasteSpecial Paste:=xlValues ' вставляем как значение
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Paste:=xlValues
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:=False
    If Err Then MsgBox "Нечего вставлять или Ошибка: " & Err.Number & vbCrLf & Err.Description
     
    r = Selection.Rows.Count - 1
    Range(Cells(r + 2, 1), Cells(NumRow, NumCol)).ClearContents ' чистим лист
End If
End Sub
[/vba]

всем спасибо большое за помощь и участие :)


О_о ...и так можно было?
 
Ответить
Сообщение_Boroda_,
Спасибо большое. Насамом деле Вы навели меня на хорошую мысль показали как ее можно реализоваться.

Я сделал то что хотел.
Код выполняет то что мне нужно.
[vba]
Код

Option Explicit

Dim NumCol As Long, NumRow As Long, r As Long

Sub Очистить_лист()
'Application.ScreenUpdating = 0
NumCol = 1
While Cells(1, NumCol).Value <> ""
    NumCol = NumCol + 1
Wend
NumRow = 1
While Cells(NumRow, 1).Value <> ""
    NumRow = NumRow + 1
Wend

'If MsgBox("Очистить лист?", vbOKCancel + vbExclamation, "Очистить?") = vbOK Then: Range(Cells(2, 2), Cells(NumRow, NumCol + 3)).ClearContents
If ActiveSheet.Name = "Affinity" Then '  условие проверяет имя активного листа. Если оно = Affinity
    Cells(1, 1).Select ' выделяем первую ячейку
     
    On Error Resume Next
    Selection.PasteSpecial Paste:=xlValues ' вставляем как значение
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Paste:=xlValues
    If Err Then Err.Clear: ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:=False
    If Err Then MsgBox "Нечего вставлять или Ошибка: " & Err.Number & vbCrLf & Err.Description
     
    r = Selection.Rows.Count - 1
    Range(Cells(r + 2, 1), Cells(NumRow, NumCol)).ClearContents ' чистим лист
End If
End Sub
[/vba]

всем спасибо большое за помощь и участие :)

Автор - lopuxi
Дата добавления - 10.02.2016 в 14:25
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Очистить диапазон и сразу вставить данные (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!