Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2018, 19:54   #1
Afterlight
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 10
Вопрос [РЕШЕНО][VB] Обновление данных листов по временно загруженному

Здравствуйте господа програмисты,

Прошу помочь мне с нелегкой ситуацией. А ситуация такая:

У меня список позиций и их статус, например

1ХБ2311 УСТАНОВЛЕН ПОДКЛЮЧЕН НАСТРОЕН

И иногда я получаю данные которые надо подгрузить, а так как строчек много, и все это разбито на 6 листов (территорий) то вручную довольно болезненно.

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

За русский великий и могучий сразу глубоко извиняюсь, не родной мне язык.

Выручите, люди добрые.
Afterlight вне форума Ответить с цитированием
Старый 05.05.2018, 22:27   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Afterlight Посмотреть сообщение
Идея иметь пустой лист, куда если подгрузить данные и нажать запуск программы, она прошерстит позиции, найдет совподения в листах, и обновит данные в последующих столбак если есть не пустая загружаемая инфромация. Но если ячейка в загружаемом листе пуста, не тронет и прежную.
Это можно сделать с помощью макроса.
Только Вам нужно подготовить тестовый файл.
В нём разместить нужные данные и описать, что и куда должно пойти, что должно обновится.
Пример можно сделать небольшой и условный (вместо настоящих данных поместить туда просто набор тестовых данных, аналогичных настоящим).
Можно ещё сделать одни файл, в котором разместить тот результат, который должен получиться после обработки листа макросом.
Нужно больше подробностей и конкретики.

Файл можно запаковать в архив и архив прикрепить к сообщению на форму (см. Расширенный режим - Управление вложениями).


Тогда есть шанс получить более-менее работающий макрос.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2018, 04:28   #3
Afterlight
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 10
По умолчанию

Спасибо за совет. Файл прикрепил, из него все вычестил что не надо, там буквально пару строк и листов.

Может кто сможет написать?
Вложения
Тип файла: xlsx Test.xlsx (21.0 Кб, 14 просмотров)
Afterlight вне форума Ответить с цитированием
Старый 07.05.2018, 08:51   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

