Страницы: 1
RSS
Как поменять местами значения в разных строках диапазона?, Нужна помощь в макросе, который меняет строки местами
 
Всем привет.

У меня есть скрипт, который берёт, например, 10-ю строку листа и меняет её на 8-ю строку, и 8-ю строку на 10 соответственно.
Меняться должны лишь данные, без вырезания строк, так как на соседнем листе формулы, которые сбиваются при вырезании столбцов.
Скрипт уже готов, но проблема в том, что можно выбрать диапазон лишь через строку, если выбрать две соседние строки (10,9), то скрипт ругается.
Нужно сделать так, чтоб выделялись две соседние строки отдельно, а не в один диапазон, так как потом идёт работа с Areas.

Буду благодарен любой помощи

Код
Sub Макрос5()
Application.ScreenUpdating = False
Set pl = ThisWorkbook.Sheets("Транспорт")
Set zt = ThisWorkbook.Sheets("Транспорт зеркало")
 a = Application.ActiveCell.Row
ThisWorkbook.Sheets("Транспорт зеркало").Activate
Application.Union(Range(Cells(a, 1), Cells(a, 2)), Range(Cells(a - 2, 1), Cells(a - 2, 2))).Select
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
pl.Select
Application.ScreenUpdating = True
End Sub
 
этот макрос не позволяет выбрать 2 соседние строки, он выбирает ячейки в колонках А и В через строку
и к чему тогда этот цирк:
- с тревожными сообщениями?
- с проверкой на количество зон??
- с проверкой на количество элементов в зоне???
к чему этот цирк?
макрос не может выбрать ничего другого, кроме того, что Вы в нем написали
единственное, что он может не по сценарию - это упасть по ошибке, в случае когда активная ячейка выше 3-й строки (где-то в 1-й или 2-й)
Изменено: Ігор Гончаренко - 20.12.2018 18:39:33
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, я понимаю, что он выбирает через строку. Но я не понимаю как работает блок ниже.

Чтоб заменить данные в диапазонах, мне нужно выбрать 1 и 2 диапазон (ЛКМ диапазон1 + CTRL +ЛКМ диапазон2), если я выбираю вручую 9 и 10 строку, и запускаю код
Код
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
то всё работает, так как я выбрал два диапазона, но если я выберу 10 и 9 строку в один диапазон, то выпадает ошибка. помогите понять, как с помощью ВБА выбрать две соседние строки, но в разные диапазоны.
 
Цитата
zhmerin написал:
если я выберу 10 и 9 строку
Как Вы их выбираете?
 
Юрий М, Вообще я должен выбрать (ЛКМ) только десятую строку, а девятая должна сама макросом выбраться вторым диапазоном. У меня получается выбрать отдельныме диапазоны, только если диапазоны разделены хотя бы одной строкой. если диапазоны идут подряд (10 и 9 строка), то макрос его выбирает как один диапазон
Код
 a = Application.ActiveCell.Row
ThisWorkbook.Sheets("Транспорт зеркало").Activate
Application.Union(Range(Cells(a, 1), Cells(a, 2)), Range(Cells(a - 1, 1), Cells(a - 1, 2))).Select
 
Вот так?
Код
Sub qqq()
Dim Rng1 As Range, Rng2 As Range
    Set Rng1 = Selection
    Set Rng2 = Rng1.Offset(-1)
    Debug.Print Rng2.Address
End Sub

 
Юрий М, Нуу, это куда больше сокращает скрипт, но не совсем решает проблему.

[img]file:///C:/Users/azhmaka/Desktop/Untitledttt.png[/img]На снимке вверху - так как сейчас макрос выделяет диапазон (А14:В15)
На снимке ниже - так как мне необходимо, чтоб макрос не выдавал ошибку "Надо выделить ДВА диапазона ячеек одинакового размера" (А14:В14 и А15:В15)
Код
Sub qqq()
Dim Rng1 As Range, Rng2 As Range
Dim ra As Range: Set ra = Selection
    Set Rng1 = Selection
    Set Rng2 = Rng1.Offset(-1)
Application.Union(Range(Rng2.Address), Range(Rng1.Address)).Select
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

 
Цитата
zhmerin написал:
не совсем решает проблему
Цитата
zhmerin написал:
Надо выделить ДВА диапазона ячеек одинакового размера" (А14:В14 и А15:В15)
Выделяем А15:В15, выполняем макрос и получаем второй диапазон А14:В14. Что нет так?
 
Код
Sub ReplaceRanges()
  Dim rg(1 To 2) As Range, ar
  Set rg(1) = Application.InputBox("выберите диапазон 1", Type:=8)
  Set rg(2) = Application.InputBox("выберите диапазон 2", Type:=8)
  If rg(1).Rows.Count <> rg(2).Rows.Count Or _
    rg(1).Columns.Count <> rg(2).Columns.Count Then MsgBox "Это кривые диапазоны": Exit Sub
  ar = rg(1).Value: rg(1).Value = rg(2).Value:  rg(2).Value = ar
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Юрий М, Я сегодня то же самое целый день пытался оъяснить специалистам на работе)

Скрипт всё выделяет правильно, на строку выше, как и в нём описано. Но он выделяет 15 и 14 строки в ОДИН диапазон, а чтоб макрос сработал дальше, нужно чтоб было выделено ДВА отдельных диапазона, т.е. А15:В15 + ctrl + А14:В14 .
Если это делать с помощью клавиатуры и мышки, то выделяем сначала А15:В15 потом зажимаем CTRL и выделяем А14:В14.
Вот именно этот момент, с двумя раздельными диапазонами я не могу решить
 
Ігор Гончаренко, Крепкого здоровья Вам и долгих лет счастливой, богатой жизни. БЕСКОНЕЧНО БЛАГОДАРЕН
Изменено: zhmerin - 20.12.2018 23:34:01
 
А какова цель вообще? Зачем именно выделять?
 
Юрий М, Потому что макрос далее менял значения в первом выделеном диапазоне на значение во втором и наоборот. Менял местами значения. Потому и нужно было два разных диапазона  
 
Цитата
zhmerin написал:
Потому и нужно было два разных диапазона
Я про другое спрашивал: зачем ВЫДЕЛЯТЬ? Вот ещё вариант:
Код
Sub qqq()
Dim Rng1 As Range, Arr()
    Set Rng1 = Selection 'Выделяем сразу две строки
    Arr = Selection.Value
    Rng1(1, 1).Resize(1, UBound(Arr, 2)).Value = WorksheetFunction.Index(Arr, 2, 0)
    Rng1(2, 1).Resize(1, UBound(Arr, 2)).Value = WorksheetFunction.Index(Arr, 1, 0)
End Sub

 
Юрий М, я Вас не так понял изначально. Спасибо большое!
 
А всё потому, что Вы тему не так назвали: нужно было спросить, как поменять местами значения в строках диапазона? ))
 
Юрий М, Верно. Рабочий день подходил к концу, спешил домой, не было времени правильно тему сформулировать)
Страницы: 1
Наверх