Уважаемые форумчане, прошу помощи. Есть два файла: Данные1С.xlsx и Шаблон.xlsm На основе файла Шаблон.xlsm, после выполнения всех задач макроса, нужно создать ещё задачу: сохранить файл Прайс.xlsx и удалить из этого файла ненужные листы. Но для начала помогите пожалуйста решить первостепенную задачу: В файле шаблон нужен макрос, который из файла Данные1С.xlsx скопирует данные и вставит в файл Шаблон.xlsm на лист SMT...
Скрытый текст
И ещё большая просьба, при загрузке файла Шаблон.xlsm, не нужно запускать диалог выбора файла excel из которого нужно делать импорт, а просто спросить: "Импортировать данные из файла?" с кнопками Да или Нет. Файлы всегда лежат в корне D диска: D:\Данные1С.xlsx и D:\Шаблон.xlsm Данные, которые нужно импортировать, всегда будут начинаться с 13-й строки в файле Данные1С.xlsx Некоторые из импортируемых ячеек иногда могут быть пустыми, кроме ячеек графы Код. Т.е. если в графе код начались пустые ячейки то ниже данных уже не будет.
Sub Get_1CData()
Const iPath1C$ = "D:\Данные1С.xlsx" 'путь к файлу с исходными данными
Dim wb1C As Workbook
Dim arr1C(), arr()
Dim I&
Application.ScreenUpdating = False
On Error Resume Next
Set wb1C = Workbooks.Open(iPath1C)
If Not wb1C Is Nothing Then
With wb1C.Worksheets(1)
arr1C = .Range(.Cells(13, 2), .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, .Cells(13, .Columns.Count).End(xlToLeft).Column)).Value
wb1C.Close False
End With
Else
MsgBox "По указанному пути файл с исходными данными отсутствует!", vbCritical + vbOKOnly
Exit Sub
End If
If UBound(arr1C, 1) <> 0 Then
ReDim arr(LBound(arr1C, 1) To UBound(arr1C, 1), 1 To 8)
Else
MsgBox "В исходном файле нет данных или структура файла изменена!", vbCritical + vbOKOnly
Exit Sub
End If
For I = LBound(arr1C, 1) To UBound(arr1C, 1)
arr(I, 1) = arr1C(I, 1)
arr(I, 2) = arr1C(I, 3)
arr(I, 3) = arr1C(I, 5)
arr(I, 4) = arr1C(I, 6)
arr(I, 5) = arr1C(I, 7)
arr(I, 6) = arr1C(I, 8)
arr(I, 7) = arr1C(I, 9)
arr(I, 8) = arr1C(I, 10)
Next
With ThisWorkbook.Worksheets("SMT")
Call ResetTable 'очищаем шаблон
.ListObjects("tblShablon").DataBodyRange(1, 1).Resize(UBound(arr, 1), 8) = arr
End With
Application.ScreenUpdating = True
End Sub
Sub ResetTable()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("SMT").ListObjects("tblShablon")
With tbl.DataBodyRange
If .Rows.Count > 1 Then
.Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Rows.Delete
End If
End With
tbl.DataBodyRange.Rows(1).ClearContents
End Sub
Sub SavePrice()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
With ThisWorkbook
.Worksheets("Price").Copy
ActiveWorkbook.SaveAs Filename:=.Path & Application.PathSeparator & "Прайс.xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End With
Application.ScreenUpdating = True
End Sub
Вот тут непонятно
Цитата
при загрузке файла Шаблон.xlsm, не нужно запускать диалог выбора файла
Вам нужно запускать макрос при открытии файла Шаблон?
написал: Вам нужно запускать макрос при открытии файла Шаблон?
Благодарю вас за помощь. Вы единственный, кто вызвался помочь. Мало кто берётся помогать, когда видит большой объём работы. Всё верно! Хотелось что бы в шаблоне были не кнопки, а при загрузке шаблона выскакивало окошко с вопросом: "Загрузить данные из стороннего файла"? Если нажать на кнопку Да, то шаблон должен запустить макрос, вытащить данные и сохранить файл, а если нажать Нет, то ничего не делать. Файл Прайс.xlsx должен сохраниться не с листом Price (как это реализовано сейчас), а наоборот с листом SMT, а лист Price нужно удалить. Кнопки, которые вы уже сделали не удаляйте пока, пусть останутся. Но в сохраняемом файле Прайс.xlsx эти кнопки тоже нужно убрать.
Всё замечательно! Осталось вот что: 1. В графе остаток нужно округлить все цифры вниз до целого значения. Например если остаток равен 4,999 то нужно чтобы получилось 4 2. В графе RUB без НДС нужно к кадждой ячейке применить следующую формулу: значение * 30 / 6 округлить вверх до целых * 6 (т.е. именно такую формулу тут нужно применить. Ещё раз: значение ячейки * 30 / 6 округлить вверх до целых и умножить на 6). 3. Нужно макросу объяснить что бы он искал совпадения, которые представлены на листе Price в файле Шаблон.xlsm. Искать нужно именно вот эти строки под цифрой 1:
Скрытый текст
И там где есть совпадения (под цифрой 2) нужно поставить цифру из графв RUB без НДС (под цифрой 3), вместо той которая импортируется из файла Данные1С.xlsx. Впрочем где искать совпадения, в файле Данные1С.xlsx или файле Шаблон.xlsm на листе SMT - без разницы. Лучше всего конечно самый быстрый способ.
Смотрю аппетит приходит во время еды) Вы сами-то попробуйте хоть что-нибудь сделать, а то все больше на ТЗ становится похоже. В этой ветке ПОМОГАЮТ, а не делают все под ключ
Согласие есть продукт при полном непротивлении сторон
Sanja, я смог сделать это (но не всё) только с помощью формул excel, а в макросах я совершенно не разбираюсь. Но, ничего страшного. В любом случае от всей души благодаю за помощь.
п.3 нужно выполнять после п.2.? Т.е. найденное значение на листе 'Price' нужно пересчитывать по формуле п.2. или переносить как есть? Поиск нужно вести по трем значениям(Код+Партия+Поставщик)? Или достаточно по Коду?
Sanja, я и не сомневался что вы всё равно доведёте всё до конца. 1. Да, пункт 3 выполнять нужно после пункта 2. Цифру ненужно пересчитывать по формуле, а переносить как есть. 2. Да, поиск нужно вести именно по трём значениям.
AndreiSMT написал: Впрочем где искать совпадения, в файле Данные1С.xlsx или файле Шаблон.xlsm на листе SMT - без разницы.
как раз есть разница. В данные на листе 'SMT', выбранные из файла 'Данные1С.xlsx' НЕ попадают данные, нужные для сравнения. В частности там нет столбцов Партия и Поставщик. Поэтому сравнение нужно производить ДО того, как данные попадут на лист 'SMT', а для этого нужно основательно переписать готовый макрос. Ну или ограничиться только совпадением Кода
К сожалению если искать совпадения по коду, то оно на все такие строки проставит одну и туже цену. Тут нужно именно по всем трём значениям:(Код+Партия+Поставщик).
Ваша формула не работает для такого значения А/камера (вент. ГК-260) СЕР ГРУЗ Точнее, она возвращает результат отличный от того, что на картинке. В чем подвох?
Согласие есть продукт при полном непротивлении сторон
Если в строке наименования нет пробела со слэшем, тогда тянется значение из графы Дополнительное описание. В приведённой вами строке как видим нет пробела со слэшем (слэш есть, но перед ним нет пробела): А/камера (вент. ГК-260) СЕР ГРУЗ, по этому в таком случае тянется значение из этой же строки, но только из графы Дополнительное описание.
Скрытый текст
А если случается когда возвращается 0 как видно из примера на скриншоте, тогда у нас в базе 1С я самостоятельно исправляю такие ошибки и выгружаю Данные из 1С по новой. Былобы хорошо, если бы макрос предуреждал о значении 0, какой-нибудь ошибкой, но это не критично. Будет замечательно и без предупреждений.
Предлагаю перенести тему в ветку Работа и договариваться уже в личке о дальнейшем сопровождении макроса. По ценам и срокам. А то мало-ли что Вы еще куда захотите вставить. Вот сразу и расхотелось)
Уважаемые форумчане, подскажите пожалуйста, что можно сделать чтобы прикрепленный файл всегда открывался поверх всех окон с диалоговым вопросом об импорте данных. Запускаю из тотала и из проводника, и всё одинаково... И проводник и тотал всегда остаются поверх. Если убрать из макроса диалог с вопросом об импорте, тогда всё нормально. Но что можно сделать чтобы и диалог с вопросом импорта остался и открывался поверх все окон?
Sanja, и уважаемые форумчане, гляньте пожалуйста на мои небольшие изменения в макросе. Я кое-как нашел в сети способ выбора файла и прописал в макросе. Вроде работает. Но я не смог найти способ сделать так, что бы при выборе файла всегда открывался корень диска D. И ещё подскажите пожалуйста как сделать так, чтобы при нажатии на кнопку Сохранить, файл сохранялся не рядом с Шаблон.xlsm, а по указанному пути, напрмер "E:\Прайс.xlsx"
AndreiSMT, Я предупреждал. Одна Тема - Один вопрос. Вы все вопросы, так или иначе касаемые Вашего файла будете сюда постить? Название тему ну очень широкое. Тема закрыта
Согласие есть продукт при полном непротивлении сторон