Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/32: Рейтинг темы: голосов - 32, средняя оценка - 4.66
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17

Использование макроса(Процедуры) в другой книге

01.11.2013, 11:34. Показов 6555. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется 2 книги Excel. Необходимо передать данные из одной книги в другую с помощью макроса VBA. Данные в виде таблицы(массива). Вся процедура проходит так:
1 книга с помощью кнопки передает номер необходимого месяца во 2 книгу, а вторая книга после необходимых вычислений(поиска записей по месяцу) передает обратно 1 книге данные в виде таблицы(массива)
Подскажите как можно организовать данное действие?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2013, 11:34
Ответы с готовыми решениями:

Применение макроса (процедуры) к активной книге, которая открыта в данный момент
Помогите пожайлуста, очень нужен код, который осуществляет применение макроса(процедуры) к активной книге, которая открыта в данный момент.

Использование имени процедуры в качестве параметра другой процедуры
Help! Для массива С из n элементов составить процедуру, которая находит значения m наименьших его элементов (Z1, Z2,...,Zn, а также сумму...

Использование имени процедуры в качестве параметра другой процедуры
Составить программу по заданному условию. Первая часть условия является заданием на разработку процедур для любой функции f1, f2. Условие...

20
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
01.11.2013, 12:08
With sheets("A")
........................
with sheets("B")
........................
end with
end with
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 13:06  [ТС]
И для чего это использовать? Это же работа с листами, а в моем случае используется 2 разных книги(файла)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
01.11.2013, 13:53
Я думал, будет понятно. Тогда так.
Visual Basic
1
2
3
4
5
6
with workbook("A").sheets("aa")
   ......................
      with workbook("B").sheets("bb")
         ........................
      end with
end with
А самих "аксусуаров" для этого может быть очень много варианов. Много зависит открытая книга, или нет. Как Вы (и для чего) выбираете книги с нужными листами. Известные имена листов........, нужно проверить есть/нет на них нужная инфа...., сколько листов в книге и нужно ли работать с всеми,.... etc.
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 14:13  [ТС]
А можно ли вызвать процедуру(макрос) у закрытой книги?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.11.2013, 14:35
Можно. У меня так они все и работают - всегда рядом полно закрытых книг
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
01.11.2013, 14:46
А вот тут немного нужно уточнить Вам для себя - макросом из закрытой книги, или использовать сам макрос, размещенный в закрытой книге. А так - см. ответ Hugo121.
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 15:05  [ТС]
Аот имеется 2 процедуры. Первая запускает процедуру со второй книги
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub CommandButton1_Click()
Dim NMonth, i, Ku, Kr As Integer
Dim MasHours()
 
Application.ScreenUpdating = False
Ku = 45
Kr = 14
'Очищаем массив
ReDim MasHours(1 To (Ku + 1), 1 To (Kr + 1))
NMonth = Month("1-" & ComboBox1.Value) 'Перевод имени месяца в его номер
'В первый элемент присваиваем номер выбраноого месяца
MasHours(1, 1) = NMonth
'Вызываем процедуру в книге "Журнал работ"
Application.Run TextBox2.Text & "!Module1.HoursWorks(NMonth,MasHous)"
 
MsgBox MasHours(1, 2)
Application.ScreenUpdating = True
End Sub
Процедура со второй книги(пока что без каких либо вычислений)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub HoursWorks(NMonth As Integer, ByRef MasHous() As String)
 
Timer 'Начало отчета таймера
 
'---------------------------------------------------------
 
'MsgBox Str(ZG_fncTimeWork(True))
TimeL = Timer(True) 'Конец отчета
MasHours(1, 2) = "Готово. Время выполненния: " + Str(TimeL / 1000) + " секунд"
 
 
End Sub
Нажимаю кнопку в 1 книге. Начинает выполняться 1ая процедура. Доходит до строчки(вызова процедуры в другой книге):
Application.Run TextBox2.Text & "!Module1.HoursWorks(NMonth,MasHous) "

Открывается 2ая книга и выдает ошибку что не может найти такой макрос

Что я сделал не так??

Добавлено через 1 минуту
Да кстати. Вторая процедура находится в Модуле1
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.11.2013, 15:26
Visual Basic
1
2
3
4
5
6
7
8
Sub test()
    Dim x&, y&, t
    
    x = 5
    y = 10
 
    t = Application.Run("test2.xls!Module1.test2", x, y)
End Sub
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 15:34  [ТС]
Голова уже не варит. Не догоняю в чем суть?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
01.11.2013, 15:45
И все готово! А не легче Вам будет хранить Ваши процедуры в личной книге макросов? Найти/проверить/корректировать - все проще, чем вспоминать, где это макрос Вы сунули пол года назад.

Добавлено через 8 минут
Не увидел "Голова уже не варит...".
Visual Basic
1
t = Application.Run("test2.xls!Module1.test2", x, y)
Вызываете процедуру test2 из модуля 1 книги test2.xls, при этом передаете ей как аргументы значения x,y, а результат выполнения возвращается как значение t (тип - variant). И все.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.11.2013, 16:30
Не совсем так. В t empty, но почему-то она (переменная) нужна...
Если так вызывать функцию - то тогда там что-то было бы.
А так просто отрабатывает тот макрос:

Visual Basic
1
2
3
Sub test2(x, y)
    MsgBox x + y
End Sub
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 20:41  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
И все готово! А не легче Вам будет хранить Ваши процедуры в личной книге макросов? Найти/проверить/корректировать - все проще, чем вспоминать, где это макрос Вы сунули пол года назад.

Добавлено через 8 минут
Не увидел "Голова уже не варит...".
Visual Basic
1
t = Application.Run("test2.xls!Module1.test2", x, y)
Вызываете процедуру test2 из модуля 1 книги test2.xls, при этом передаете ей как аргументы значения x,y, а результат выполнения возвращается как значение t (тип - variant). И все.
Дело в том что эти книги находятся на разных компах и открываются по сети с нескольких компов

Visual Basic
1
t = Application.Run("test2.xls!Module1.test2", x, y)
Что за параметры x,y? Они относятся к макросу или книге?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.11.2013, 21:25
"Что за параметры x,y?" - да просто два числа в данном случае.
Оба макроса есть в двух постах - пробуйте.
Но чтоб работало - обе книги должны быть открыты в одном Экселе.
Если второй файл закрыт - нужно дописать его открытие. Ну и закрытие, если открывали.
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 22:21  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
"Что за параметры x,y?" - да просто два числа в данном случае.
Оба макроса есть в двух постах - пробуйте.
Но чтоб работало - обе книги должны быть открыты в одном Экселе.
Если второй файл закрыт - нужно дописать его открытие. Ну и закрытие, если открывали.
Т.е в моем случае
Visual Basic
1
Application.Run TextBox2.Text & "!Module1.HoursWorks(NMonth,MasHous)"
Это должно выглядеть так
Visual Basic
1
Application.Run(TextBox2.Text & "!Module1.HoursWorks", NMonth, MasHous)
???
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.11.2013, 22:25
Попробуйте - расскажете.
Я код сперва проверил.
Но с полным путём к файлу не работало! Именно вот только так: "test2.xls!Module1.test2"
и с
t =
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
01.11.2013, 23:03  [ТС]
Что никак. Так же выдает ошибку что не найдет такой макрос
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 17
09.08.2016, 14:02  [ТС]
Так что, это возможно сделать или нет?
0
2047 / 478 / 132
Регистрация: 13.11.2008
Сообщений: 917
09.08.2016, 17:36
А Вы попробуйте апострофы добавить - вдруг в имени файла есть пробелы и иные неугодные символы:
Visual Basic
1
"'" & TextBox2.Text & "'!Module1.HoursWorks"
0
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
10.08.2016, 13:17
6667, что-то тут у вас сложно написано апострофы, модули и т.д. Я просто приведу маленький кусочек кода, в котором из основной книги (Doctor) вызывается функция с параметром из другой книги (Базан.xls). Эта функция находит пациента в базе Базан и передает его порядковый номер в той базе переменной Nstr в Книге Doctor. Обе книги, естественно, открыты. FinPac описана в Базан как Public и находится в одном из модулей. Всё прекрасно работает.
Может это вам поможет.

Visual Basic
1
2
3
Application.ScreenUpdating = False
Workbooks("Базан.xls").Activate
Nstr = Application.Run("Базан.xls!FindPac", False)
Добавлено через 1 час 21 минуту
P.S. Результатом функции может быть и массив. И процедуры можно аналогично вызывать, если мне не изменяет память, то я пытался в обращении к функции тоже ставить Module1. и была ошибка, а так всё проходит.

Добавлено через 46 минут
По поводу Module1 фраза снимается, поставил в своём коде тоже всё нормально. Хотелось бы увидеть ваши файлы (можно в предельно укороченном виде) и посмотреть ошибку в них, а не в приведённом коде
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2016, 13:17
Помогаю со студенческими работами здесь

Использование имени процедуры в качестве параметра другой процедуры
Предложите, пожалуйста, пример решения след. задачи с использованием вышеуказанного условия: Составить процедуру, которая для...

Использование имени процедуры в качестве параметра другой процедуры
Для заданного массива В составить процедуру, определяющую отрезок, на который попадают заданного массива Р. Применить процедуру для k...

Использование имени процедуры в качестве параметра другой процедуры
Составить программу по заданному условию.Первая часть условия является заданием на разработку процедуры для любой функции f или пары...

Использование имени процедуры в качестве параметра другой процедуры
Составить программу по заданному условию. Первая часть условия является заданием на разработку процедур для любой функции f1, f2. Условие...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru