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

Вход

Регистрация

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

 

= Мир MS Excel/Циклы и добавление данных в базу! - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Циклы и добавление данных в базу!
Kinder Дата: Вторник, 16.12.2014, 17:41 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
Подскажите пожалуйста что с макросом.
Получается ситуация что макрос срабатывает 1 раз. То есть переносит данные С 1-го листа в базу.
Если по условию данные последней записи базы и Лист1 не совпадают макрос должен производить следующую запись.
Пробовал разобраться сам но уже мозги кипят.
Если плохо объяснил, пишите! Толком не соображаю уже.
Благодарю за ответ.
P.S. В общем нужно чтобы макрос проверив текущий столбец сравнил его с последним добавлением в базу, и не найдя совпадения добавил в базу данные с Лист1.
Спасибо!!!
К сообщению приложен файл: 111.xlsm (14.7 Kb)


"И все таки она вертится!"
 
Ответить
СообщениеДобрый день!
Подскажите пожалуйста что с макросом.
Получается ситуация что макрос срабатывает 1 раз. То есть переносит данные С 1-го листа в базу.
Если по условию данные последней записи базы и Лист1 не совпадают макрос должен производить следующую запись.
Пробовал разобраться сам но уже мозги кипят.
Если плохо объяснил, пишите! Толком не соображаю уже.
Благодарю за ответ.
P.S. В общем нужно чтобы макрос проверив текущий столбец сравнил его с последним добавлением в базу, и не найдя совпадения добавил в базу данные с Лист1.
Спасибо!!!

Автор - Kinder
Дата добавления - 16.12.2014 в 17:41
Wasilich Дата: Вторник, 16.12.2014, 23:23 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Если плохо объяснил, пишите!
Это точно! %)
 
Ответить
Сообщение
Если плохо объяснил, пишите!
Это точно! %)

Автор - Wasilich
Дата добавления - 16.12.2014 в 23:23
Travelstar Дата: Среда, 17.12.2014, 00:21 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Доброго времени суток!!!
[vba]
Код

For i = i To bz.Range("A1").End(xlDown).Row
[/vba]
вот тут проблемка.. как минимум
Вы пишете i = i...
И в каждом модуле используйте Option Explicit


Сообщение отредактировал Travelstar - Среда, 17.12.2014, 00:24
 
Ответить
СообщениеДоброго времени суток!!!
[vba]
Код

For i = i To bz.Range("A1").End(xlDown).Row
[/vba]
вот тут проблемка.. как минимум
Вы пишете i = i...
И в каждом модуле используйте Option Explicit

Автор - Travelstar
Дата добавления - 17.12.2014 в 00:21
Wasilich Дата: Среда, 17.12.2014, 00:53 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Вы пишете i = i...
И перед этим
[vba]
Код
i = bz.Range("A1").End(xlDown).Row
[/vba]потому и цикл всего 1. Хотя там надо "В1", иначе i = количеству строк его версии экселя, да и остальное мрак.
Да и вообще не ясно что надо. Таблицу сверять с базой? Или как? ???????
А сколько слов будет в базе? Это же - таблица * базу = циклов!!! %)
 
Ответить
Сообщение
Вы пишете i = i...
И перед этим
[vba]
Код
i = bz.Range("A1").End(xlDown).Row
[/vba]потому и цикл всего 1. Хотя там надо "В1", иначе i = количеству строк его версии экселя, да и остальное мрак.
Да и вообще не ясно что надо. Таблицу сверять с базой? Или как? ???????
А сколько слов будет в базе? Это же - таблица * базу = циклов!!! %)

