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

Вход

Регистрация

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

 

= Мир MS Excel/Поменять местами данные - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Поменять местами данные
Serge_007 Дата: Пятница, 21.01.2011, 13:43 | Сообщение № 1
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
В Excel нет встроенных средств обоюдного переноса данных (например поменять местами значения А1 и В1 одним кликом). Как это реализовать макросом?

Как это должно работать (один из вариантов): Выделяю с нажатым Ctrl два диапазона - ПКМ - Поменять местами. Теперь содержимое ячейки А1 находится в В1 и наоборот.
Спасибо.



ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеВ Excel нет встроенных средств обоюдного переноса данных (например поменять местами значения А1 и В1 одним кликом). Как это реализовать макросом?

Как это должно работать (один из вариантов): Выделяю с нажатым Ctrl два диапазона - ПКМ - Поменять местами. Теперь содержимое ячейки А1 находится в В1 и наоборот.
Спасибо.


Автор - Serge_007
Дата добавления - 21.01.2011 в 13:43
Hugo Дата: Пятница, 21.01.2011, 14:01 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3563
Репутация: 774 ±
Замечаний: 0% ±

365
Из закромов smile :

==============================================================
Стоит задача с помощью макроса в Excel поменять местами выделенные ячейки (ну или выделенные строки/столбцы), при этом ячейки(или строки/столбцы) не являются смежными, а - произвольно выбранными пользователем.
EducatedFool
VBA Developer
--------------------------------------------------------------------------------

Вот вам макрос:

[vba]
Код
Sub SwapRanges()
Dim ra As Range: Set ra = Selection
msg1 = "Надо выделить ДВА диапазона ячеек одинакового размера"
msg2 = "Надо выделить 2 диапазона ячеек ОДИНАКОВОГО размера"
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
[/vba]

А вот пример файла с макросом: http://excelvba.ru/XL_Files/Sample__11-08-2010__16-45-29.zip
(запуск макроса нажатием Ctrl + Shift + S)
==============================================================

Добавлю от себя - переносятся только значения, формулы затираются, форматирование остаётся старым.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеИз закромов smile :

==============================================================
Стоит задача с помощью макроса в Excel поменять местами выделенные ячейки (ну или выделенные строки/столбцы), при этом ячейки(или строки/столбцы) не являются смежными, а - произвольно выбранными пользователем.
EducatedFool
VBA Developer
--------------------------------------------------------------------------------

Вот вам макрос:

[vba]
Код
Sub SwapRanges()
Dim ra As Range: Set ra = Selection
msg1 = "Надо выделить ДВА диапазона ячеек одинакового размера"
msg2 = "Надо выделить 2 диапазона ячеек ОДИНАКОВОГО размера"
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
[/vba]

А вот пример файла с макросом: http://excelvba.ru/XL_Files/Sample__11-08-2010__16-45-29.zip
(запуск макроса нажатием Ctrl + Shift + S)
==============================================================

Добавлю от себя - переносятся только значения, формулы затираются, форматирование остаётся старым.

Автор - Hugo
Дата добавления - 21.01.2011 в 14:01
Serge_007 Дата: Пятница, 21.01.2011, 14:10 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Игорь, спасибо, это то что нужно.
Только всё-таки просьба повестить код на ПКМ, а не на сочетание клавиш. Плюс работать это должно в любой книге...


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеИгорь, спасибо, это то что нужно.
Только всё-таки просьба повестить код на ПКМ, а не на сочетание клавиш. Плюс работать это должно в любой книге...

Автор - Serge_007
Дата добавления - 21.01.2011 в 14:10
Hugo Дата: Пятница, 21.01.2011, 14:25 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3563
Репутация: 774 ±
Замечаний: 0% ±

365
Цитата (Serge_007)
Плюс работать это должно в любой книге


Это можно, но сложнее.
Тогда весь код нужно поместить в модуль в Personal.xls или в другую книгу из автозагружаемых, плюс сделать исполнение при загрузке кода типа этого:
[vba]
Код
Sub Inic()
With Application.CommandBars("Cell").Controls.Add(Type:=msoControlButton, before:=1)
            .Caption = "SwapRanges"
            .OnAction = "SwapRanges"
            .FaceId = 203
End With
End Sub
[/vba]

Т.е. при загрузке и выгрузки такие коды (обеспечение менюшки):
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
           Application.CommandBars("Cell").Controls.Item("SwapRanges").Delete
End Sub

Private Sub Workbook_Open()
On Error Resume Next
           Application.CommandBars("Cell").Controls.Item("SwapRanges").Delete
           On Error GoTo 0
Inic
End Sub
[/vba]

