Добрый день, Lad!
Насчет "затаскивания базы". Я здесь на форуме нашел макрос, который объединяет в один файл данные из любого количества файлов Excel, находяшихся в одной с ним папке и имеющих листы с одним именем и одинаковые шапки таблиц. Вот этот макрос:
Sub CollectAllClients()
Dim BazaWb As Workbook 'текущая книга (общий файл)
Dim BazaSht As Worksheet 'лист База покупателей в общем файле
Dim iTempWb As Workbook 'по-очерёдно открываемый файл
Dim iTempSht As Worksheet 'лист База покупателей в по-очерёдно открываемом файле
Dim iTempFileName As String 'имя по-очерёдно открываемого файла
Dim iRowIndex As Long 'количество заполненных строк в общем файле
Dim iPath As String 'путь к папке, где лежат все файлы
Dim iLastRowBazaA As Long 'последняя заполненная строка в общем файле в столбце A
Dim iLastRowBazaB As Long 'последняя заполненная строка в общем файле в столбце B, т.к. могут различаться
Dim iLastRowTempWbA As Long 'последняя заполненная строка в по-очерёдно открываемом файле в столбце A
Dim iLastRowTempWbB As Long 'последняя заполненная строка в по-очерёдно открываемом файле в столбце B, т.к. могут различаться
Dim iNumFiles As Long 'количество открываемых файлов
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.Calculation = xlManual
.EnableEvents = False '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'.EnableEvents = True
Set BazaWb = ThisWorkbook
Set BazaSht = BazaWb.Sheets("Вывозка")
iPath = BazaWb.Path & "\"
iTempFileName = Dir(iPath & "*.xls")
Do While iTempFileName <> ""
If iTempFileName = BazaWb.Name Then GoTo iNext:
With .Workbooks.Open _
(Filename:=iPath & iTempFileName, UpdateLinks:=False, ReadOnly:=True)
iNumFiles = iNumFiles + 1
'Рабочая книга не должна быть защищена паролем
With .Worksheets("Вывозка") '.UsedRange
iLastRowTempWbA = .Cells(Rows.Count, 1).End(xlUp).Row
iLastRowTempWbB = .Cells(Rows.Count, 2).End(xlUp).Row
iLastRowTempWbA = IIf(iLastRowTempWbA >= iLastRowTempWbB, iLastRowTempWbA, iLastRowTempWbB)
iLastRowBazaA = BazaSht.Cells(Rows.Count, 1).End(xlUp).Row
iLastRowBazaB = BazaSht.Cells(Rows.Count, 2).End(xlUp).Row
iLastRowBazaA = IIf(iLastRowBazaA >= iLastRowBazaB, iLastRowBazaA, iLastRowBazaB) + 1
.Range(Cells(2, 1), Cells(iLastRowTempWbA, 27)).Copy Destination:=BazaSht.Cells(iLastRowBazaA, 1)
End With
.Close saveChanges:=False
End With
iNext:
iTempFileName = Dir
Loop
.Calculation = xlAutomatic
.DisplayAlerts = True
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
В папке Вывозка у меня 3 файла- Вывозка_Тура, Вывозка_Качканар и третий файл с макросами, которые выполняются при открытии файла (первый макрос очищает диапазон ячеек A2:R1001, т.к. CollectAllClients добавляет при каждом выполнении данные начиная с первой свободной строки, т.е не заменяет данные, а каждый раз прибавляет, затем выполняется CollectAllClients и потом еще один, который заменяет пустые значения в ячейках на ноли в диапазоне A2:R1001, т.к без этого потом запрос не берет данные если в каком то столбце в начале стоят пустые ячейки. Где то выше я уже спрашивал об этом.) Этот диапазон A2:R1001 именован как ОбщаяВывозка. Потом уже в Вашем файле на листе Вывозка я создаю запрос из именованого диапазона ОбщаяВывозка, который работает при открытии файла (когда Вам отправлял, отключил автообновление при открытии) В файлах Вывозка_Тура и Вывозка_Качканар по 2 листа - Вывозка (шапки таблиц такие же как и в Вашем файле) и подъемка (шапки тоже одинаковые). Можно было бы Ваш файл поместить в папку Вывозка, тогда не нужен бы был промежуточный файл для объединения данных, но я использую эту же базу еще для одного файла, уже для себя, где идет анализ использования лесфонда по лесорубочным билетам, а макрос работает со всеми xls файлами в папке и тогда в нем будут собираться данные уже из 3 файлов. Хотя только что подумал, что можно же в Вашем файле диапазон именовать и из него данные получать в свой файл Лесфонд, точно, так и сделаю наверно.
Насчет ссылок на ячейки из другой книги - пробовал скопировать макрос CollectAllClients под другим именем CollectAllClientsPod в другой модуль этой же книги изменив листы с Вывозка на Подъемка, чего то не получилось, ни один не работает после этого, может его как продолжение первого нужно сделать? Поэтому и вставил пока ссылки. Просто эти 2 дня в лесу работали, каждый день километров по 5-6 по снегу по колено лазали, домой прихожу - ноги дрожат, некогда было поэкспериментировать, вот в выходные посижу дома, потыкаюсь. Лист ремонт оставить нужно в Вашем файле для прямого заполнения, потому что их только в Туре заполняют, в Туре основная база предприятия и базирование лесовозов, где они и ремонтируются.
Насчет текстового формата ячеек - черт его знает почему так, проверю в исходных файлах, хотя при заполнении это бы наверно выявилось.
А вообще, LAD, Вы по жизни чем занимаетесь? Вы на меня столько времени убиваете, даже неудобно уже Вас эксплуатировать. А если есть интерес я могу Вам предложить написать программку для ведения Учета Лесного Фонда. Его ежегодно делают все лесхозы (сейчас лесничества называются)- это госучреждения, а с этого года похоже заставят делать и арендаторов (лесозаготовителей). Львиная доля этой работы насколько я знаю производится инженерами вручную, а там куча увязок и форм, мы раньше вчетвером недели 2 сидели с этими бумагами. Я 2 года назад в лесхозе директором работал, технологию всех расчетов могу объяснить. Если все получится в принципе такую программу можно наверно будет продавать лесхозам и арендаторам (если есть такой опыт - продавать), т.к. не слышал, чтобы кто то пользовался в этом деле программами. В областном управлении Лесного хозяйства есть программа московская, но она еще в DOS сделана и никаких расчетов не производит - только ручная набивка всех данных в нее (которые нужно вручную сначала получить) для контроля всех увязок и объединения всех данных по Субъекту РФ в единую базу данных, которая затем сдается в Москве по всей России.
Я позднее сделал в Excel формулами такой файл, но он только под конкретный наш лесхоз был адаптирован, а с 1.01.08 лесхозы укрупняли, добавились новые лесничества и районы, так что сейчас он не актуален, хотя в свое время очень выручал нашего инженера лесного хозяйства, она одна делала этот учет за несколько дней, причем не нужно ни над чем задумываться особо, просто внимательно внести все изменеия за год и распечатать готовые формы.