Доброе утро дамы и господа. Если ячейка F5 (как в приложенном файле) содержит минус, этот минус нужно перенести в E5. Если F4 содержит минус, то этот минус переносится в E4, даже если там уже есть минус. Искал, но сложно объяснить поисковику перенос минуса.
Доброе утро дамы и господа. Если ячейка F5 (как в приложенном файле) содержит минус, этот минус нужно перенести в E5. Если F4 содержит минус, то этот минус переносится в E4, даже если там уже есть минус. Искал, но сложно объяснить поисковику перенос минуса.Yar4i
Sub minus() Set sh1 = Sheets("минус") Set sh2 = Sheets("итог")
For i = 2 To sh1.Cells(2, 5).End(xlDown).Row If sh1.Cells(i, 6) < 0 Then sh2.Cells(i, 6) = Abs(sh1.Cells(i, 6)) sh2.Cells(i, 5) = -Abs(sh1.Cells(i, 5)) Else sh2.Cells(i, 6) = sh1.Cells(i, 6) sh2.Cells(i, 5) = sh1.Cells(i, 5) End If Next End Sub
[/vba] Игорь, там ещё и столбец E минусить надо
Как-то так: [vba]
Код
Sub minus() Set sh1 = Sheets("минус") Set sh2 = Sheets("итог")
For i = 2 To sh1.Cells(2, 5).End(xlDown).Row If sh1.Cells(i, 6) < 0 Then sh2.Cells(i, 6) = Abs(sh1.Cells(i, 6)) sh2.Cells(i, 5) = -Abs(sh1.Cells(i, 5)) Else sh2.Cells(i, 6) = sh1.Cells(i, 6) sh2.Cells(i, 5) = sh1.Cells(i, 5) End If Next End Sub
[/vba] Игорь, там ещё и столбец E минусить надоbuchlotnik
Спасибо. Немного изменил под свои нужды и не знаю насколько это правильно: [vba]
Код
Sub minus() Set sh1 = Sheets("минус") Set sh2 = Sheets("минус") 'в том же листе For i = 1 To sh1.Cells(1, 5).End(xlDown).Row 'с первой строки If sh1.Cells(i, 6) < 0 Then sh2.Cells(i, 6) = Abs(sh1.Cells(i, 6)) sh2.Cells(i, 5) = -Abs(sh1.Cells(i, 5)) Else sh2.Cells(i, 6) = sh1.Cells(i, 6) sh2.Cells(i, 5) = sh1.Cells(i, 5) End If Next End Sub
[/vba] Сначала не понял почему в первой ячейке не менялось))) думал что нашел редкое число не подвластное макросу. Потом увидел [vba]
Код
For i = 2 To sh1.Cells(2, 5).End(xlDown).Row
[/vba] *** теперь точно разобрался (две двойки надо было изменить)
Спасибо. Немного изменил под свои нужды и не знаю насколько это правильно: [vba]
Код
Sub minus() Set sh1 = Sheets("минус") Set sh2 = Sheets("минус") 'в том же листе For i = 1 To sh1.Cells(1, 5).End(xlDown).Row 'с первой строки If sh1.Cells(i, 6) < 0 Then sh2.Cells(i, 6) = Abs(sh1.Cells(i, 6)) sh2.Cells(i, 5) = -Abs(sh1.Cells(i, 5)) Else sh2.Cells(i, 6) = sh1.Cells(i, 6) sh2.Cells(i, 5) = sh1.Cells(i, 5) End If Next End Sub
[/vba] Сначала не понял почему в первой ячейке не менялось))) думал что нашел редкое число не подвластное макросу. Потом увидел [vba]
Код
For i = 2 To sh1.Cells(2, 5).End(xlDown).Row
[/vba] *** теперь точно разобрался (две двойки надо было изменить)Yar4i
Нуу, в принципе правильно. Почти. Но есть кое-что лишнее.
1. Вот так Cells(1, 5).End(xlDown).Row лучше не делать. Сотрите значения в какой-нибудь строке в середине (например, в Е14:F14) и посмотрите, что получится. Эта запись эквивалентна такой последовательности действий: Встать в ячейку Е5 и нажать Контрл + СтрелкаВниз. Обычно таким образом Вы попадаете в ячейку, которая находится перед ПЕРВОЙ пустой. Но лучше делать немного иначе - встать в последнюю ячейку столбца Е и нажать Контрл + СтрелкаВверх. Тогда Вы попадаете в ячейку, которая находится перед ПОСЛЕДНЕЙ пустой. Если таблица всегда полностью заполнена, то разницы нет, но лучше не рисковать.
2. Если у Вас все действо происходит на одном листе и макрос запускается с этого же листа (в момент запуска макроса этот лист активен), то имена листов вообще не нужны (см. макрос "Минус"), если макрос запускается из произвольного листа этой книги, то см. макрос "Минус1".
3. Поскольку в случае неотрицательного F мы вообще ничего не делаем, то кусок кода Else ... не нужен.
[vba]
Код
Sub minus() For i = 1 To Range("F" & Rows.Count).End(xlUp).Row If Cells(i, 6) < 0 Then Cells(i, 6) = -Cells(i, 6) Cells(i, 5) = -Abs(Cells(i, 5)) End If Next End Sub '===================================== Sub minus1() With Sheets("минус") For i = 1 To .Range("F" & Rows.Count).End(xlUp).Row If .Cells(i, 6) < 0 Then .Cells(i, 6) = -.Cells(i, 6) .Cells(i, 5) = -Abs(.Cells(i, 5)) End If Next End With End Sub
Нуу, в принципе правильно. Почти. Но есть кое-что лишнее.
1. Вот так Cells(1, 5).End(xlDown).Row лучше не делать. Сотрите значения в какой-нибудь строке в середине (например, в Е14:F14) и посмотрите, что получится. Эта запись эквивалентна такой последовательности действий: Встать в ячейку Е5 и нажать Контрл + СтрелкаВниз. Обычно таким образом Вы попадаете в ячейку, которая находится перед ПЕРВОЙ пустой. Но лучше делать немного иначе - встать в последнюю ячейку столбца Е и нажать Контрл + СтрелкаВверх. Тогда Вы попадаете в ячейку, которая находится перед ПОСЛЕДНЕЙ пустой. Если таблица всегда полностью заполнена, то разницы нет, но лучше не рисковать.
2. Если у Вас все действо происходит на одном листе и макрос запускается с этого же листа (в момент запуска макроса этот лист активен), то имена листов вообще не нужны (см. макрос "Минус"), если макрос запускается из произвольного листа этой книги, то см. макрос "Минус1".
3. Поскольку в случае неотрицательного F мы вообще ничего не делаем, то кусок кода Else ... не нужен.
[vba]
Код
Sub minus() For i = 1 To Range("F" & Rows.Count).End(xlUp).Row If Cells(i, 6) < 0 Then Cells(i, 6) = -Cells(i, 6) Cells(i, 5) = -Abs(Cells(i, 5)) End If Next End Sub '===================================== Sub minus1() With Sheets("минус") For i = 1 To .Range("F" & Rows.Count).End(xlUp).Row If .Cells(i, 6) < 0 Then .Cells(i, 6) = -.Cells(i, 6) .Cells(i, 5) = -Abs(.Cells(i, 5)) End If Next End With End Sub