Добрый день. Подскажите пожалуйста как реализовать следующий функционал: Есть таблица с данными (в примере это лист "исходные данные") Есть список актов с номерами и фамилиями ( в примере это лист "исходные данные 2") Нужно на основание списка актов сформировать акт и напечатать его, количество актов будет равно количеству номеров. В форме для печати будет менятся номер акта, дата, и строки самого акта. Отбор данных в акт производится по фамилии, но тут такой момент, фамилии в таблице "исходные данные" написаны на латинице, а в таблице "исходные данные 2" кирилицей, для этого думаю сделать таблицу соответствия и первым делом заменить имена и фамилия на русские. На печать строки соответствующие фамилии "ответственный" / "сотрудник"
Таблица "исходные данные" в реальности очень большая во обоих направлениях, нужные для печати столбцы можно найти по заголовку столбца
Игорь, Спасибо за ответ. Реализовать все хочется в виде макроса. Как вообще такие задачи реализуются в виде плана действий, у меня в голове крутится так: 1. перевести в транслит столбец с фамилиями 2. "выдернуть" нужные столбцы с данными для печати на новый лист 3. дольше цикл подстановки в форму для печати номер акта дата и строки содержашие определённую фамилию потом печать, следующий номер дата фамилия
кладем файл в папку C:\1\ На листе "печатная форма" в D1 выбираем нужный акт. Таблица обновляется автоматически. Если надо обновить список актов в выборе D1, то двойной клик на D1, список берется с листа Исходные данные 2.
Sub Список(Optional Target As Range)
'добавляет в ячейку список проверки/выбора
Dim InVal() As Variant
Dim OutVal() As Variant
Dim OutVal2 As String
If TypeName(Target) <> "Range" Then Set Target = ThisWorkbook.Worksheets("Печатная форма").Range("D1")
InVal = ThisWorkbook.Worksheets("Исходные данные 2").Range("E1:E100").Value
Set dicRow = CreateObject("scripting.dictionary")
With dicRow
.comparemode = 1
.Add InVal(1, 1), 1
For i = 1 To UBound(InVal, 1)
If Not .Exists(InVal(i, 1)) Then .Add InVal(i, 1), InVal(i, 1)
Next i
.Remove (InVal(1, 1))
OutVal = .keys
End With
With Target.Validation
.Delete
.Add Type:=xlValidateList, Formula1:=Join(OutVal, ",")
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Range("D1").Select
End Sub
Или это только часть? Где еще смотреть? Как это можно перенести на реальную таблицу, какие условия нужно соблюсти?
TheBestOfTheBest, Киким образом можно перенести на другую таблицу? Работа с этим файлом построена следующим образом: Изначально получаю таблицу "исходные данные", потом формируют сам "исходные данные 2" таблица соответствия удобнее хранить в отдельном файле, она будет очень редко меняться. форма для печати тоже не меняется заголовок, можно хранить с таблицей соответствия. Удобнее было бы наверно при получение "исходных данных" запустить макрос который и собирает всю информацию в печатную форму. находит нужные столбцы с информацией и выводить печатную форму в соответствии с фамилией.
mrtopgun написал: Киким образом можно перенести на другую таблицу?
см. Данные - Подключения - Свойства - Определения в др файле создать подключение (например, пост 23) и назначить соответствующий запрос (текст команды)... или видоизменить его если нужны др столбцы в др "соотношении" др к др... p.s. если структура начальных данных всегда одинакова (количество столбцов и их названия) - то на вкладке Данные - Обновить... и не нужен макрос - очень удобно p.p.s support.office.com Извлечение внешних данных с помощью Microsoft Query
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Как пожелаете. Сейчас Печатная форма "смотрит" на тот файл, где она находится. Вам ничего не мешает это изменить и даже написать макрос, который это меняет. Я лишь сделал это:
пост#23 по линку выше - это пример параметрического запроса - у вас проще - вопросительный знак ставить не надо для задания параметра для запроса... когда будете его создавать... в свойствах подключения в Определении конструкцию запроса можно менять (вставить из файла TheBest'a, например - если структура данных идентична) - вобщем, изучайте, экспериментируйте - очень облегчает жизнь - Использование Microsoft Query
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Всем привет. С Microsoft Query немного разобрался, но ни как не получается сформировать правильно запрос на выборку строк. Как написать: выдать строки из столбцов 12,13,20,23 листа 1 содержащих в столбце 9 листа 1 часть значения столбца 7 листа 3? часть значения имеется ввиду в столбце 7 указанно фамилия без имени, а в столбце 9 полностью имя и фамилия, нужно чтобы нашёл наиболее совпадающее значения.
- нужно использовать sql-запрос (отдельный язык, отдельная тема, отдельный файл, отражающий, что не получается... и, отдельный запрос в google - путь ведь указан) SQL за 10 минут www.sql.ru/forum
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, Спасибо, все читаю изучаю, но понимание приходит не сразу. Вот такой запрос работает корректно, если значения столбцов полностью совпадаю, а в моем случае в столбце 7 листа 3 есть только фамилия. Понял, что нужно добавить знак %, но ни как не получается и с кавычками и всяко добавлял, помогайте:
select F12, F11, f23, f20, `'3$'`.Получил1 from `'1$'`, `'3$'` WHERE `'1$'`.F9 LIKE `'3$'`.Получил1;
И еще почему-то не работает если из select убрать `'3$'`.Получил1, этот столбец мне для вывода не нужен только для сравнения с `'1$'`.F9
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
с запросом разобрался выдаёт теперь то, что нужно получилось так select F12, F11, f23, f20, `'3$'`.Получил1 from `'1$'`, `'3$'` WHERE `'1$'`.F9 LIKE `'3$'`.Получил1+'%'; подсказали на форуме sql.ru Остается макрос написать который перебирает данные и печатает акты, как обращаться к таблице Microsoft Query из vba?