Есть шаблоны-документы Экесль Акты, Договор и т.п.
На каждый документ свой макрос.
Как можно задать общие переменные (Public) для всех макросов данной книги?
Вот пример макроса договора: [vba]
Код
Sub dogovor() 'Создание договора по данным клиента Dim wb1 As Workbook, wb2 As Workbook, Mwb As Workbook, p$ Set Mwb = ActiveWorkbook p = Mwb.Path Set wb1 = ActiveWorkbook Set wb2 = Workbooks.Open(papka & "\Договор.xlsx")
Есть шаблоны-документы Экесль Акты, Договор и т.п.
На каждый документ свой макрос.
Как можно задать общие переменные (Public) для всех макросов данной книги?
Вот пример макроса договора: [vba]
Код
Sub dogovor() 'Создание договора по данным клиента Dim wb1 As Workbook, wb2 As Workbook, Mwb As Workbook, p$ Set Mwb = ActiveWorkbook p = Mwb.Path Set wb1 = ActiveWorkbook Set wb2 = Workbooks.Open(papka & "\Договор.xlsx")
1. я так понимаю, на создание файла-примера у вас времени нет, поэтому этим должны заняться другие? 2. что значит "эти данные как указать"? у вас вопрос про область видимости переменных... см. файл
1. я так понимаю, на создание файла-примера у вас времени нет, поэтому этим должны заняться другие? 2. что значит "эти данные как указать"? у вас вопрос про область видимости переменных... см. файлKSV
я так понимаю, на создание файла-примера у вас времени нет
Вот пример создания договора и акта. Кроме кодов открытия и сохранения, все остальные коды совпадают. Как их прописать так, чтобы не писать их в каждом макросе?
я так понимаю, на создание файла-примера у вас времени нет
Вот пример создания договора и акта. Кроме кодов открытия и сохранения, все остальные коды совпадают. Как их прописать так, чтобы не писать их в каждом макросе?den45444
Что значит коды? Вы имеете ввиду процедуры, или константы? Если константы - то замените [vba]
Код
Private Const на Public Const
[/vba] Тогда они будут видны во всех модулях книги. - это то что предложил KSV не видя Ваш пример А процедуры и так можно вызывать из другого модуля - используйте : [vba]
Что значит коды? Вы имеете ввиду процедуры, или константы? Если константы - то замените [vba]
Код
Private Const на Public Const
[/vba] Тогда они будут видны во всех модулях книги. - это то что предложил KSV не видя Ваш пример А процедуры и так можно вызывать из другого модуля - используйте : [vba]
Кажется понял, что требуется автору - процедура с параметрами. В неё надо передать изменяемые данные, а их уже обрабатывать внутри.
Нужно один раз задать данные для всех шаблонов и когда будут нужны выдергивать их. Например, вот эти общие данные из которых нужно часто вставлять в процедуры: [vba]
Кажется понял, что требуется автору - процедура с параметрами. В неё надо передать изменяемые данные, а их уже обрабатывать внутри.
Нужно один раз задать данные для всех шаблонов и когда будут нужны выдергивать их. Например, вот эти общие данные из которых нужно часто вставлять в процедуры: [vba]
den45444, чем больше "разъяснений" вы пишите, тем больше запутываете! лучше просто напишите, чем конкретно вас не устраивает такой код? [vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ" Private Const rekvName As String = "Реквизиты"
Sub dogovor() 'Создание договора по данным клиента CreateDoc "Договор" End Sub
Sub akt() 'Создание АКТА по данным клиента CreateDoc "Акт" End Sub
Private Sub CreateDoc(FileName As String) If Dir(papka, 16) = "" Then MsgBox "Переместите папку <ШАБЛОНЫ> : Компьютер - Локальный диск(C)", vbCritical, "Ошибка": Exit Sub Dim wb1 As Workbook, wb2 As Workbook, p$ Set wb1 = ActiveWorkbook p = wb1.Path Set wb2 = Workbooks.Open(papka & "\" & FileName & ".xlsx")
With wb1.Sheets(rekvName) fio = .Range("B3") pasport = .Range("B4") vydan = .Range("B5") dvyd = .Range("B6") adr = .Range("B7") emai = .Range("B8") tel = .Range("B9") pod = .Range("B10") obj = .Range("B11") dog = .Range("B12") ddog = .Range("B13") End With
den45444, чем больше "разъяснений" вы пишите, тем больше запутываете! лучше просто напишите, чем конкретно вас не устраивает такой код? [vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ" Private Const rekvName As String = "Реквизиты"
Sub dogovor() 'Создание договора по данным клиента CreateDoc "Договор" End Sub
Sub akt() 'Создание АКТА по данным клиента CreateDoc "Акт" End Sub
Private Sub CreateDoc(FileName As String) If Dir(papka, 16) = "" Then MsgBox "Переместите папку <ШАБЛОНЫ> : Компьютер - Локальный диск(C)", vbCritical, "Ошибка": Exit Sub Dim wb1 As Workbook, wb2 As Workbook, p$ Set wb1 = ActiveWorkbook p = wb1.Path Set wb2 = Workbooks.Open(papka & "\" & FileName & ".xlsx")
With wb1.Sheets(rekvName) fio = .Range("B3") pasport = .Range("B4") vydan = .Range("B5") dvyd = .Range("B6") adr = .Range("B7") emai = .Range("B8") tel = .Range("B9") pod = .Range("B10") obj = .Range("B11") dog = .Range("B12") ddog = .Range("B13") End With
лучше просто напишите, чем конкретно вас не устраивает такой код?
Этот код устраивает, но есть но...
Кроме замены текста еще нужно много действий произвести в макросе (открыть еще одну книгу, скопировать с одной книги на другую и т.п.). Соот-но данный код тяжело использовать в моем случае.
Хотя можно данный код разделить по частям и использовать части там где нужно вставить.
лучше просто напишите, чем конкретно вас не устраивает такой код?
Этот код устраивает, но есть но...
Кроме замены текста еще нужно много действий произвести в макросе (открыть еще одну книгу, скопировать с одной книги на другую и т.п.). Соот-но данный код тяжело использовать в моем случае.
Хотя можно данный код разделить по частям и использовать части там где нужно вставить.den45444
Private Sub CreateDoc(FileName As String) If Dir(papka, 16) = "" Then MsgBox "Переместите папку <ШАБЛОНЫ> : Компьютер - Локальный диск(C)", vbCritical, "Ошибка": Exit Sub End Sub
[/vba] [vba]
Код
Private Sub CreateDoc1(FileName As String) fio = wb1.Sheets(rekvName).Range("B3") End Sub
[/vba]
и т.п.
KSV,
А если разделить вот на такие части?
[vba]
Код
Private Sub CreateDoc(FileName As String) If Dir(papka, 16) = "" Then MsgBox "Переместите папку <ШАБЛОНЫ> : Компьютер - Локальный диск(C)", vbCritical, "Ошибка": Exit Sub End Sub
[/vba] [vba]
Код
Private Sub CreateDoc1(FileName As String) fio = wb1.Sheets(rekvName).Range("B3") End Sub
и что вам дадут эти "части"? я вам переделал потому, что обе ваши процедуры полностью дублировали друг друга, а чего вы хотите добиться такой разбивкой на части?
[p.s.]если я правильно понял, то вы хотите один раз считать в переменные все сведения о клиенте, а потом в нескольких процедурах использовать эти переменные? тогда можно так:
[vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ" Private Const rekvName As String = "Реквизиты"
' если эти переменные планируется использовать только в этом модуле, то достаточно так: 'Dim fio, pasport, vydan, dvyd, adr, emai, tel, pod, obj, dog, ddog
' а если эти переменные будут использоваться в других модулях, то нужно так: Public fio, pasport, vydan, dvyd, adr, emai, tel, pod, obj, dog, ddog
Private Sub GetData() With ActiveWorkbook.Sheets(rekvName) fio = .Range("B3") pasport = .Range("B4") vydan = .Range("B5") dvyd = .Range("B6") adr = .Range("B7") emai = .Range("B8") tel = .Range("B9") pod = .Range("B10") obj = .Range("B11") dog = .Range("B12") ddog = .Range("B13") End With End Sub
Sub dogovor() 'Создание договора по данным клиента CreateDoc "Договор" End Sub
Sub akt() 'Создание АКТА по данным клиента CreateDoc "Акт" End Sub
Private Sub CreateDoc(FileName As String) If Dir(papka, 16) = "" Then MsgBox "Переместите папку <ШАБЛОНЫ> : Компьютер - Локальный диск(C)", vbCritical, "Ошибка": Exit Sub Dim wb1 As Workbook, wb2 As Workbook, p$ Set wb1 = ActiveWorkbook p = wb1.Path Set wb2 = Workbooks.Open(papka & "\" & FileName & ".xlsx") With wb2.Worksheets(1).Cells .Replace "{ФИО}", fio, xlPart .Replace "{Паспорт}", pasport, xlPart .Replace "{Выдан}", vydan, xlPart .Replace "{Дата выдачи}", dvyd, xlPart .Replace "{Адрес регистрации}", adr, xlPart .Replace "{E-mail}", emai, xlPart .Replace "{Телефон}", tel, xlPart .Replace "{Подпись}", pod, xlPart .Replace "{Адрес объекта}", obj, xlPart .Replace "{Номер договора}", dog, xlPart .Replace "{Дата договора}", ddog, xlPart End With wb2.SaveAs (p & "\" & FileName & "(" & dog & ").xlsx") End Sub
[/vba]
один раз (в первой запущенной процедуре) вызываете GetData, а потом в других своих процедурах просто считываете все сведения из переменных[/p.s.]
и что вам дадут эти "части"? я вам переделал потому, что обе ваши процедуры полностью дублировали друг друга, а чего вы хотите добиться такой разбивкой на части?
[p.s.]если я правильно понял, то вы хотите один раз считать в переменные все сведения о клиенте, а потом в нескольких процедурах использовать эти переменные? тогда можно так:
[vba]
Код
Private Const papka As String = "C:\ШАБЛОНЫ" Private Const rekvName As String = "Реквизиты"
' если эти переменные планируется использовать только в этом модуле, то достаточно так: 'Dim fio, pasport, vydan, dvyd, adr, emai, tel, pod, obj, dog, ddog
' а если эти переменные будут использоваться в других модулях, то нужно так: Public fio, pasport, vydan, dvyd, adr, emai, tel, pod, obj, dog, ddog
Private Sub GetData() With ActiveWorkbook.Sheets(rekvName) fio = .Range("B3") pasport = .Range("B4") vydan = .Range("B5") dvyd = .Range("B6") adr = .Range("B7") emai = .Range("B8") tel = .Range("B9") pod = .Range("B10") obj = .Range("B11") dog = .Range("B12") ddog = .Range("B13") End With End Sub
Sub dogovor() 'Создание договора по данным клиента CreateDoc "Договор" End Sub
Sub akt() 'Создание АКТА по данным клиента CreateDoc "Акт" End Sub
Private Sub CreateDoc(FileName As String) If Dir(papka, 16) = "" Then MsgBox "Переместите папку <ШАБЛОНЫ> : Компьютер - Локальный диск(C)", vbCritical, "Ошибка": Exit Sub Dim wb1 As Workbook, wb2 As Workbook, p$ Set wb1 = ActiveWorkbook p = wb1.Path Set wb2 = Workbooks.Open(papka & "\" & FileName & ".xlsx") With wb2.Worksheets(1).Cells .Replace "{ФИО}", fio, xlPart .Replace "{Паспорт}", pasport, xlPart .Replace "{Выдан}", vydan, xlPart .Replace "{Дата выдачи}", dvyd, xlPart .Replace "{Адрес регистрации}", adr, xlPart .Replace "{E-mail}", emai, xlPart .Replace "{Телефон}", tel, xlPart .Replace "{Подпись}", pod, xlPart .Replace "{Адрес объекта}", obj, xlPart .Replace "{Номер договора}", dog, xlPart .Replace "{Дата договора}", ddog, xlPart End With wb2.SaveAs (p & "\" & FileName & "(" & dog & ").xlsx") End Sub
[/vba]
один раз (в первой запущенной процедуре) вызываете GetData, а потом в других своих процедурах просто считываете все сведения из переменных[/p.s.]KSV
А как указать один раз для всех макросов данного модуля вот этот код:?
Это проверка существования papka если в других процедурах она также нужна - просто добавьте эту строку в другие процедуры, но, насколько я понимаю, она там и не нужна.
А как указать один раз для всех макросов данного модуля вот этот код:?
Это проверка существования papka если в других процедурах она также нужна - просто добавьте эту строку в другие процедуры, но, насколько я понимаю, она там и не нужна.SLAVICK