Можно вероятно эти коды совместить, но у меня так работает, правда задачу другую в итоге выполняет.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение
Цитата (Serge_007)
Плюс работать это должно в любой книге


Это можно, но сложнее.
Тогда весь код нужно поместить в модуль в Personal.xls или в другую книгу из автозагружаемых, плюс сделать исполнение при загрузке кода типа этого:
[vba]
Код
Sub Inic()
With Application.CommandBars("Cell").Controls.Add(Type:=msoControlButton, before:=1)
            .Caption = "SwapRanges"
            .OnAction = "SwapRanges"
            .FaceId = 203
End With
End Sub
[/vba]

Т.е. при загрузке и выгрузки такие коды (обеспечение менюшки):
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
           Application.CommandBars("Cell").Controls.Item("SwapRanges").Delete
End Sub

Private Sub Workbook_Open()
On Error Resume Next
           Application.CommandBars("Cell").Controls.Item("SwapRanges").Delete
           On Error GoTo 0
Inic
End Sub
[/vba]

Можно вероятно эти коды совместить, но у меня так работает, правда задачу другую в итоге выполняет.

Автор - Hugo
Дата добавления - 21.01.2011 в 14:25
Alex_ST Дата: Пятница, 21.01.2011, 21:50 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3211
Репутация: 609 ±
Замечаний: 0% ±

2003
Я на Планете уже выкладывал такое решение:
[vba]
Код
Sub Selection_eXchange()
'---------------------------------------------------------------------------------------
' Procedure    : Selection_eXchange
' Author       : Alex_ST
' Topic_HEADER : Поменять указанные столбцы местами с помощью макроса
' Topic_URL    : http://www.planetaexcel.ru/forum.php?thread_id=15210
' Post_Author  : Alex_ST
' Post_URL     : http://www.planetaexcel.ru/forum.php?thread_id=15210
' DateTime     : 13.04.10, 16:33
' Purpose      : обменять ТЕКСТ двух выделенных диапазонов или областей
' Notes        :
'---------------------------------------------------------------------------------------
      If Not TypeName(Selection) = "Range" Then Exit Sub
      Dim tmpVar1, tmpVar2
      Dim tmpRng1 As Range, tmpRng2 As Range
      With Selection
          'With Intersect(Selection, Selection.Parent.UsedRange)
          Select Case .Areas.Count
          Case 1   ' выделена 1 область
              If .Count = 2 Then   ' выделено 2 ячейки
                  Set tmpRng1 = .Cells(1): Set tmpRng2 = .Cells(2)
              ElseIf .Rows.Count = 2 And .Columns.Count > 2 Then  ' выделен горизонтальный диапазон в 2 строки
                  Set tmpRng1 = Range(Cells(.Row, .Column), Cells(.Row, .Column + .Columns.Count - 1))   ' 1-я строка диапазона
                  Set tmpRng2 = tmpRng1.Offset(1, 0)   ' 2-я строка ниже на 1
              ElseIf .Columns.Count = 2 And .Rows.Count > 2 Then    ' выделен вертикальный диапазон в 2 столбца
                  Set tmpRng1 = Range(Cells(.Row, .Column), Cells(.Row + .Rows.Count - 1, .Column))  ' 1-й столбец
                  Set tmpRng2 = tmpRng1.Offset(0, 1)   ' 2-й столбец правее на 1
              Else: Exit Sub
              End If
          Case 2   ' выделено 2 области
              If .Areas(1).Columns.Count = .Areas(2).Columns.Count And _
                 .Areas(1).Rows.Count = .Areas(2).Rows.Count Then   ' одинаковая размерность областей
                  Set tmpRng1 = .Areas(1): Set tmpRng2 = .Areas(2)
              End If
          Case Else: Exit Sub
          End Select
      End With
      Application.ScreenUpdating = False: Application.EnableEvents = False
      tmpVar1 = tmpRng1: tmpVar2 = tmpRng2
      tmpRng1.Value = tmpVar2: tmpRng2.Value = tmpVar1
      Application.EnableEvents = True: Application.ScreenUpdating = True
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеЯ на Планете уже выкладывал такое решение:
[vba]
Код
Sub Selection_eXchange()
'---------------------------------------------------------------------------------------
' Procedure    : Selection_eXchange
' Author       : Alex_ST
' Topic_HEADER : Поменять указанные столбцы местами с помощью макроса
' Topic_URL    : http://www.planetaexcel.ru/forum.php?thread_id=15210
' Post_Author  : Alex_ST
' Post_URL     : http://www.planetaexcel.ru/forum.php?thread_id=15210
' DateTime     : 13.04.10, 16:33
' Purpose      : обменять ТЕКСТ двух выделенных диапазонов или областей
' Notes        :
'---------------------------------------------------------------------------------------
      If Not TypeName(Selection) = "Range" Then Exit Sub
      Dim tmpVar1, tmpVar2
      Dim tmpRng1 As Range, tmpRng2 As Range
      With Selection
          'With Intersect(Selection, Selection.Parent.UsedRange)
          Select Case .Areas.Count
          Case 1   ' выделена 1 область
              If .Count = 2 Then   ' выделено 2 ячейки
                  Set tmpRng1 = .Cells(1): Set tmpRng2 = .Cells(2)
              ElseIf .Rows.Count = 2 And .Columns.Count > 2 Then  ' выделен горизонтальный диапазон в 2 строки
                  Set tmpRng1 = Range(Cells(.Row, .Column), Cells(.Row, .Column + .Columns.Count - 1))   ' 1-я строка диапазона
                  Set tmpRng2 = tmpRng1.Offset(1, 0)   ' 2-я строка ниже на 1
              ElseIf .Columns.Count = 2 And .Rows.Count > 2 Then    ' выделен вертикальный диапазон в 2 столбца
                  Set tmpRng1 = Range(Cells(.Row, .Column), Cells(.Row + .Rows.Count - 1, .Column))  ' 1-й столбец
                  Set tmpRng2 = tmpRng1.Offset(0, 1)   ' 2-й столбец правее на 1
              Else: Exit Sub
              End If
          Case 2   ' выделено 2 области
              If .Areas(1).Columns.Count = .Areas(2).Columns.Count And _
                 .Areas(1).Rows.Count = .Areas(2).Rows.Count Then   ' одинаковая размерность областей
                  Set tmpRng1 = .Areas(1): Set tmpRng2 = .Areas(2)
              End If
          Case Else: Exit Sub
          End Select
      End With
      Application.ScreenUpdating = False: Application.EnableEvents = False
      tmpVar1 = tmpRng1: tmpVar2 = tmpRng2
      tmpRng1.Value = tmpVar2: tmpRng2.Value = tmpVar1
      Application.EnableEvents = True: Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 21.01.2011 в 21:50
