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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2012, 11:10   #21
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Можно конечно и так сделать, подожду старттопика )
вечерком набросаю.
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 12.09.2012, 12:50   #22
darthraziel
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 24
По умолчанию

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

R Dmitry, спасибо за респонс! Увы, не получается запустить код - выдает ошибку "Недопустимое имя 'Лист1$'". Референс на АДО подключил.

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я понял задачу так - нужно и обновить/заменить, и добавить новые данные по датам и столбцам.
Если даты ещё нет - то добавить, если есть - заменить то, что есть.
Да, задача именно такая.
darthraziel вне форума Ответить с цитированием
Старый 12.09.2012, 21:11   #23
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Ловите
ОбновлениеXLS.zip
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 12.09.2012, 21:28   #24
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Классно.
А почему код в source? Ведь по логике процесса его нужно в main держать?
Или код в main нельзя, т.к. этот файл обновляется?
Тогда может быть иметь третий файл-инструмент, где выбирать эти два файла (или main можно там жёстко прописать)?
И как я понял, имена столбцов нельзя сразу забить с запасом, на все?
Хотя эту строку можно и динамически собирать - после выбора файла его открыть, прочитать заголовки столбцов, закрыть. Или как?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 12.09.2012 в 21:30.
Hugo121 вне форума Ответить с цитированием
Старый 12.09.2012, 22:10   #25
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Привет,
Цитата:
А почему код в source? Ведь по логике процесса его нужно в main держать?
По логике в БД доступ должен быть закрыт .
Код все равно где держать, ADO работает нормально и с открытыми файлами.... но есть нюанс, если данные удалить ручками, последующий insert будет начинаться не с последней строки, а со следующей после удаленной.
Так же вопрос возникает с типами данных, не получиться добавить строку со значением текст если первые строки идут числа, ну и тому подобные закавыки
Цитата:
Тогда может быть иметь третий файл-инструмент, где выбирать эти два файла (или main можно там жёстко прописать)?
Можно и так
Цитата:
Хотя эту строку можно и динамически собирать - после выбора файла его открыть, прочитать заголовки столбцов, закрыть. Или как?
Да ты прав имена забить с запасом нельзя, формировать их можно динамически, можно загрузить рекордсет с одной записью
Код:
select top 1 * from tbl
и считать название полей, а можно циклом и финдом
Сначала находим нужную запись, затем
в цикле добавляем или удаляем
Код:
Do While Not rs.EOF
   Urs.AddNew
   For i = 0 To rs.Fields.Count - 1
    Urs.Fields(rs.Fields(i).Name) = rs.Fields(i).Value
    Next
   Urs.Update
   rs.MoveNext
   Loop
Ну как то так.......
_____________________
Ну и напоследок, я бы не хранил данные в excel(как в БД) используя ADO. Да и обновление поддерживает только .xls , что тоже накладывает свои ограничения.
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 12.09.2012, 22:29   #26
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Спасибо.
Про xls не знал, это важно.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 12.09.2012, 22:49   #27
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Сделал средствами Excel. Применил редко используемый параметр
.PasteSpecial xlPasteValues, SkipBlanks:=True
Если проходить по шагам, то все понятно.
Вложения
Тип файла: rar Main+Source.rar (15.2 Кб, 33 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 13.09.2012, 13:13   #28
darthraziel
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 24
По умолчанию

Господа, всем огромное спасибо! Надеюсь, вам было не в тягость решать данную проблему

Оба макроса отлично работают, теперь буду их изучать, выбирать один и прикручивать его к актуальным файлам.
darthraziel вне форума Ответить с цитированием
Старый 14.09.2012, 10:27   #29
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

А вот "ленивый" способ привести столбцы в Source в тот же порядок, что в Main - расширенный фильтр!
Фильтр требует, чтобы в фильтруемом диапазоне были все заголовки, которые есть в диапазоне выгрузки.
Поэтому надо приписать заголовки из Main к заголовкам в Source.
Когда есть повторяющиеся заголовки, фильтр использует первый из них.
Код:
Sub merge2()
Dim mainHdr As Range, srcSheet As Worksheet, iSrc

Set mainHdr = ActiveSheet.UsedRange.Rows(1)
iSrc = Application.GetOpenFilename("Excel Files(*.xls*),*.xls*", , "Выбрать файл для обновления данных")
If iSrc = False Then Exit Sub
Set srcSheet = Workbooks.Open(iSrc, ReadOnly:=True).Worksheets(1)
mainHdr.Copy Cells(1, Columns.Count).End(xlToLeft).Offset(, 1)
With Workbooks.Add(xlWBATWorksheet).Sheets(1)
    mainHdr.Copy .[A1]
    srcSheet.UsedRange.AdvancedFilter xlFilterCopy, CopyToRange:=.UsedRange
    srcSheet.Parent.Close 0
End With
End Sub
Если даты в Main и в Source всегда идут подряд, то вставить данные можно одним действием (если в Source есть более ранние данные, чем в Main, то предварительно вставить пустые строки в Main). Тогда код получится не длиннее, чем на SQL
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 14.09.2012, 13:52   #30
darthraziel
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 24
По умолчанию

Казанский, еще раз хочу вас поблагодарить за макрос, я решил ваш использовать, потому что он гораздо более "резиновый", на мой взгляд.
Начал прикручивать к рабочим файлам, возник один нюанс, который я после проверил в файлах-примерах: при вставке значений из Source, если какие-то значения по датам уже есть в Main, то макрос вставляет обновленные значения, не нарушая формат.
Если же дат таких в Main еще нет, то эти строки вставляются именно с тем самым форматом, который определен в Source, даже несмотря на то, что в коде вставка прописана как .PasteSpecial xlPasteValues. А это, конечно, мелочи, но как-то нехорошо.

Как этот нюанс поправить, может, я что-то упустил из виду?
darthraziel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ComboBox на UserForm заполнить данными с другого листа ? Snekich Microsoft Office Excel 2 08.12.2011 18:37
Работа с данными с другого листа printer Microsoft Office Excel 1 14.06.2011 20:01
Копирование данных из одного файла Excel в другой через макрос I.P.iX Microsoft Office Excel 0 31.05.2011 22:20
Макрос, запускающий макрос из другого закрытого файла petruha Microsoft Office Excel 7 14.03.2010 11:31
Создать файл с данными на основе другого файла. Паскаль)) ТРОЯН=) Помощь студентам 13 16.04.2009 18:51