Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Экспорта данных с одного листа на другой в одной книге, упростить код
 
Доброго времени суток, дорогие профи и гуру!

Обращаюсь к вам за помощью в упрощении макроса, писанного долго и нудно, зато своими руками, с использованием подсказок здесь и чуть-чуть просто в интернете.
Вижу, что макрос вышел "тяжёлый", вижу, что можно его сделать красивым, вижу, что это цикл. НО! Заплутала в синтаксисе... Нид хелп...

Собственно, сам текст макроса, нуждающийся в наведении лоска. Там имена ячеек последовательны, а столбцы - через один. Вот в этой части прошу помочь. Как всё это поименовать так, чтобы было коротко и красиво?
Скрытый текст


Знаю, что всё подробно объясняется в куче литературы "для чайников", но совершенно не имею времени на её изучение...
Изменено: macovea - 27 Ноя 2017 15:09:45
 
Сильно не вникал, 2 напрашивающихся цикла:
Код
Sub DataEntryForm() 
Dim Row As Long, intI as integer
Row = formaM.Cells(2, 4) + 2 
For intI=1 to 13
formaM.Range("Rate" & intI).Copy 
MonitoringM.Cells(Row, 10+intI*2).PasteSpecial Paste:=xlPasteValues 
formaM.Range("Effic" & intI).Copy 
MonitoringM.Cells(Row, 11 + intI*2).PasteSpecial Paste:=xlPasteValues 
Next intI
formaM.Range("I9:J14").Copy Destination:=formaM.Range("B9") 
formaM.Range("I16:J17").Copy Destination:=formaM.Range("B16") 
formaM.Range("I19:J20").Copy Destination:=formaM.Range("B19") 
formaM.Range("I22:J23").Copy Destination:=formaM.Range("B22") 
formaM.Range("I25:J25").Copy Destination:=formaM.Range("B25") 
End Sub
Кому решение нужно - тот пример и рисует.
 
Пытливый, спасибо, попробую!)
 
У меня вопрос, почему  в коде
Код
Row = formaM.Cells(2, 4) + 2
Переменная берется с листа formaM
А используется в листе MonitoringM
Код
MonitoringM.Cells(Row, 14).PasteSpecial Paste:=xlPasteValues
Где связь?
"Все гениальное просто, а все простое гениально!!!"
 
Может так нужно?
Код
Sub DataEntryForm()
Dim i&, j&, lRow&
ReDim arr(25)
With formaM
    For i = 0 To 25 Step 2
        j = j + 1
        arr(i) = .Range("rate" & j)
        arr(i + 1) = .Range("Effic" & j)
    Next i
    lRow = .Cells(2, 4) + 2
    MonitoringM.Range("l" & lRow).Resize(, 26) = arr
    .Range("I9:J14").Copy .Range("B9")
    .Range("I16:J17").Copy .Range("B16")
    .Range("I19:J20").Copy .Range("B19")
    .Range("I22:J23").Copy .Range("B22")
    .Range("I25:J25").Copy .Range("B25")
End With
End Sub
Изменено: Nordheim - 28 Ноя 2017 15:46:11
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Пытливый написал:
Сильно не вникал, 2 напрашивающихся цикла:
Да, это именно то, что я хотела!) Знала, что всё просто, но синтаксис... моё слабое место, однозначно.  :*

Цитата
Nordheim написал:
Где связь?
Связь в том, что в ячейке листа formaM пишется номер строки листа MonitoringM, куда данные листа нужно поместить. Есть идеи, как организовать это иначе?

Код
ReDim arr(25)
With formaM
    For i = 0 To 25 Step 2
        j = j + 1
        arr(i) = .Range("rate" & j)
        arr(i + 1) = .Range("Effic" & j)
    Next i

А вот это - массив? Не очень поняла...

Код
lRow = MonitoringM.Range("l" & Rows.Count).End(xlUp).Row + 1

И в какую строку оно будет писаться? В новую? Так не надо. Надо как раз в имеющуюся) Именно для этого и есть на листе с формой ячейка, где лежит номер нужной строки)
 
Цитата
macovea написал:
А вот это - массив? Не очень поняла...
Это не массив.
Я честно не увидел №нужной строки. увидел поиск строки на листе видимом.
Я просто никогда так не делаю, т.е не определяю в одном листе строку. что бы ее заполнить в другом.
Нужно затереть последнюю строку пожалуйста:
Код
lRow = MonitoringM.Range("l" & Rows.Count).End(xlUp).Row
"Все гениальное просто, а все простое гениально!!!"
 
№ строки можно указать через
Код
InputBox
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Это не массив.
А что это? Я вижу ряд значений, набираемых из формы, друг за другом, которые после вставляются в другой лист. Неправильно вижу?
Цитата
Nordheim написал:
Я честно не увидел №нужной строки. увидел поиск строки на листе видимом.
Если смотрели приложенный файл - то он спрятан под кнопкой. Ибо для рядовых пользователей это информация совершенно излишняя. Это для меня и ещё пары девочек, более-менее разбирающихся в Экселе))
Цитата
Nordheim написал:
№ строки можно указать через
Если у меня воспитатели будут ещё номера строк руками вводить - они просто отдадут это всё мне))) И буду я вручную сличать фамилии в поисках нужной))
Впрочем, это уже лирика. Важен первый вопрос, на остальное можно не отвечать. Хочу разобраться)
 
Цитата
macovea написал:
А что это? Я вижу ряд значений, набираемых из формы, друг за другом, которые после вставляются в другой лист. Неправильно вижу?
Читал снизу вверх, поэтому не подумал что предложение относится к верхнему коду.
Изменено: Nordheim - 28 Ноя 2017 14:05:07
"Все гениальное просто, а все простое гениально!!!"
 
Смысл про строку понял.  :D  код в сообщении № 5 поправил!
Изменено: Nordheim - 28 Ноя 2017 14:07:37
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
предложение относится к верхнему коду.
То есть это таки массив?)

Цитата
Nordheim написал:
Смысл про строку понял.   :D   код в сообщении № 5 поправил!
Спасибо!  :*  Буду пробовать...
 
Цитата
macovea написал:
То есть это таки массив?)
Он самый.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
MonitoringM.Range("l" & lRow).Resize(, 26) = arr
Выдаёт ошибку "Method 'Range' of object '_Worksheet' failed"
 
Замените Row на lRow
Код
Row = .Cells(2, 4) + 2
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Замените Row на lRow
И правда, не заметила)) Спасибо! Теперь и этот вариант работает!)

Модераторам: прошу закрыть тему, вопрос решён!)
Страницы: 1
Читают тему (гостей: 1)
Наверх