Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > [Перенесено из VB6/MS Access]Обновление сметы


Автор: Alex24 25.1.2012, 17:15
Подскажите пожалуйста. Есть общая таблица, 8 листов (по типу материала) и до 200 наименований  материала в каждом листе. Макрос делает выборку и сохраняет результат в заранее подготовленный шаблон (считает смету на конкретный заказ). По прошествии времени есть необходимость все наименования из сгенерированной таблицы-сметы отыскать в общей, и обновить цены если они изменились. Поясните как это сделать, с VBA знаком по CorelDraw потому испытываю серьезные трудности. Большое спасибо!

Автор: Akina 25.1.2012, 17:33
В шаблон надо класть не значения, а ссылки на их расположение в прайсе.

Автор: irinazanuda 26.1.2012, 12:34
Ссылки не хотелось бы... По-другому никак нельзя??? Подобная проблема и у меня есть

Автор: Akina 26.1.2012, 12:41
Цитата(irinazanuda @  26.1.2012,  13:34 Найти цитируемый пост)
Ссылки не хотелось бы... 

Обоснуйте. Вменяемо.

Цитата(irinazanuda @  26.1.2012,  13:34 Найти цитируемый пост)
По-другому никак нельзя??? 

Да пжалста... удалите имеющееся и перегенерите тем же скриптом новую версию с использованием новых данных.

Автор: irinazanuda 26.1.2012, 12:51
Цитата(Akina @  26.1.2012,  12:41 Найти цитируемый пост)
удалите имеющееся и перегенерите тем же скриптом новую версию с использованием новых данных. 

вот этим и занимаюсь каждую ночь..


Цитата(Akina @  26.1.2012,  12:41 Найти цитируемый пост)
Обоснуйте. Вменяемо.

Если вменяемо... или это кому?!... Понятно--- ну, "не могу я без базару"... есть коммерческая тайна какбе... ладно пусть мальчик пробует-- я посмотрю

Автор: Данкинг 26.1.2012, 13:15
Тогда просто проходить циклом по смете и искать соответствующий товар в основной таблице.

Автор: Akina 26.1.2012, 13:58
Цитата(irinazanuda @  26.1.2012,  13:51 Найти цитируемый пост)
вот этим и занимаюсь каждую ночь..

Не, вот какая тебе разница - запускать скрипт перегенерации или запускать скрипт обновления, а? Более того - если какой-то идиот юзер внесёт в файл изменения, скрипт обновления может офигеть - а скрипт перегенерации отработает вне зависимости от деятельности прямоходящих.

Цитата(irinazanuda @  26.1.2012,  13:51 Найти цитируемый пост)
Если вменяемо... или это кому?!... 

Тебе, тебе... ссылки - самое оно... не, не хочешь, не обновляй ссылки - при открытии документа Эксель будет запрашивать обновление, от которого можно отказаться, если нужны старые данные.

Автор: Alex24 26.1.2012, 17:10
Дело в том что макрос писал не я, с VBA знаком частично (несложные макросы для CorelDraw). Если не трудно выложите следующий код (как я это вижу):

Открытие таблицы прайс
Открытие таблицы сметы
Организация цикла нахождения всех элементов сметы (выбранные наименования) в таблице прайс в каждой из категория (8 листов по типу материала)
Сравнение цены, внесение изменений 

Заранее огромное спасибо всем кто откликнется.

Автор: Akina 26.1.2012, 17:45
Цитата(Alex24 @  26.1.2012,  18:10 Найти цитируемый пост)
макрос писал не я, с VBA знаком частично 

Такие работы не делаются дилетантами на коленке, тем более в серьёзных фирмах и для серьёзной работы. Их заказывают. И оплачивают, соответственно. 
Обращайтесь во http://vingrad.ru/.

Автор: Alex24 2.2.2012, 17:01
Не хотелось бы грубить Akina, тем более модератору, ну раз не хочется то и не буду. Все что вы написали я и сам понимаю. Но я не делитант, я раньше программировал но на другом языке. Собственно задачу поставленную я выполнил покопавшись 2 дня в хелпе. Однако остался вопрос удобства и мой вопрос следующий. Я использовал:

Set orderbook = Workbooks.Open ("заранее мне известный путь")  'для выборки (собственно сметы)
И тоже самое для таблицы материалов из которой макрос выборки и запускался.

Теперь задача стоит в готовый макрос добавить кнопочку "Обновить" которая вызывает диалоговое окно, пользователь выбирает залежавшуюся смету и она пересчитается с учетом текущих цен.

Простой вопрос как мне при запуске макроса присвоить переменой скажем pricebook книгу из которой он запустился, так что бы переменная была доступна во всем модуле. И тоже самое для orderbook что бы она приняла таблицу которую откроет пользователь. Изменяюсь что так все заумно расписал, но практики давно не было. Заранее спасибо.