Serge_007 Дата: Пятница, 21.01.2011, 22:21 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Alex_ST)
а Планете уже выкладывал такое решение

Не видел, спасибо.


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Alex_ST)
а Планете уже выкладывал такое решение

Не видел, спасибо.

Автор - Serge_007
Дата добавления - 21.01.2011 в 22:21
slavaleks Дата: Среда, 20.03.2013, 19:40 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

2010
Цитата (Hugo)


Из закромов smile :

==============================================================
Стоит задача с помощью макроса в Exel поменять местами выделенные ячейки (ну или выделенные строки/столбцы), при этом ячейки(или строки/столбцы) не являются смежными, а - произвольно выбранными пользователем.
EducatedFool
VBA Developer
--------------------------------------------------------------------------------

Вот вам макрос:

Код:

Sub SwapRanges()
Dim ra As Range: Set ra = Selection
msg1 = "Надо выделить ДВА диапазона ячеек одинакового размера"
msg2 = "Надо выделить 2 диапазона ячеек ОДИНАКОВОГО размера"
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

А вот пример файла с макросом: http://excelvba.ru/XL_Files/Sample__11-08-2010__16-45-29.zip
(запуск макроса нажатием Ctrl + Shift + S)
==============================================================

Добавлю от себя - переносятся только значения, формулы затираются, форматирование остаётся старым.

Hugo,
======================================================================

Спасибо за очень нужный макрос - это то что я искал!
Одна ,блин, незадачка - при смене раскладки клавиатуры постоянно выскакивает окно:

"Microsoft Visual Basic
Run-time error '1004':
Method 'OnKey' of object '.Application' failed"

Подскажите, пожалуйста, как от него избавится?
 
Ответить
Сообщение
Цитата (Hugo)


Из закромов smile :

==============================================================
Стоит задача с помощью макроса в Exel поменять местами выделенные ячейки (ну или выделенные строки/столбцы), при этом ячейки(или строки/столбцы) не являются смежными, а - произвольно выбранными пользователем.
EducatedFool
VBA Developer
--------------------------------------------------------------------------------

Вот вам макрос:

Код:

Sub SwapRanges()
Dim ra As Range: Set ra = Selection
msg1 = "Надо выделить ДВА диапазона ячеек одинакового размера"
msg2 = "Надо выделить 2 диапазона ячеек ОДИНАКОВОГО размера"
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

А вот пример файла с макросом: http://excelvba.ru/XL_Files/Sample__11-08-2010__16-45-29.zip
(запуск макроса нажатием Ctrl + Shift + S)
==============================================================

