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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2011, 08:45   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 844
По умолчанию Программно дописать код в книгу.

Я меня сейчас стоит задача модернизировать раннее созданные книги. Нужно вставить дополнительный лист и новые макросы. Пока вижу такой алгоритм действий:
1. Программно открыть книгу.
2. Вставить новый лист под нужным номером. На листе: таблица, кнопки.
3. Дописать в проект VBA новые макросы. Можно или в существующий модуль, или вставить новым модулем.
4. Программно закрыть книгу с сохранением.
Все это в цикле по всем найденым книгам в папке.

Проблема в том, что я не знаю как выполнить пункт 3. Пните меня в правельном направлении, плз.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 24.06.2011, 08:55   #2
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию программное создание макроа

ппппостой пример:
Код:
Sub SAM()
Set tt = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
 tt.CodeModule.InsertLines 1, " Sub MY_MACRO() " & vbCrLf & "  msgbox 123" & vbCrLf & "End Sub"
End Sub
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 24.06.2011, 08:57   #3
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

рабочий код создания меню перехода по листам с созданием процедур:
Код:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim L
Dim S As Object
Dim FI
Dim ТекстПроцедуры
Dim xlmodule As Workbook 'Object
Set xlmodule = ActiveWorkbook

'удаляем все макросы из Лист1  (других макросов сюда не ложить)
On Error Resume Next
For L = xlmodule.VBProject.VBComponents(1).CodeModule.CountOfLines To 1 Step -1
FI = Left(xlmodule.VBProject.VBComponents(1).CodeModule.Lines(L, 1), 17)
 Debug.Print xlmodule.VBProject.VBComponents(1).CodeModule.Lines(L, 1)
If FI = "Public Sub Налист" Then
 xlmodule.VBProject.VBComponents(1).CodeModule.DeleteLines L, 3
 End If
Next L
Application.CommandBars("Worksheet Menu Bar").Controls("Листы").Delete
Set S = Application.CommandBars("Worksheet Menu Bar")
With Application.CommandBars("Worksheet Menu Bar")
'Создание строки меню Файл
        With .Controls.Add(Type:=msoControlPopup)
                .Caption = "&Листы"
                With .Controls
                        For L = 1 To Sheets.Count
ТекстПроцедуры = "Public Sub Налист" & L & "()" & vbCrLf & "Sheets(" & """" & Sheets(L).Name & """" & ").Select" & vbCrLf & "End sub"
  xlmodule.VBProject.VBComponents(1).CodeModule.AddFromString ТекстПроцедуры
                         With .Add(Type:=msoControlButton)
                        .Caption = Sheets(L).Name
                        .OnAction = "ЭтаКнига.Налист" & L
                     End With
                Next L
                End With
        End With
End With
End Sub
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 24.06.2011, 09:54   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
На листе: таблица, кнопки
Эти кнопки, случайно, будут запускать не новые макросы?
Если да - то всё просто: помещаем новые макросы в модуль нового листа,
и просто копируем лист во все файлы (макросы перенесутся вместе с листом)

PS: Вы, я смотрю, мастер по усложнению простых вещей)
Что ни тема - то очередная сложность (сколько пишу макросы, необходимости в таких вещах не встречал, поскольку есть более простые и удобные решения)

Зачем нужно много файлов, в которых будет один и тот же макрос?
Сделайте надстройку, которая будет перехватывать открытие файлов, и добавлять новую функциональность только для нужных файлов.
А все макросы из файлов можно будет удалить.
EducatedFool вне форума Ответить с цитированием
Старый 24.06.2011, 13:55   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 844
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Эти кнопки, случайно, будут запускать не новые макросы?
Если да - то всё просто: помещаем новые макросы в модуль нового листа, и просто копируем лист во все файлы (макросы перенесутся вместе с листом)
Спасибо, очень хорошее решение.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
PS: Вы, я смотрю, мастер по усложнению простых вещей) Что ни тема - то очередная сложность (сколько пишу макросы, необходимости в таких вещах не встречал, поскольку есть более простые и удобные решения)
Что есть, то есть. :))) Как ни странно, в большинстве случаев решения находятся. :)) У меня другая база по программированию. Это в VBA подобные решения "проблемные", скажем в rexx'се они делаются на раз. Очень много проблем у меня как раз из-за того, что приходиться перестраивать годами сформировавшееся мышление под образ мысли VBA, и внутренне я ощущаю отторжение этого образа мысли. Лично мне он кажется ущербным.
Короче, просто у меня в голове столкнулись два направления компьютерной мысли. И мне приходится постоянно вилять, что бы не попасть под раздачу. :)

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Зачем нужно много файлов, в которых будет один и тот же макрос?
Это промежуточное решение, для адаптации беты к новым задачам не заложенных в нее изначально.
У меня так и есть: 99% кода находиться в xla, но 1% невозможно перенести, так как он жестко привязан данным книгам. В новых бетах будет другое решение.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Сделайте надстройку, которая будет перехватывать открытие файлов, и добавлять новую функциональность только для нужных файлов. А все макросы из файлов можно будет удалить.
А можно вставлять модули копированием? Тогда можно было бы еще часть когда убрать в xla, и вставлять его при открытии файла.
Все это последствия того что что мне пришлось изучать VBA на ходу, что привело к большим просчетам в проектирование программы. Если бы я с самого начала обладал теми знаниями что есть сейчас, многие проблемы можно было избежать. "Хорошая мысля приходит опосля" (с)
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 24.06.2011, 14:12   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 844
По умолчанию

Цитата:
Сообщение от alex77755 Посмотреть сообщение
ппппостой пример:
Код:
Sub SAM()
Set tt = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
 tt.CodeModule.InsertLines 1, " Sub MY_MACRO() " & vbCrLf & "  msgbox 123" & vbCrLf & "End Sub"
End Sub
Спасибо. Но утомительно будет таким образом "вбивать" значительный объем кода. ИМХО это крайнее решение.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите дописать код.. CodeExpert Помощь студентам 3 09.11.2009 09:38
Дописать код в файл! Trol-100 Общие вопросы C/C++ 8 24.10.2009 17:49
Помогите в Builder 6 дописать код!!! bee_uk C++ Builder 7 29.05.2009 23:56
Помогите дописать код Черничный Общие вопросы Delphi 2 24.10.2008 00:08
Помогите дописать мои код поиска! AlexII Общие вопросы Delphi 5 17.05.2008 20:07