Добрый день! Подскажите пожалуйста что с макросом. Получается ситуация что макрос срабатывает 1 раз. То есть переносит данные С 1-го листа в базу. Если по условию данные последней записи базы и Лист1 не совпадают макрос должен производить следующую запись. Пробовал разобраться сам но уже мозги кипят. Если плохо объяснил, пишите! Толком не соображаю уже. Благодарю за ответ. P.S. В общем нужно чтобы макрос проверив текущий столбец сравнил его с последним добавлением в базу, и не найдя совпадения добавил в базу данные с Лист1. Спасибо!!!
Добрый день! Подскажите пожалуйста что с макросом. Получается ситуация что макрос срабатывает 1 раз. То есть переносит данные С 1-го листа в базу. Если по условию данные последней записи базы и Лист1 не совпадают макрос должен производить следующую запись. Пробовал разобраться сам но уже мозги кипят. Если плохо объяснил, пишите! Толком не соображаю уже. Благодарю за ответ. P.S. В общем нужно чтобы макрос проверив текущий столбец сравнил его с последним добавлением в базу, и не найдя совпадения добавил в базу данные с Лист1. Спасибо!!!Kinder
[/vba]потому и цикл всего 1. Хотя там надо "В1", иначе i = количеству строк его версии экселя, да и остальное мрак. Да и вообще не ясно что надо. Таблицу сверять с базой? Или как? ??????? А сколько слов будет в базе? Это же - таблица * базу = циклов!!!
[/vba]потому и цикл всего 1. Хотя там надо "В1", иначе i = количеству строк его версии экселя, да и остальное мрак. Да и вообще не ясно что надо. Таблицу сверять с базой? Или как? ??????? А сколько слов будет в базе? Это же - таблица * базу = циклов!!! Wasilich
Добрый день! Благодарю за ответ. В принципе вчера так и понял, - что коряво объяснил) Скинул по сути сырой код. Пока ждал ответ, набросал чуть другой. Но и он тоже не срабатывает. То есть часть кода работает нормально часть нет. [vba]
Код
Sub tt() Set bz = Worksheets("База") Set zx = Worksheets("Лист1") Dim i As Long, j As Long Dim f As Long
If bz.Range("B2") = "" Then For i = 1 To 15 For j = 4 To zx.Range("B4").End(xlDown).Row If zx.Range("B" & j) <> "" Then i = i + 1: bz.Range("B" & i) = zx.Range("B" & j) If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("C" & i) = zx.Range("C" & j) ' If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("D" & i) = zx.Range("G" & j) ' If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("E" & i) = zx.Range("H" & j) ' If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("F" & i) = zx.Range("I" & j) Next j
Next i
Else For f = 2 To bz.Range("B2").End(xlDown).Row Next f f = f - 15 j = 4 'MsgBox f For h = f To bz.Range("B2").End(xlDown).Row If bz.Range("B" & h) <> zx.Range("B" & j) Then h = h + 14 ' MsgBox h For j = 4 To zx.Range("B4").End(xlDown).Row If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("B" & h) = zx.Range("B" & j) If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("C" & h) = zx.Range("C" & j) 'If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("D" & h) = zx.Range("G" & j) ' If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("E" & h) = zx.Range("H" & j) ' If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("F" & h) = zx.Range("I" & j) Next j End If Next h
' MsgBox f End If
End Sub
[/vba] Первая часть кода работает нормально! После else начинаются проблемы. Пытался реализовать - что если работает else, то нужно проверить последние данные с базы с листом1, что бы убедится что это не прошлая запись. И добавить данные в базу. Но запутался в циклах и переменных. Выполнив 1-е условие меняю данные на Лист1 чтобы запустить сравнение и не работает. Вместо этого через 1 ячейку в базе вставляет последнюю запись из Лист1. Благодарю за ответ!
Добрый день! Благодарю за ответ. В принципе вчера так и понял, - что коряво объяснил) Скинул по сути сырой код. Пока ждал ответ, набросал чуть другой. Но и он тоже не срабатывает. То есть часть кода работает нормально часть нет. [vba]
Код
Sub tt() Set bz = Worksheets("База") Set zx = Worksheets("Лист1") Dim i As Long, j As Long Dim f As Long
If bz.Range("B2") = "" Then For i = 1 To 15 For j = 4 To zx.Range("B4").End(xlDown).Row If zx.Range("B" & j) <> "" Then i = i + 1: bz.Range("B" & i) = zx.Range("B" & j) If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("C" & i) = zx.Range("C" & j) ' If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("D" & i) = zx.Range("G" & j) ' If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("E" & i) = zx.Range("H" & j) ' If zx.Range("B" & j) <> "" Then i = i + 0: bz.Range("F" & i) = zx.Range("I" & j) Next j
Next i
Else For f = 2 To bz.Range("B2").End(xlDown).Row Next f f = f - 15 j = 4 'MsgBox f For h = f To bz.Range("B2").End(xlDown).Row If bz.Range("B" & h) <> zx.Range("B" & j) Then h = h + 14 ' MsgBox h For j = 4 To zx.Range("B4").End(xlDown).Row If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("B" & h) = zx.Range("B" & j) If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("C" & h) = zx.Range("C" & j) 'If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("D" & h) = zx.Range("G" & j) ' If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("E" & h) = zx.Range("H" & j) ' If zx.Range("B" & j) <> "" Then h = h + 0: bz.Range("F" & h) = zx.Range("I" & j) Next j End If Next h
' MsgBox f End If
End Sub
[/vba] Первая часть кода работает нормально! После else начинаются проблемы. Пытался реализовать - что если работает else, то нужно проверить последние данные с базы с листом1, что бы убедится что это не прошлая запись. И добавить данные в базу. Но запутался в циклах и переменных. Выполнив 1-е условие меняю данные на Лист1 чтобы запустить сравнение и не работает. Вместо этого через 1 ячейку в базе вставляет последнюю запись из Лист1. Благодарю за ответ!Kinder
Думаю тут ничего сложного нет... Вот только одна проблемка - в понимании задачи... Если правильно поставить задачу, то и с решением помочь можно быстрее. Да и самому легче станет от понимания всей сущности бытия... А с Вашим кодом, боюсь, мало кто поможет. Напишите, пожалуйста, что есть начальными данными, что хотим получить на выходе и как Вы себе это представляете.
Думаю тут ничего сложного нет... Вот только одна проблемка - в понимании задачи... Если правильно поставить задачу, то и с решением помочь можно быстрее. Да и самому легче станет от понимания всей сущности бытия... А с Вашим кодом, боюсь, мало кто поможет. Напишите, пожалуйста, что есть начальными данными, что хотим получить на выходе и как Вы себе это представляете.Travelstar
Добрый день. Благодарю за ответ. Лист1 начальные данные. Если начальные данные на Лист1 заполнены (с "B$4$:B$18$"). То переносим их в базу. В базе получается ("B2:B16"). Я по сути это сделал. Когда меняются данные на Лист1, мне нужно сравнить данные с базы с данными Лист1, и если они не совпадают добавить данные в базу. В базе уже будет 2 записи ("B2:B32"). И так далее. Всю базу сравнивать не надо с Лист1. Достаточно последнюю запись в базе сравнить с Лист1. Спасибо. Пример заливать не стал, так как в он есть в 1-ом сообщении. Еще раз спасибо.
Добрый день. Благодарю за ответ. Лист1 начальные данные. Если начальные данные на Лист1 заполнены (с "B$4$:B$18$"). То переносим их в базу. В базе получается ("B2:B16"). Я по сути это сделал. Когда меняются данные на Лист1, мне нужно сравнить данные с базы с данными Лист1, и если они не совпадают добавить данные в базу. В базе уже будет 2 записи ("B2:B32"). И так далее. Всю базу сравнивать не надо с Лист1. Достаточно последнюю запись в базе сравнить с Лист1. Спасибо. Пример заливать не стал, так как в он есть в 1-ом сообщении. Еще раз спасибо.Kinder
Все 15 строк. Суть в том что бы в базе не было дубликатов. Что то вроде защиты. Если я не поменяв данные на лист1 случайно выполнил макрос, нужно что бы он не сработал. Спасибо.
Все 15 строк. Суть в том что бы в базе не было дубликатов. Что то вроде защиты. Если я не поменяв данные на лист1 случайно выполнил макрос, нужно что бы он не сработал. Спасибо. Kinder
Sub tt() Set bz = Worksheets("База") Set zx = Worksheets("Лист1") Dim i&, j&, r&, x& If bz.Range("B1") = "" Then For i = 4 To 17 If zx.Range("B" & i) <> "" Then j = j + 1 bz.Range("B" & j) = zx.Range("B" & i) bz.Range("C" & j) = zx.Range("C" & i) End If Next i Else r = bz.Range("B1").End(xlDown).Row For i = 17 To 4 Step -1 If zx.Cells(i, 2) = bz.Cells(r, 2) Then x = x + 1 r = r - 1 Next If x > 0 Then MsgBox x & " записей совпадают.": Exit Sub For i = 4 To 17 If zx.Range("B" & i) <> "" Then r = r + 1 bz.Range("B" & r) = zx.Range("B" & i) bz.Range("C" & r) = zx.Range("C" & i) End If Next i End If End Sub
[/vba]
Проверяйте.
[vba]
Код
Sub tt() Set bz = Worksheets("База") Set zx = Worksheets("Лист1") Dim i&, j&, r&, x& If bz.Range("B1") = "" Then For i = 4 To 17 If zx.Range("B" & i) <> "" Then j = j + 1 bz.Range("B" & j) = zx.Range("B" & i) bz.Range("C" & j) = zx.Range("C" & i) End If Next i Else r = bz.Range("B1").End(xlDown).Row For i = 17 To 4 Step -1 If zx.Cells(i, 2) = bz.Cells(r, 2) Then x = x + 1 r = r - 1 Next If x > 0 Then MsgBox x & " записей совпадают.": Exit Sub For i = 4 To 17 If zx.Range("B" & i) <> "" Then r = r + 1 bz.Range("B" & r) = zx.Range("B" & i) bz.Range("C" & r) = zx.Range("C" & i) End If Next i End If End Sub
Благодарю. Видимо я снова не совсем корректно объяснил. Когда значение bz.Range("B1") ="" код срабатывает нормально. То есть переносит данные из Лист1 в базу. Как бы получается 1-я запись. Но когда я меняю данные на Лист1, Ваш код их просто переписывает. То есть делает замену. Мне нужно что бы если я заменил данные в Лист1, макрос сравнил последнее добавление в базе с Лист1 и не найдя совпадений добавил их в базу. Ниже предыдущих. Что бы база пополнялась. Язык мой - враг мой!!! Совсем не умею объяснять. Благодарю за ответ.
Благодарю. Видимо я снова не совсем корректно объяснил. Когда значение bz.Range("B1") ="" код срабатывает нормально. То есть переносит данные из Лист1 в базу. Как бы получается 1-я запись. Но когда я меняю данные на Лист1, Ваш код их просто переписывает. То есть делает замену. Мне нужно что бы если я заменил данные в Лист1, макрос сравнил последнее добавление в базе с Лист1 и не найдя совпадений добавил их в базу. Ниже предыдущих. Что бы база пополнялась. Язык мой - враг мой!!! Совсем не умею объяснять. Благодарю за ответ.Kinder
Спасибо. Код начал работать. Но теперь не выполняется условие что если есть совпадения. После второго раза макрос копирует не проверяя. То есть на пустую "B2" сработал как положено. Второй раз те же данные не дал ввести. Поменял данные на Лист1 , он их добавил. И продолжает добавлять, хотя данные не меняются. Как раз в этом я тоже встал((( Благодарю за ответ.
Спасибо. Код начал работать. Но теперь не выполняется условие что если есть совпадения. После второго раза макрос копирует не проверяя. То есть на пустую "B2" сработал как положено. Второй раз те же данные не дал ввести. Поменял данные на Лист1 , он их добавил. И продолжает добавлять, хотя данные не меняются. Как раз в этом я тоже встал((( Благодарю за ответ.Kinder