Добавлю от себя - переносятся только значения, формулы затираются, форматирование остаётся старым.

Hugo,
======================================================================

Спасибо за очень нужный макрос - это то что я искал!
Одна ,блин, незадачка - при смене раскладки клавиатуры постоянно выскакивает окно:

"Microsoft Visual Basic
Run-time error '1004':
Method 'OnKey' of object '.Application' failed"

Подскажите, пожалуйста, как от него избавится?

Автор - slavaleks
Дата добавления - 20.03.2013 в 19:40
KuklP Дата: Среда, 20.03.2013, 20:29 | Сообщение № 8
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
А в каком коде из этой темы Вы видели Method 'OnKey'?


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеА в каком коде из этой темы Вы видели Method 'OnKey'?

Автор - KuklP
Дата добавления - 20.03.2013 в 20:29
Alex_ST Дата: Среда, 20.03.2013, 23:14 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3211
Репутация: 609 ±
Замечаний: 0% ±

2003
slavaleks, в этом посте съехал текст кода.
Вы подправили у себя? Если нет, подождите пока Игорь не исправит. Я ему в личку просьбу об этом кинул.

Отображение кода Hugo починил.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 21.03.2013, 08:42
 
Ответить
Сообщениеslavaleks, в этом посте съехал текст кода.
Вы подправили у себя? Если нет, подождите пока Игорь не исправит. Я ему в личку просьбу об этом кинул.

Отображение кода Hugo починил.

Автор - Alex_ST
Дата добавления - 20.03.2013 в 23:14
Alex_ST Дата: Среда, 20.03.2013, 23:24 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3211
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, пока делать было нечего я сам поправил и чуть сократил то, что исказилось в посте Hugo.
В модуле ЭтаКнига должно быть прописано так[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
       On Error Resume Next
       Application.CommandBars("Cell").Controls.Item("SwapRanges").Delete
End Sub

Private Sub Workbook_Open()
       On Error Resume Next
       With Application.CommandBars("Cell").Controls
           .Item("SwapRanges").Delete
           With .Add(Type:=msoControlButton, before:=1)
               .Caption = "SwapRanges"
               .OnAction = "SwapRanges"
               .FaceId = 203
           End With
       End With
       On Error GoTo 0
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 21.03.2013, 08:59
 
Ответить
СообщениеНу, пока делать было нечего я сам поправил и чуть сократил то, что исказилось в посте Hugo.
В модуле ЭтаКнига должно быть прописано так[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
       On Error Resume Next
       Application.CommandBars("Cell").Controls.Item("SwapRanges").Delete
End Sub

Private Sub Workbook_Open()
       On Error Resume Next
       With Application.CommandBars("Cell").Controls
           .Item("SwapRanges").Delete
           With .Add(Type:=msoControlButton, before:=1)
               .Caption = "SwapRanges"
               .OnAction = "SwapRanges"
               .FaceId = 203
           End With
       End With
       On Error GoTo 0
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 20.03.2013 в 23:24
Wasilich Дата: Четверг, 21.03.2013, 11:49 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
У меня тож примерчик завалялся. Мож пригодится.
К сообщению приложен файл: __..xls (28.0 Kb)
 
Ответить
СообщениеУ меня тож примерчик завалялся. Мож пригодится.

Автор - Wasilich
Дата добавления - 21.03.2013 в 11:49
slavaleks Дата: Четверг, 21.03.2013, 13:33 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

2010
Alex_ST, Всё работает супер, за что, премного благодарен!
Вот ещё дилетантский вопрос остался. Это нормально, что при выполнении любого макроса у меня не работает "Шаг назад" Ctrl+Z?
 
Ответить
СообщениеAlex_ST, Всё работает супер, за что, премного благодарен!
Вот ещё дилетантский вопрос остался. Это нормально, что при выполнении любого макроса у меня не работает "Шаг назад" Ctrl+Z?

Автор - slavaleks
Дата добавления - 21.03.2013 в 13:33
Serge_007 Дата: Четверг, 21.03.2013, 13:38 | Сообщение № 13
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеНормально

Автор - Serge_007
Дата добавления - 21.03.2013 в 13:38
mixanic Дата: Понедельник, 18.07.2016, 15:25 | Сообщение № 14
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добавлю от себя - переносятся только значения, формулы затираются, форматирование остаётся старым.

Подскажите, как сделать чтобы формулы тоже переносились !?
 
Ответить
Сообщение
Добавлю от себя - переносятся только значения, формулы затираются, форматирование остаётся старым.

Подскажите, как сделать чтобы формулы тоже переносились !?

Автор - mixanic
Дата добавления - 18.07.2016 в 15:25
  • Страница 1 из 1
  • 1
Поиск:

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