Автор - Wasilich
Дата добавления - 17.12.2014 в 00:53
Kinder Дата: Среда, 17.12.2014, 13:12 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
Благодарю за ответ. В принципе вчера так и понял, - что коряво объяснил)
Скинул по сути сырой код. Пока ждал ответ, набросал чуть другой. Но и он тоже не срабатывает. То есть часть кода работает нормально часть нет.
[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
Дата добавления - 17.12.2014 в 13:12
Travelstar Дата: Среда, 17.12.2014, 20:30 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Думаю тут ничего сложного нет...
Вот только одна проблемка - в понимании задачи...
Если правильно поставить задачу, то и с решением помочь можно быстрее. Да и самому легче станет от понимания всей сущности бытия...
А с Вашим кодом, боюсь, мало кто поможет. Напишите, пожалуйста, что есть начальными данными, что хотим получить на выходе и как Вы себе это представляете.
 
Ответить
СообщениеДумаю тут ничего сложного нет...
Вот только одна проблемка - в понимании задачи...
Если правильно поставить задачу, то и с решением помочь можно быстрее. Да и самому легче станет от понимания всей сущности бытия...
А с Вашим кодом, боюсь, мало кто поможет. Напишите, пожалуйста, что есть начальными данными, что хотим получить на выходе и как Вы себе это представляете.

Автор - Travelstar
Дата добавления - 17.12.2014 в 20:30
Kinder Дата: Четверг, 18.12.2014, 16:44 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Добрый день.
Благодарю за ответ.
Лист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
Дата добавления - 18.12.2014 в 16:44
Wasilich Дата: Четверг, 18.12.2014, 17:46 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Достаточно последнюю запись в базе сравнить с Лист1.
Ну вроде ближе к пониманию.
И все же как сравнить? Все 14 строк или последнюю строку базы с последней строкой Лист1?
 
Ответить
Сообщение
Достаточно последнюю запись в базе сравнить с Лист1.
Ну вроде ближе к пониманию.
И все же как сравнить? Все 14 строк или последнюю строку базы с последней строкой Лист1?

Автор - Wasilich
Дата добавления - 18.12.2014 в 17:46
Kinder Дата: Четверг, 18.12.2014, 18:25 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Все 15 строк.
Суть в том что бы в базе не было дубликатов. Что то вроде защиты. Если я не поменяв данные на лист1 случайно выполнил макрос, нужно что бы он не сработал.
Спасибо.


"И все таки она вертится!"
 
Ответить
СообщениеВсе 15 строк.
Суть в том что бы в базе не было дубликатов. Что то вроде защиты. Если я не поменяв данные на лист1 случайно выполнил макрос, нужно что бы он не сработал.
Спасибо.

Автор - Kinder
Дата добавления - 18.12.2014 в 18:25
Wasilich Дата: Четверг, 18.12.2014, 18:54 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Проверяйте.
 
Ответить
СообщениеПроверяйте.

Автор - Wasilich
Дата добавления - 18.12.2014 в 18:54
Kinder Дата: Четверг, 18.12.2014, 19:20 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Благодарю.
Видимо я снова не совсем корректно объяснил. Когда значение bz.Range("B1") ="" код срабатывает нормально. То есть переносит данные из Лист1 в базу. Как бы получается 1-я запись.
Но когда я меняю данные на Лист1, Ваш код их просто переписывает. То есть делает замену. Мне нужно что бы если я заменил данные в Лист1, макрос сравнил последнее добавление в базе с Лист1 и не найдя совпадений добавил их в базу. Ниже предыдущих. Что бы база пополнялась.
Язык мой - враг мой!!! Совсем не умею объяснять.
Благодарю за ответ.


"И все таки она вертится!"
 
Ответить
СообщениеБлагодарю.
Видимо я снова не совсем корректно объяснил. Когда значение bz.Range("B1") ="" код срабатывает нормально. То есть переносит данные из Лист1 в базу. Как бы получается 1-я запись.
Но когда я меняю данные на Лист1, Ваш код их просто переписывает. То есть делает замену. Мне нужно что бы если я заменил данные в Лист1, макрос сравнил последнее добавление в базе с Лист1 и не найдя совпадений добавил их в базу. Ниже предыдущих. Что бы база пополнялась.
Язык мой - враг мой!!! Совсем не умею объяснять.
Благодарю за ответ.

Автор - Kinder
Дата добавления - 18.12.2014 в 19:20
Wasilich Дата: Четверг, 18.12.2014, 20:13 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Виноват. Не учел обнуления r в цикле.
После строки
[vba]
Код
If x > 0 Then MsgBox x & " записей совпадают.": Exit Sub
[/vba]вставьте
[vba]
Код
r = bz.Range("B1").End(xlDown).Row
[/vba]


Сообщение отредактировал Wasilic - Четверг, 18.12.2014, 20:13
 
Ответить
СообщениеВиноват. Не учел обнуления r в цикле.
После строки
[vba]
Код
If x > 0 Then MsgBox x & " записей совпадают.": Exit Sub
[/vba]вставьте
[vba]
Код
r = bz.Range("B1").End(xlDown).Row
[/vba]

Автор - Wasilich
Дата добавления - 18.12.2014 в 20:13
Kinder Дата: Четверг, 18.12.2014, 20:24 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Спасибо.
Код начал работать. Но теперь не выполняется условие что если есть совпадения. После второго раза макрос копирует не проверяя.
То есть на пустую "B2" сработал как положено. Второй раз те же данные не дал ввести. Поменял данные на Лист1 , он их добавил. И продолжает добавлять, хотя данные не меняются.
Как раз в этом я тоже встал(((
Благодарю за ответ.


"И все таки она вертится!"
 
Ответить
СообщениеСпасибо.
Код начал работать. Но теперь не выполняется условие что если есть совпадения. После второго раза макрос копирует не проверяя.
То есть на пустую "B2" сработал как положено. Второй раз те же данные не дал ввести. Поменял данные на Лист1 , он их добавил. И продолжает добавлять, хотя данные не меняются.
Как раз в этом я тоже встал(((
Благодарю за ответ.

Автор - Kinder
Дата добавления - 18.12.2014 в 20:24
Kinder Дата: Четверг, 18.12.2014, 20:34 | Сообщение № 14
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 0 ±
Замечаний: 0% ±

Прошу меня простить!!! Не досмотрел. У меня присутствует шапка ( надо было поменять "B1" на "B2").
В строчке
[vba]
Код
If x > 0 Then MsgBox x & " записей совпадают.": Exit Sub
[/vba]
можно ли сделать
[vba]
Код
If x > 0 Then: GoTo h
h:
End Sub
[/vba]
А так все работает. Огромное Вам спасибо.


"И все таки она вертится!"

Сообщение отредактировал Kinder - Четверг, 18.12.2014, 20:35
 
Ответить
СообщениеПрошу меня простить!!! Не досмотрел. У меня присутствует шапка ( надо было поменять "B1" на "B2").
В строчке
[vba]
Код
If x > 0 Then MsgBox x & " записей совпадают.": Exit Sub
[/vba]
можно ли сделать
[vba]
Код
If x > 0 Then: GoTo h
h:
End Sub
[/vba]
А так все работает. Огромное Вам спасибо.

Автор - Kinder
Дата добавления - 18.12.2014 в 20:34
Wasilich Дата: Четверг, 18.12.2014, 20:44 | Сообщение № 15
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Поменял данные на Лист1 , он их добавил. И продолжает добавлять, хотя данные не меняются.
У меня не продолжает.
К сообщению приложен файл: Kinder.xls (39.0 Kb)
 
Ответить
Сообщение
Поменял данные на Лист1 , он их добавил. И продолжает добавлять, хотя данные не меняются.
У меня не продолжает.

Автор - Wasilich
Дата добавления - 18.12.2014 в 20:44
  • Страница 1 из 1
  • 1
Поиск:

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