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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос переноса данных при сравнении двух ячеек - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос переноса данных при сравнении двух ячеек (Макросы/Sub)
Макрос переноса данных при сравнении двух ячеек
ArkaIIIa Дата: Вторник, 03.06.2014, 16:03 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Добрый день!

Помогите, пожалуйста, в написании макроса.

Есть файл, обновляющийся раз в полчаса. В ячейке B2 фиксируется время последнего обновления в формате "16:00:00", "16:30:00" и т.д.
В ячейках B3:B100 каждые полчаса обновляются данные.
Нужно, чтобы макрос проверял время указанное в B2, находил соответствующее значение в строке 2 и вставлял данные из B3:B100 в x3:x100, где x - столбец с аналогичным временем.

Заранее спасибо!
К сообщению приложен файл: 2440637.xlsm (9.2 Kb)
 
Ответить
СообщениеДобрый день!

Помогите, пожалуйста, в написании макроса.

Есть файл, обновляющийся раз в полчаса. В ячейке B2 фиксируется время последнего обновления в формате "16:00:00", "16:30:00" и т.д.
В ячейках B3:B100 каждые полчаса обновляются данные.
Нужно, чтобы макрос проверял время указанное в B2, находил соответствующее значение в строке 2 и вставлял данные из B3:B100 в x3:x100, где x - столбец с аналогичным временем.

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

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 16:03
Hugo Дата: Вторник, 03.06.2014, 16:32 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Вопрос - что изменяется последним - B1 или данные в столбце?
Ну а код (не сложный) должен срабатывать по изменению последней обновляющейся ячейки.
[vba]
Код
Sub newtime()
     Dim r As Range
     Set r = Rows(2).Find([b1].Text, , xlValues, xlWhole)
     If Not r Is Nothing Then [b3:b7].Copy r.Offset(1)
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеВопрос - что изменяется последним - B1 или данные в столбце?
Ну а код (не сложный) должен срабатывать по изменению последней обновляющейся ячейки.
[vba]
Код
Sub newtime()
     Dim r As Range
     Set r = Rows(2).Find([b1].Text, , xlValues, xlWhole)
     If Not r Is Nothing Then [b3:b7].Copy r.Offset(1)
End Sub
[/vba]

Автор - Hugo
Дата добавления - 03.06.2014 в 16:32
ArkaIIIa Дата: Вторник, 03.06.2014, 16:40 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Они одновременно обновляются.
Спасибо! Сейчас попробую прикрутить к своему файлу.
 
Ответить
СообщениеHugo
Они одновременно обновляются.
Спасибо! Сейчас попробую прикрутить к своему файлу.

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 16:40
ArkaIIIa Дата: Вторник, 03.06.2014, 16:42 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Все работает, спасибо огромное!
 
Ответить
СообщениеHugo
Все работает, спасибо огромное!

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 16:42
Hugo Дата: Вторник, 03.06.2014, 16:43 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Одновременно? Кодом выгружается массив данных?


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеОдновременно? Кодом выгружается массив данных?

Автор - Hugo
Дата добавления - 03.06.2014 в 16:43
Rioran Дата: Вторник, 03.06.2014, 16:53 | Сообщение № 6
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
ArkaIIIa, здравствуйте.

Вижу, меня немного опередили, пока писал =) Моё решение чисто для сравнения как делают профи ( Hugo) и новички вроде меня =)

[vba]
Код
Sub Data_to_time()

Application.ScreenUpdating = False
With ThisWorkbook.Worksheets("Data")

Dim LastRow As Long 'для определения высоты столбцов
Dim LastRow2 As Long 'для определения высоты столбцов
Dim Runner As Integer 'счётчик для поиска соответствия по времени
Dim Test As Integer 'Чтобы Runner'у знать, когда остановиться
Dim X As Long 'для переноса отдельных ячеек

Runner = 2
Test = 0

Do While .Cells(2, Runner + 1) <> 0
     Runner = Runner + 1
     If .Cells(2, Runner).Value = .Cells(1, 2).Value Then
         Test = 1
         Exit Do
     End If
Loop

If Test = 1 Then
     LastRow = .Cells(Rows.Count, 2).End(xlUp).Row
     LastRow2 = .Cells(Rows.Count, Runner).End(xlUp).Row
     For X = 3 To LastRow
         .Cells(LastRow2 + X - 2, Runner).Value = .Cells(X, 2).Value
     Next X