Автор: Akina 2.2.2012, 17:12
Цитата(Alex24 @  2.2.2012,  18:01 Найти цитируемый пост)
как мне при запуске макроса присвоить переменой скажем pricebook книгу из которой он запустился, так что бы переменная была доступна во всем модуле. 

1) Объявить переменную на уровне модуля
Код

Dim pricebook As EXCEL.Workbook

2) Выполнить в процедуре/функции присвоение в переменную ссылки на текущую книгу
Код

Set pricebook = ThisWorkBook

3) Не забыть почистить ссылку по завершении обработки
Код

Set pricebook = Nothing


Цитата(Alex24 @  2.2.2012,  18:01 Найти цитируемый пост)
тоже самое для orderbook что бы она приняла таблицу которую откроет пользователь.

Только не таблицу, а лист. У Экселя нет таблиц.
1) Объявить переменную на уровне модуля
Код

Dim orderbook As EXCEL.Worksheet

2) Выполнить в процедуре/функции присвоение в переменную ссылки на текущую книгу
Код

Set orderbook = Activesheet

3) Не забыть почистить ссылку по завершении обработки
Код

Set orderbook = Nothing


PS. У меня создаётся стойкое ощущение, что ведётся программирование не на Visual Basic версии 6, а на встроенном офисном Visual Basic for Applications. Если так - Вы жестоко ошиблись веткой форума - эти языки хоть и называются похоже, и имеют сходный синтаксис, но различаются так же (если не больше), как, например, С и С++...


Автор: Alex24 2.2.2012, 17:21
Действительно вы правы Akina, только что это заметил, Visual Basic for Applications. Насколько это меняет то что вы написали?
Собственно еще раз попытаюсь объяснить, что ранее использовал Set orderbook = Workbooks.Open ("заранее мне известный путь") теперь мне нужна та же переменная, но для файла открытого через диалоговое окно пользователем (как сделать тоже присвоение но для выбраного пользователем файла) и тоже самое но для файла из которого запустился макрос. Далее обе переменные используются в процедуре обновления сметы с операторами With, поиском через .Find и т.д.

Автор: Akina 2.2.2012, 21:26
Цитата(Alex24 @  2.2.2012,  18:21 Найти цитируемый пост)
Насколько это меняет то что вы написали?

Ну я изначально предполагал... потому ошмётки кода намекают на объектную модель Экселя.

Давайте-ка мы поедем туда где тепло...

Добавлено через 1 минуту и 26 секунд
Модератор: Тема перенесена.

Автор: LOPUH 3.2.2012, 07:55
Alex24,   наиболее удобно вам, на мой взгляд, использовать семейство встроенных  окон Dialogs.    Тип диалога, позволяющий выбрать файл, будет msoFileDialogFilePicker. Вот хороший пример его использования из  интернетов  smile 
Код

Sub Main()

    'Объявление переменной как объекта FileDialog.
    Dim fd As FileDialog

    'Создание объекта FileDialog как диалогового окна типа File Picker.
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    'Объявление переменной для хранения пути к каждому выбранному элементу.
    'Несмотря на то что путь представляет собой строковую переменную (String),
    'данная переменная должна являться объектом типа Variant, поскольку процедура
    'цикла For Each...Next работает только с объектами Variant и Object.
    Dim vrtSelectedItem As Variant

    'Использование блока With...End With для создания ссылки на объект FileDialog.
    With fd

        'Использование метода Show для вывода диалогового окна типа File Picker.
        'Пользователь нажал кнопку подтверждения действия.
        If .Show = -1 Then

            'Перебор элементов из коллекции FileDialogSelectedItems.
            For Each vrtSelectedItem In .SelectedItems

                'vrtSelectedItem содержит путь к каждому выбранному элементу.
                'Здесь можно использовать любые нужные функции ввода/вывода по отношению к полученному пути.
                'В данном примере путь просто отображается в окне сообщения.
                MsgBox "Путь: " & vrtSelectedItem

            Next vrtSelectedItem
        'Пользователь нажал кнопку отмены действия.
        Else
        End If
    End With

    'Очистка значения переменной-ссылки.
    Set fd = Nothing

End Sub

Автор: Alex24 3.2.2012, 16:34
LOPUH Большое спасибо. Тему можно закрыть во всем разобрался сам.

Автор: Alex24 9.2.2012, 16:52
Подскажите пожалуйста, как при вызове диалога SaveAs к имени файла прибавить дату?

Автор: LOPUH 12.2.2012, 07:20
Вообще то здесь принято для каждого вопроса создавать новую тему. По вопросу-мне кажется, в вашем случае  лучше создать пользовательское диалоговое окно, а не пользоваться стандартными. так как что то добавить во встроенное будет достаточно проблематично.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)