Есть две книги ( книга 1 и книга 2). В каждой из книг есть по макросу. В книге 1 запускается макрос 1, который открывает книгу 2 и запускает макрос 2 (книги2). Как передать данные которые загрузил макрос 2, а именно массив m_ul.
Книга 1 с макросом [vba]
Код
Public m_ul(500, 300) As String
Sub Start() p$ = Workbooks(Book1.xls").Path + "\Data\" Workbooks.Open p$ + "Book2.xls", ReadOnly Application.Run "Book2.xls!Module.Start(m_ul)" End Sub
[/vba]
Книга 2 с макрос [vba]
Код
Public m_ul(500, 300) As String
Sub Start(m_ul() As String) Dim Msg, Style, Title As String Msg = "Çàâàíòàæèòè äàí³ ïî Î.Ð.?" Style = vbYesNo + vbInformation + vbDefaultButton2 Title = "Çàâàíòàæåííÿ áàçè Î.Ð." Response = MsgBox(Msg, Style, Title) Check = False If Response = vbYes Then On Error GoTo Label1 p$ = Workbooks("Book1.xls").Path + "\Data\" Workbooks.Open p$ + "BASA.xls", ReadOnly Load UserForm1 UserForm1.Show Workbooks("BASA.xls").Close SaveChanges:=False Workbooks("Book2.xls").Close SaveChanges:=False Workbooks("Book1.xls").Activate Check = True End If Exit Sub Label1: Msg = "Ôàéë äëÿ çàâàíòàæåííÿ íå â³äêðèâàºòüñÿ!" Msg1 = "Ïðîãðàììà çàâàíòàæåííÿ Î.Ð. áóäå çàêðèòà! " Style = vbOKOnly + vbCritical + vbDefaultButton2 Title = "Ïîìèëêà" Response = MsgBox(Msg + Chr(13) + Msg1, Style, Title) End Sub
'UserForm1
Private Sub UserForm_Activate() Dim col_strok, col_kv, j As Integer Dim n As Integer Dim s, t111 As String Dim ch As Boolean
For n = 1 To col_strok pos = InStr(1, R_Adr(n), " êâ.") s = Mid(R_Adr(n), 5, pos - 4) ch_street = False For i = 1 To col_street If s = m_ul(i, 0) Then ch_street = True Exit For End If Next i If ch_street = False Then m_ul(col_street, 0) = s m_ul(0, 0) = col_street col_street = col_street + 1 End If DoEvents Call toolbar_1(CLng(n), CLng(col_strok)) Next n 'Çàãðóçêà êâàðòèð Frame2.Visible = True For n = 1 To col_strok pos = InStr(1, R_Adr(n), " êâ.") s = Mid(R_Adr(n), 5, pos - 4) 'Range(Cells(n, 1), Cells(n, 1)).Show For i = 1 To col_street col_kv = 1 Do While s = m_ul(i, 0) If m_ul(i, col_kv + 1) = "" Then m_ul(i, col_kv + 1) = Str(n) m_ul(i, 1) = col_kv Exit For Else col_kv = col_kv + 1 End If Loop Next i DoEvents Call toolbar_2(CLng(n), CLng(col_strok)) Next n
Есть две книги ( книга 1 и книга 2). В каждой из книг есть по макросу. В книге 1 запускается макрос 1, который открывает книгу 2 и запускает макрос 2 (книги2). Как передать данные которые загрузил макрос 2, а именно массив m_ul.
Книга 1 с макросом [vba]
Код
Public m_ul(500, 300) As String
Sub Start() p$ = Workbooks(Book1.xls").Path + "\Data\" Workbooks.Open p$ + "Book2.xls", ReadOnly Application.Run "Book2.xls!Module.Start(m_ul)" End Sub
[/vba]
Книга 2 с макрос [vba]
Код
Public m_ul(500, 300) As String
Sub Start(m_ul() As String) Dim Msg, Style, Title As String Msg = "Çàâàíòàæèòè äàí³ ïî Î.Ð.?" Style = vbYesNo + vbInformation + vbDefaultButton2 Title = "Çàâàíòàæåííÿ áàçè Î.Ð." Response = MsgBox(Msg, Style, Title) Check = False If Response = vbYes Then On Error GoTo Label1 p$ = Workbooks("Book1.xls").Path + "\Data\" Workbooks.Open p$ + "BASA.xls", ReadOnly Load UserForm1 UserForm1.Show Workbooks("BASA.xls").Close SaveChanges:=False Workbooks("Book2.xls").Close SaveChanges:=False Workbooks("Book1.xls").Activate Check = True End If Exit Sub Label1: Msg = "Ôàéë äëÿ çàâàíòàæåííÿ íå â³äêðèâàºòüñÿ!" Msg1 = "Ïðîãðàììà çàâàíòàæåííÿ Î.Ð. áóäå çàêðèòà! " Style = vbOKOnly + vbCritical + vbDefaultButton2 Title = "Ïîìèëêà" Response = MsgBox(Msg + Chr(13) + Msg1, Style, Title) End Sub
'UserForm1
Private Sub UserForm_Activate() Dim col_strok, col_kv, j As Integer Dim n As Integer Dim s, t111 As String Dim ch As Boolean
For n = 1 To col_strok pos = InStr(1, R_Adr(n), " êâ.") s = Mid(R_Adr(n), 5, pos - 4) ch_street = False For i = 1 To col_street If s = m_ul(i, 0) Then ch_street = True Exit For End If Next i If ch_street = False Then m_ul(col_street, 0) = s m_ul(0, 0) = col_street col_street = col_street + 1 End If DoEvents Call toolbar_1(CLng(n), CLng(col_strok)) Next n 'Çàãðóçêà êâàðòèð Frame2.Visible = True For n = 1 To col_strok pos = InStr(1, R_Adr(n), " êâ.") s = Mid(R_Adr(n), 5, pos - 4) 'Range(Cells(n, 1), Cells(n, 1)).Show For i = 1 To col_street col_kv = 1 Do While s = m_ul(i, 0) If m_ul(i, col_kv + 1) = "" Then m_ul(i, col_kv + 1) = Str(n) m_ul(i, 1) = col_kv Exit For Else col_kv = col_kv + 1 End If Loop Next i DoEvents Call toolbar_2(CLng(n), CLng(col_strok)) Next n
Нужно прекратить одевать штаны через голову, и написать нормальный макрос, который открывает книгу2, и проделывает все то, что прописано в макросе из этой книги. А существующий макрос либо удалить, либо игнорировать.
Нужно прекратить одевать штаны через голову, и написать нормальный макрос, который открывает книгу2, и проделывает все то, что прописано в макросе из этой книги. А существующий макрос либо удалить, либо игнорировать.RAN
Нужно прекратить одевать штаны через голову, и написать нормальный макрос, который открывает книгу2, и проделывает все то, что прописано в макросе из этой книги. А существующий макрос либо удалить, либо игнорировать.
Если Вам не трудно подскажите что я не правильно делаю. Я не правильно открываю книгу2?
Нужно прекратить одевать штаны через голову, и написать нормальный макрос, который открывает книгу2, и проделывает все то, что прописано в макросе из этой книги. А существующий макрос либо удалить, либо игнорировать.
Если Вам не трудно подскажите что я не правильно делаю. Я не правильно открываю книгу2?MisterYu
Сообщение отредактировал MisterYu - Вторник, 29.08.2017, 10:29
Давайте я немного перефразирую слова Андрея Вам нужно в книге1 написать макрос, который вместо отсылки к макросу из Книги2 [vba]
Код
Application.Run "Book2.xls!Module.Start(m_ul)"
[/vba] будет сам делать с этой Книгой2 все то, что делает с ней макрос "Start". Другими словами, в Книге2 вообще нет макросов (или есть, но мы их не используем), а в Книге1 один (или несколько), отвечающих за всё
Правда, у Вас там еще и юзерформа, и открывается еще книга "BASA.xls", и ...
Ну тогда можно загрузить полученный в Книге2 массив на скрытый (или только что созданный) лист Книги1 (или Книги2), забрать его оттуда макросом, который в книге1 и потом лист удалить (или данные стереть) Можно записать Ваш массив в текстовую переменную, ее записать во что-то, что не стирается - в реестр, свойство объекта Excel или еще куда (но еще нужно посмотреть, как проглотит длинную строку) Проще всего писать на лист и потом брать оттуда
Давайте я немного перефразирую слова Андрея Вам нужно в книге1 написать макрос, который вместо отсылки к макросу из Книги2 [vba]
Код
Application.Run "Book2.xls!Module.Start(m_ul)"
[/vba] будет сам делать с этой Книгой2 все то, что делает с ней макрос "Start". Другими словами, в Книге2 вообще нет макросов (или есть, но мы их не используем), а в Книге1 один (или несколько), отвечающих за всё
Правда, у Вас там еще и юзерформа, и открывается еще книга "BASA.xls", и ...
Ну тогда можно загрузить полученный в Книге2 массив на скрытый (или только что созданный) лист Книги1 (или Книги2), забрать его оттуда макросом, который в книге1 и потом лист удалить (или данные стереть) Можно записать Ваш массив в текстовую переменную, ее записать во что-то, что не стирается - в реестр, свойство объекта Excel или еще куда (но еще нужно посмотреть, как проглотит длинную строку) Проще всего писать на лист и потом брать оттуда_Boroda_
Не, ну можно попробовать передать массив "для заполнения" по ссылке из первой книги, изменив вызов: [vba]
Код
Application.Run "Book2.xls!Module.Start", m_ul
[/vba]Но тогда надо убедиться, чтобы в Book2 переменная передалась по ссылке (причем имя параметра в Start надо изменить на другое), плюс перед Unload form копировать содержимое "местного" m_ul во "внешний-ссылочный" (перед Load form данные внешнего массива в местный загружать не надо - он все равно очищается).
Но учитывая, что у вас там в Book2 юзерформа не только активно работает ещё с какими-то файлами, но и с интерфейсом - это все надо проверять.
Не, ну можно попробовать передать массив "для заполнения" по ссылке из первой книги, изменив вызов: [vba]
Код
Application.Run "Book2.xls!Module.Start", m_ul
[/vba]Но тогда надо убедиться, чтобы в Book2 переменная передалась по ссылке (причем имя параметра в Start надо изменить на другое), плюс перед Unload form копировать содержимое "местного" m_ul во "внешний-ссылочный" (перед Load form данные внешнего массива в местный загружать не надо - он все равно очищается).
Но учитывая, что у вас там в Book2 юзерформа не только активно работает ещё с какими-то файлами, но и с интерфейсом - это все надо проверять.AndreTM
Ну тогда можно загрузить полученный в Книге2 массив на скрытый (или только что созданный) лист Книги1 (или Книги2), забрать его оттуда макросом, который в книге1 и потом лист удалить (или данные стереть)
Наверное такой способ и реализую. Спасибо за подсказку.
Ну тогда можно загрузить полученный в Книге2 массив на скрытый (или только что созданный) лист Книги1 (или Книги2), забрать его оттуда макросом, который в книге1 и потом лист удалить (или данные стереть)
Наверное такой способ и реализую. Спасибо за подсказку.MisterYu
[/vba] делает слово ReadOnly? Если бы я поставил первой строкой в модуле Option Explicit и попытался выполнить это, ВБА тут же сказал бы мне что я поц Почитайте справку по Workbooks.Open Method.
А мне интересно, что в строке: [vba]
Код
Workbooks.Open p$ + "Book2.xls", ReadOnly
[/vba] делает слово ReadOnly? Если бы я поставил первой строкой в модуле Option Explicit и попытался выполнить это, ВБА тут же сказал бы мне что я поц Почитайте справку по Workbooks.Open Method. KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Кстати, что интересно - если использовать эту команду именно в таком виде - то ошибок-то и не получим. Понятное дело, что никакого "открыть файл только для чтения" не будет, но: интерпретация имени переменной "ReadOnly", если она до этого ещё не получила значение, применительно ко второму параметру метода .Wiorkbooks.Open - будет произведена как "Vаriant, 0", что, опять же, применительно к месту параметра в методе - будет рассмотрено как UpdateLinks:=0, т.е. "не обновлять внешние ссылки при открытии файла".
Вот так и возникают те самые непонятные проблемы, что решают консилиумом и неделями, а ведь там человек всего лишь подставил (вроде правильно) True в третий параметр .Open'а
А если бы не поставил?
Кстати, что интересно - если использовать эту команду именно в таком виде - то ошибок-то и не получим. Понятное дело, что никакого "открыть файл только для чтения" не будет, но: интерпретация имени переменной "ReadOnly", если она до этого ещё не получила значение, применительно ко второму параметру метода .Wiorkbooks.Open - будет произведена как "Vаriant, 0", что, опять же, применительно к месту параметра в методе - будет рассмотрено как UpdateLinks:=0, т.е. "не обновлять внешние ссылки при открытии файла".
Вот так и возникают те самые непонятные проблемы, что решают консилиумом и неделями, а ведь там человек всего лишь подставил (вроде правильно) True в третий параметр .Open'а AndreTM
Добавлю. В Юзер форме просто реализован статус загрузки данных с файла BASA.xls в массив m_ul. Вот как бы хотелось передать этот массив в книгу 1 макроса 1.
Вообще хотел сохранить в book2 все макросы. И вызывать их с book1.
Добавлю. В Юзер форме просто реализован статус загрузки данных с файла BASA.xls в массив m_ul. Вот как бы хотелось передать этот массив в книгу 1 макроса 1.
Вообще хотел сохранить в book2 все макросы. И вызывать их с book1.MisterYu
Сообщение отредактировал MisterYu - Вторник, 29.08.2017, 16:15
говорит нам о том, что вы не программируете. И это не "у вас получилось", а "вы думаете, что вроде так должно быть". Поскольку вы ещё и не демонстрируете сам исходный код, функционирующий, со всеми связанными с ним файлами, хотя бы в виде примеров (а только некий текст, который никак может быть не связан с той проблемой, что вы держите у себя в голове), то решить вашу "проблему" прочти невозможно
говорит нам о том, что вы не программируете. И это не "у вас получилось", а "вы думаете, что вроде так должно быть". Поскольку вы ещё и не демонстрируете сам исходный код, функционирующий, со всеми связанными с ним файлами, хотя бы в виде примеров (а только некий текст, который никак может быть не связан с той проблемой, что вы держите у себя в голове), то решить вашу "проблему" прочти невозможно AndreTM
Я может и не программист как вы, но я пытаюсь научится. Возможно я что то не понимаю и не знаю. Если у Вас есть какой то источник где я могу взять информацию для реализации данной задачи, Я буду Вам благодарен.
Я может и не программист как вы, но я пытаюсь научится. Возможно я что то не понимаю и не знаю. Если у Вас есть какой то источник где я могу взять информацию для реализации данной задачи, Я буду Вам благодарен.
Вы там показали только код основной функции и код функций только одной юзерформы. А само описание юзерформы, и её объектов - мы где возьмем? Кроме того, ваша функция и форма - вызывает другие процедуры/функции, а также другие файлы, и всё это влияет на функционал формы. А мы их не видим.
Вы там показали только код основной функции и код функций только одной юзерформы. А само описание юзерформы, и её объектов - мы где возьмем? Кроме того, ваша функция и форма - вызывает другие процедуры/функции, а также другие файлы, и всё это влияет на функционал формы. А мы их не видим.AndreTM
Кроме того, ваша функция и форма - вызывает другие процедуры/функции, а также другие файлы, и всё это влияет на функционал формы. А мы их не видим.
Процедура сортировки данных массива. [vba]
Код
Call BubbleSort
[/vba]
Функция считывания данных с ячейки [vba]
Код
Function R_Adr(i As Integer) As String If Range(Cells(i, 3), Cells(i, 3)).Value <> " " Then R_Adr = Range(Cells(i, 3), Cells(i, 3)).Text End If End Function
Кроме того, ваша функция и форма - вызывает другие процедуры/функции, а также другие файлы, и всё это влияет на функционал формы. А мы их не видим.
Процедура сортировки данных массива. [vba]
Код
Call BubbleSort
[/vba]
Функция считывания данных с ячейки [vba]
Код
Function R_Adr(i As Integer) As String If Range(Cells(i, 3), Cells(i, 3)).Value <> " " Then R_Adr = Range(Cells(i, 3), Cells(i, 3)).Text End If End Function