Else
     MsgBox "Проверьте введённое время!", , "Ошибка!"
End If

End With
Application.ScreenUpdating = True

End Sub
[/vba]

При этом у Hugo макрос легко работает с временем, введённым вручную. Мой же работает только если скопировать время из названия столбца. Интересно, почему.
К сообщению приложен файл: time_n_data.xlsm (18.9 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеArkaIIIa, здравствуйте.

Вижу, меня немного опередили, пока писал =) Моё решение чисто для сравнения как делают профи ( Hugo) и новички вроде меня =)

[vba]
Код
Sub Data_to_time()

Application.ScreenUpdating = False
With ThisWorkbook.Worksheets("Data")

Dim LastRow As Long 'для определения высоты столбцов
Dim LastRow2 As Long 'для определения высоты столбцов
Dim Runner As Integer 'счётчик для поиска соответствия по времени
Dim Test As Integer 'Чтобы Runner'у знать, когда остановиться
Dim X As Long 'для переноса отдельных ячеек

Runner = 2
Test = 0

Do While .Cells(2, Runner + 1) <> 0
     Runner = Runner + 1
     If .Cells(2, Runner).Value = .Cells(1, 2).Value Then
         Test = 1
         Exit Do
     End If
Loop

If Test = 1 Then
     LastRow = .Cells(Rows.Count, 2).End(xlUp).Row
     LastRow2 = .Cells(Rows.Count, Runner).End(xlUp).Row
     For X = 3 To LastRow
         .Cells(LastRow2 + X - 2, Runner).Value = .Cells(X, 2).Value
     Next X
Else
     MsgBox "Проверьте введённое время!", , "Ошибка!"
End If

End With
Application.ScreenUpdating = True

End Sub
[/vba]

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

Автор - Rioran
Дата добавления - 03.06.2014 в 16:53
ArkaIIIa Дата: Вторник, 03.06.2014, 16:59 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Массив данных выгружается при помощи связей. Обновление происходит при помощи макроса. В этом же макросе, следующей строкой, идет определение времени обновления файла-исходника - оттуда и тянется время.
Столкнулся с проблемой. Если значения в столбце B (которые копируются) вбиты вручную - то всё ок, а если это ссылки - то переносятся нули.
 
Ответить
СообщениеHugo
Массив данных выгружается при помощи связей. Обновление происходит при помощи макроса. В этом же макросе, следующей строкой, идет определение времени обновления файла-исходника - оттуда и тянется время.
Столкнулся с проблемой. Если значения в столбце B (которые копируются) вбиты вручную - то всё ок, а если это ссылки - то переносятся нули.

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 16:59
Rioran Дата: Вторник, 03.06.2014, 17:05 | Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
ArkaIIIa, попробуйте мой макрос, возможно с ссылками у него лучше дело обстоит.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеArkaIIIa, попробуйте мой макрос, возможно с ссылками у него лучше дело обстоит.

Автор - Rioran
Дата добавления - 03.06.2014 в 17:05
ArkaIIIa Дата: Вторник, 03.06.2014, 17:11 | Сообщение № 9
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Rioran
Ваш макрос почему-то чувствителен к выбору времени из списка, а у меня время подтягивается формулой.
И в Вашем маркросе, если дважды его использовать не меняя времени, то он дважды вставит значения (одни под другими).
 
Ответить
СообщениеRioran
Ваш макрос почему-то чувствителен к выбору времени из списка, а у меня время подтягивается формулой.
И в Вашем маркросе, если дважды его использовать не меняя времени, то он дважды вставит значения (одни под другими).

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 17:11
Hugo Дата: Вторник, 03.06.2014, 17:15 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Ну я не стал заморачиваться с определением диапазона копирования - что копировать на практике скорее всего будет неизменным диапазоном (можно сразу забить в код), куда копировать - нужно знать одну ячейку.
Если столбцов много - то перебирать все (ну в худшем случае, поздно вечером) намного дольше, чем найти одну ячейку.
Но если как тут всего 48 значений - то и без разницы, можно и перебирать, тем более что поиск времени кодом дело привередливое...
А чтоб сравнивать вручную - можно так:
[vba]
Код
    If CStr(.Cells(2, Runner).Value) = CStr(.Cells(1, 2).Value) Then