List1-List3 зачем? Ведь, судя по файлу, читать надо только DATA LOAD.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 07.05.2018, 09:35   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Рискну высказать свои предположения,
как я понял то, что требуется автору топика.

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
List1-List3 зачем? Ведь, судя по файлу, читать надо только DATA LOAD.
читать из DATA LOAD, данные разбрасывать по листам List1-List3 (причём, думаю, что в реальной задаче листов не три, а больше - " и все это разбито на 6 листов (территорий)".

Как разбрасывать - тоже понятно - ищем совпадение по полю Name, столбец с заполненными данными из DATA LOAD записываем в лист, где нашли нужное наименование.

единственное, у меня вызывает небольшое сомнение вот это:
Цитата:
Сообщение от Afterlight Посмотреть сообщение
Но если ячейка в загружаемом листе пуста, не тронет и прежную.
Я это понимаю так, если на List1-List3 нашли нужное наименование, но в нужном столбце там пусто, то ничего туда не записываем, даже если есть данные в DATA LOAD.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2018, 09:58   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
читать из DATA LOAD, данные разбрасывать по листам List1-List3 (причём, думаю, что в реальной задаче листов не три, а больше - " и все это разбито на 6 листов (территорий)".
Тогда тот же вопрос, только в профиль: "Macro RUN" зачем?

после работы макроса АААА каким будет
Код:
Name	Data1	Data2	Data3	Data4	Data5	Data6	Data7	Data8	Data9	Data10
AAA AAA	1111	2222	3333	4444	5555	6666	181818	8888	9999	1010
или
Код:
Name	Data1	Data2	Data3	Data4	Data5	Data6	Data7	Data8	Data9	Data10
AAA AAA                                                181818
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 07.05.2018 в 10:03.
Aleksandr H. вне форума Ответить с цитированием
Старый 07.05.2018, 10:41   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Тогда тот же вопрос, только в профиль: "Macro RUN" зачем?
имхо, это от незнания как и где можно запускать макрос.


Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
после работы макроса АААА каким будет
Код:
Name	Data1	Data2	Data3	Data4	Data5	Data6	Data7	Data8	Data9	Data10
AAA AAA	1111	2222	3333	4444	5555	6666	181818	8888	9999	1010
думаю, так.

плохо, что в тестовом примере нет ни одного случая, когда
Цитата:
Сообщение от Afterlight Посмотреть сообщение
ячейка в загружаемом листе пуста

Впрочем, что это я за ТС отвечаю. Пусть он сам отвечает на эти вопросы.
я же могу ошибаться!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2018, 11:09   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Впрочем, что это я за ТС отвечаю. Пусть он сам отвечает на эти вопросы.
я же могу ошибаться!
Не страшно, мы придерживаемся канонов
Цитата:
Американский форум- задал вопрос, тебе на него обстоятельно и вежливо ответят... Еврейский форум- задал вопрос, тебе зададут встречный вопрос... Русский форум-задал вопрос, тебе ещё 2 часа будут объяснять какой ты мдуак!
Код:
Option Explicit

Sub MacroRun()
    Dim listsName() As String
    Dim i As Byte, j As Integer, jCol As Byte
    Dim jList As Byte
    Dim oneList As Worksheet
    Dim onListRowsCount As Integer
    Dim lCount As Integer
    Dim dataRowsCount As Integer
    Dim warnString As String, flag As Boolean
    lCount = -1
    warnString = ""
    For i = 1 To ThisWorkbook.Sheets.Count
        With ThisWorkbook.Sheets(i)
            If Left(LCase(.Name), 4) = "list" Then
              lCount = lCount + 1
              ReDim Preserve listsName(lCount)
              listsName(lCount) = .Name
            End If
        End With
    Next i
    
    With ThisWorkbook.Sheets("DATA LOAD")
        dataRowsCount = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 5 To dataRowsCount
            flag = False
            For jList = LBound(listsName) To UBound(listsName)
                Set oneList = ThisWorkbook.Sheets(listsName(jList))
                onListRowsCount = oneList.Cells(oneList.Rows.Count, 1).End(xlUp).Row
                For j = 5 To onListRowsCount
                    If LCase(oneList.Cells(j, "A")) = LCase(.Cells(i, "A")) Then
                        flag = True
                        For jCol = 2 To 11
                            If .Cells(i, jCol) <> "" Then
                                oneList.Cells(j, jCol) = .Cells(i, jCol)
                            End If
                        Next jCol
                    End If
                Next j
            Next jList
            If Not flag Then warnString = warnString & "[" & .Cells(i, "A") & "] "
        Next i
    End With
    If warnString <> "" Then warnString
    Set oneList = Nothing
End Sub
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 07.05.2018, 16:10   #9
Afterlight
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 10
По умолчанию

Простите за мунтые обьяснения.

Идея такова, чтобы из DATA LOAD списка записывались только НЕ пустые ячейки. Так как списки у меня с информацией там и сям, которую надо внести в старые. Если будет писать все, то постирает существующие ячейки в List1, List2 и т.д.

Или например есть информация не проверенная, я ее до загрузки сотру, пока не получу проверенную, и обновится лиш та, что есть в ячейках.

Иными словами не имеет значения если ячейка пуста в List1 и подобных, я для скрипта имеет значение только DATA LOAD, if empty do nothing.

Именно по этому в примере DATA LOAD информации не много, буквально в паре ячеек.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
думаю, так.
Да, именно!


И по поводу MacroRun это так, идея иметь кнопку, которой скрипт запускется, чтобы он это сразу не делал когда вставляется (CTRL+V) новая информация, а только после нажатия кнопки.

P.S.

По поводу канонов, может и смешно, но вот я вам по опыту скажу, чтоб ты не спросил у иностранцев, помощь там почти не реально получить пока сам не научишся писать код, и половину худо бедно не напишеш. Я такое может тоже от части понимаю, но както не по-людски чтоли.. Так что вам спасибо за активное участие и помощь!

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Не страшно, мы придерживаемся канонов
[/CODE]
Watch : : warnString : <Can't compile module> : Empty : Module2.Makro1

Удалил строку, If warnString <> "" Then warnString, и код заработал!

И выдает Overflow ошибку если работаю с 294 строками. Можно исправить?

UPD:
Dim i as Long - помогло вроде обойти Overflow ошибку.

Извините за борзоту, но можно както сделать так чтобы было понятно что скрипт закончил и какие позиции были обновлены?

Например покрасил бы ячейки в зеленый в DATA LOAD у которых были совпадения (столбик Name)? Ну например у меня в основном списке вообще нет такой позиции..

А вообще спасибо вам всем, и особенно Александру - огрмоное человеческое спасибо!!!! Все работает, и это мне так сильно облегчило жизнь!

Последний раз редактировалось Вадим Мошев; 20.05.2018 в 18:59.
Afterlight вне форума Ответить с цитированием
Старый 07.05.2018, 20:19   #10
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

1. Чтобы уведомить что макрос закончил работу, вместо той строки, котороая ошибку выдавала и вы ее удалили, напишите
Код:
msgBox "Конец работы макроса"
2. После flag = true напишите
Код:
.cells(I,"a").interior.colorindex = 4
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сверка данных с разных листов serjloskut Microsoft Office Excel 4 06.09.2017 12:53
Очистка листов от данных and150382 Microsoft Office Excel 3 14.02.2013 21:15
Копирование данных из 2-ух листов в один Marishka2011 Microsoft Office Excel 0 01.04.2011 16:32
Суммирование данных с разных листов S_P_N Microsoft Office Excel 12 02.06.2010 18:23
Обновление списка данных без потери данных в переменных VaBank БД в Delphi 13 03.06.2009 10:47