Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

При нажатии кнопки скопировать следующую строку

Автор Dmitriy_10, 31.08.2017, 09:33

« назад - далее »

Dmitriy_10

Всем доброе утро! Кто поможет?
Набросал код для копирования строки из 1 таблички в другую.
Необходимо: при нажатии кнопки скопировать строку из одной Excel таблички и перенести ее в другую.
При следующем нажатии скопировать на это же место следующую строку. (Так от 3й по 55 например)
Проблема в том, что если делаю цикл, то он пробегает по строкам и копируют последнее значение.
Как я понимаю, "Next x" или x= x+1 должно быть вне кнопки? Но как это сделать?
Или есть другой способ?

Заранее спасибо!
Sub Klicken()
Dim x, y As Integer

Windows("1.xlsm").Activate
Application.Sheets("DOOR EMS (7)").Activate

For x = 10 To 20 Step 1
Range(Cells(x, 7), Cells(x, 11)).Select
Selection.Copy

Windows("Excel1_EXC_Nahme.xlsm").Activate
Range("C5").Select
ActiveSheet.Paste
Application.CutCopyMode = False

Windows("1.xlsm").Activate
Application.Sheets("DOOR EMS (7)").Activate

Next x
End Sub


Не следует задавать в одной теме разные вопросы.
Дублируете тему на других форумах - самостоятельно указывайте ссылки на дубли
[МОДЕРАТОР]

IKor

Пишите разные вопросы в разных темах...
И подумайте о дополнительном столбце C:
=A1*(A1-B1=1)

Dmitriy_10

Что-то я не совсем понимаю что даст такой столбец...
Но лучше без него.

boa

Не понятен критерий выбора копируемой строки(выделенную или по какому-то номеру)
и критерий выбора места вставки(в конец/в начало/в середину таблицы)
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Dmitriy_10

День добрый!
Из первой таблицы скопировать со 2 по 55 строку (или посл не пустую).
Столбцы от G:K. (От G2:K2 до G55:K55).
Вставить во вторую в С5. (Левый край этой строки)

Каждое нажатие кнопки - новыя строка в ячейку С5 во 2й Excel. (Там другие формулы работают)
Затем на новый лист (но эта о уже не столь важно).

boa

Ну что ж, давайте вернемся к азам
1) вы говорите не о строках, а о диапазонах, т.к. строки не имеют ограничение по столбцам(G:K)
2) вы желаете скопировать не изменяемый диапазон G2:K55 (или посл не пустую) с одной книги и вставить в другую, в диапазон такого же размера с левой верхней границей в С5
3)
Цитата: Dmitriy_10 от 01.09.2017, 17:40Каждое нажатие кнопки - новыя строка в ячейку С5 во 2й Excel.
Какая новая строка, если весь диапазон уже скопирован? или надо перезаписывать одно и тоже по нажатию кнопки?

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

Dmitriy_10

1) Верно, о диапазонах.
2) И это верно.
3) "новая" - следующая из первого документа. Необходимо перезаписывать. Каждый раз новый диапазон в ту же позицию (С5) во втором документе.
Как дошли до G55:K55 переходим на новый лист в первом документе и снова G2:K2 в С5,
G3:K3 в С5 и так до G55:K55.

Как скопировать весь диапазон или последнюю не пустую сроку я разобрался, а вот как копировать следующий диапазон при новом нажатии на кнопку?

boa

Трудно без примера гадать, но попробую предположить
В модуле книге объявляете глобальную переменную, например Dim ActiveRow as integer
и при каждом выполнении макроса присваиваете ей новое значение новой строки, Например ActiveRow = ActiveRow + 1
Тогда ваш диапазон в макросе будет выглядеть как Range("G" & ActiveRow & ":K" & ActiveRow)

А вот переход на новый лист делаете посредством его активации.


Option Explicit

Dim ActiveRow As Integer
Dim sh As Worksheet

Sub test1()
    If sh Is Nothing Then   'Для первого запуска
        Set sh = ThisWorkbook.ActiveSheet
        ActiveRow = 1
    End If
   
    If sh.Name <> ThisWorkbook.ActiveSheet.Name Then  ' для первого запуска на новом листе
        Set sh = ThisWorkbook.ActiveSheet
        ActiveRow = 1
    End If
   
    ActiveRow = ActiveRow + 1
   
    sh.Range("G" & ActiveRow & ":K" & ActiveRow).Copy _
    Workbooks("Excel1_EXC_Nahme.xlsm").ActiveSheet.Range("C5") 
   
    If sh.Range("G2").SpecialCells(xlLastCell).Row = ActiveRow Then _
    MsgBox "Вы достигли последней строки." & vbCrLf & "Пора менять страницу."
End Sub
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Dmitriy_10

Добрый день!

Что-то пока не очень работает..

нужно из Таблицы 1 в Excel1_EXC_Nahme копировать диапазон.

Создал 2 Кнопки:
1я должна копировать и перезаписовать с шагом +1
2я наоборот с шагом -1 (идти назад)

boa

#9
Добрый день,


Option Explicit

Dim ActiveRow As Integer
Dim sh As Worksheet

Sub Auto_Open() 'при открытии книги обнуляем значение ActiveRow
    ThisWorkbook.Names("ActiveRow").Value = 0
End Sub

Sub Click_Up()
    ReadActiveRow
    If ActiveRow > 1 Then
        ActiveRow = ActiveRow - 1
        WriteActiveRow
    Else
        MsgBox "Вы достигли первой строки."
    End If
End Sub

Sub Click_Down()
    ReadActiveRow
    If sh.Cells(sh.Rows.Count, 1).End(xlUp).Row > ActiveRow Then
        ActiveRow = ActiveRow + 1
        WriteActiveRow
    Else
        MsgBox "Вы достигли последней строки."
    End If
End Sub

Sub ReadActiveRow()
    Set sh = Application.Workbooks("1.xlsm").Sheets(1)  'задаем лист с которого читаем данные
    'Предварительно, в Менеджере имен (Ctrl + F3) я создал "ActiveRow"
    ActiveRow = Val(Mid(ThisWorkbook.Names("ActiveRow").Value, 2))
End Sub

Sub WriteActiveRow()
    'следующую строку подправите под свои нужды
    sh.Range("A" & ActiveRow & ":D" & ActiveRow).Copy ThisWorkbook.ActiveSheet.Range("D5")
    ' сохраняем текущее значение ActiveRow
    ThisWorkbook.Names("ActiveRow").Value = ActiveRow
End Sub

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Dmitriy_10

Огромное спасибо!!!
Работает, но ещё не совсем как нужно(
Копирует только первые 2 строки. (Первых два диапазона.., а это только название..)
Что я делаю не так? Может ActiveRow не так создал?
Код у меня лежит в модуле на листе куда я должен скопировать. Я в нем создаю ActiveRow и ссылаюсь на диапазон в другом экселе? Или захожу в тот Эксель и создаю его там? И как часто это делать? 1 раз или каждый раз?

Заранее спасибо!

boa

Я же приложил файлы с работающим кодом
сделайте по аналогии
Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

Dmitriy_10

#12
Уже разобрался! Не успел ответить..
Огромное спасибо!