[/vba]
Вообще это хитрый момент, можно попасться... И Вы попались! :) С виду значения всюду одинаковы - но не равны!


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеНу я не стал заморачиваться с определением диапазона копирования - что копировать на практике скорее всего будет неизменным диапазоном (можно сразу забить в код), куда копировать - нужно знать одну ячейку.
Если столбцов много - то перебирать все (ну в худшем случае, поздно вечером) намного дольше, чем найти одну ячейку.
Но если как тут всего 48 значений - то и без разницы, можно и перебирать, тем более что поиск времени кодом дело привередливое...
А чтоб сравнивать вручную - можно так:
[vba]
Код
    If CStr(.Cells(2, Runner).Value) = CStr(.Cells(1, 2).Value) Then
[/vba]
Вообще это хитрый момент, можно попасться... И Вы попались! :) С виду значения всюду одинаковы - но не равны!

Автор - Hugo
Дата добавления - 03.06.2014 в 17:15
Hugo Дата: Вторник, 03.06.2014, 17:18 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
если это ссылки - то переносятся нули

Попробуйте доработать - запишите рекордером спецвставку только значений (любых, или этих же), используйте записанный код.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
Сообщение
если это ссылки - то переносятся нули

Попробуйте доработать - запишите рекордером спецвставку только значений (любых, или этих же), используйте записанный код.

Автор - Hugo
Дата добавления - 03.06.2014 в 17:18
ArkaIIIa Дата: Вторник, 03.06.2014, 17:22 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
К сожалению, я мало что понял из вышенаписанного...)))
Немного изменил условия (пример во вложении).
Вцелом предыдущий Ваш макрос - работает отлично. Но как сделать чтобы он подставлял значения, который отображаются в ячейках с формулами? (в примере это столбец С).
Т.е. условия все те же, но теперь он должен подтягивать инфу из ячеек столбца С.
К сообщению приложен файл: 1680970.xlsm (9.6 Kb)
 
Ответить
СообщениеHugo
К сожалению, я мало что понял из вышенаписанного...)))
Немного изменил условия (пример во вложении).
Вцелом предыдущий Ваш макрос - работает отлично. Но как сделать чтобы он подставлял значения, который отображаются в ячейках с формулами? (в примере это столбец С).
Т.е. условия все те же, но теперь он должен подтягивать инфу из ячеек столбца С.

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 17:22
Hugo Дата: Вторник, 03.06.2014, 17:27 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Вообще было бы любопытно увидеть как Вы код прикрутили, ну да ладно...
Вот спецвставка:
[vba]
Код
Sub newtime()
     Dim r As Range
     Set r = Rows(2).Find([C1].Text, , xlValues, xlWhole)
     If Not r Is Nothing Then
         [C3:C7].Copy
         r.Offset(1).PasteSpecial Paste:=xlPasteValues
     End If
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеВообще было бы любопытно увидеть как Вы код прикрутили, ну да ладно...
Вот спецвставка:
[vba]
Код
Sub newtime()
     Dim r As Range
     Set r = Rows(2).Find([C1].Text, , xlValues, xlWhole)
     If Not r Is Nothing Then
         [C3:C7].Copy
         r.Offset(1).PasteSpecial Paste:=xlPasteValues
     End If
End Sub
[/vba]

Автор - Hugo
Дата добавления - 03.06.2014 в 17:27
ArkaIIIa Дата: Вторник, 03.06.2014, 17:38 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 894
Репутация: 115 ±
Замечаний: 0% ±

2010
Hugo
Вот сейчас всё супер) спасибо!)
 
Ответить
СообщениеHugo
Вот сейчас всё супер) спасибо!)

Автор - ArkaIIIa
Дата добавления - 03.06.2014 в 17:38
Rioran Дата: Вторник, 03.06.2014, 17:39 | Сообщение № 15
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
ArkaIIIa, доработал мой макрос с учётом вашего нового файла и рекоммендаций HUGO по поиску времени.

Теперь код легко работает с ручным вводом, ссылками, и вставляет только один раз. Прилагаю.
К сообщению приложен файл: timedata_2.xlsm (18.7 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеArkaIIIa, доработал мой макрос с учётом вашего нового файла и рекоммендаций HUGO по поиску времени.

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

Автор - Rioran
Дата добавления - 03.06.2014 в 17:39
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос переноса данных при сравнении двух ячеек (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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