Консультация № 172118
12.09.2009, 19:12
0.00 руб.
0 12 1
Уважаемые эксперты подскажите пожалуйста в следующем:
у меня в Нормал Доте хранится 50 макросов
как присвоить переменную, которая будет доступна во всех 50 макросах, если я не ошибаюсь это будет глобальная переменная, читал о ней но ничего не понял. Спасибо Эндрю

Обсуждение

Неизвестный
12.09.2009, 19:41
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Нужно объявить эту переменную глобально, в самом начале модуля. Эта переменная не должна входить ни в одну процедуру. Просто перейдите в начало модуля и напишите объявление этой переменной:

Public MyGlobalVar As String

Такая переменная будет доступна всем модулям в документе
Если объявить переменную так:

Private MyGlobalVar As String

То она будет доступна для всех процедур того модуля, в котором объявлена.
Неизвестный
13.09.2009, 13:49
общий
Витер Александр Анатольевич:
По Вашему совету я в начале любого макроса вставил отрывок, возможно нужно вставить вначале первого макроса нажав в коде Конрол Хомэ?, не пробовал:
Public strОбр As String
Private strОбр As String

После чего после вставленного отрывка переместиться линия разрыва и получится что якобы вставлен отрывок после предыдущего макроса
Если нажмём Эф 8 для пошагово прохода по коду получим сообщение:
Only comments may appear after End Sub, End Function, or End Property, что означает - после End Sub, End Function и End Property можно помещать только комментарии
Так как и куда же тогда вставлять этот отрывок? Поясните тогда.
Затем закрываем код макроса, открываем снова макрос
нажмём Эф 8 для пошагово прохода по коду и всё работает
Но только не обсчитываются эта переменная strОбр в других макросах
Может Вы поясните более доходчиво как говорят пошагово подоступней.
Спасибо Эндрю
Неизвестный
13.09.2009, 15:17
общий
Ципихович Эндрю:
Модулем называется часть документа, в которой храниться исполняемый код. Когда вы открываете редактор Visual Basic, то слева у вас находится окно Project Explorer (менеджер проектов). Выглядит он так:

На рисунке я рамками обозначил разные типы модулей, которые могут находиться в документе:
  • Желтая рамка: стандартный модуль макросов ThisDocument (ЭтотДокумент), который присутствует в любом документе или шаблоне по умолчанию. В этом модуле можно размещать любые макросы, но целесообразнее всего использовать его для макросов, который связаны с событиями документа: открытие, сохранение, печать и т.д. Глобальные переменные в нем размещать нельзя.
  • Синяя рамка: модуль формы. Его отличие состоит в том, что помимо кода, он содержит в себе визуальный редактор диалоговых окон. В этом модуле также можно размещать любые макросы, но обычно в нем располагаются только макросы, связанные с обработкой событий происходящих на форме. Глобальные переменные в нем размещать нельзя.
  • Красная рамка: обычный модуль кода. Модуль такого типа создается при автоматической записи макроса. В этом модуле можно размещать любые макросы, объявлять переменные с разной видимостью (внутри всего проекта или только внутри конкретного модуля).
  • Зеленая рамка: модуль класса. Это особый модуль, предназначенный для описания классов — специальных пользовательских объектов, обладающих собственными свойствами, событиями и т.д. Глобальные переменные в нем размещать нельзя.

Любой из этих модулей может быть добавлен в ваш проект с помощью команд меню Insert или кнопкой на панели инструментов


Дважды кликнув на имени модуля, вы откроете справа окно редактирования кода. Глобальные переменные нужно объявлять в самом начале модуля, в той его части, которая называется Declaration.
На первый взгляд незаметно, но окно редактирования кода состоит из нескольких зон: зоны Declarations и зон, которые соответствуют процедурам или функциям, находящимся в модуле. Чтобы понять, в какой зоне модуля вы находитесь, нужно взглянуть на правый из двух выпадающих списков, расположенных над окном редактирования кода:

Также эти списки позволяют быстро переходить между функциями и процедурами, находящимися в коде. Если вы раскроете этот список, то увидите в нем имена всех процедур (Sub) и функций (Function) объявленных в этом модуле.
Чтобы перейти в зону Declarations необходимо, находясь в окне редактирования кода, нажать Ctrl+Home (произносится как «Контрол Хоум»)
Если в самом начале модуля расположены строки, начинающиеся словом Option, например Option Explicit или Option Base 1, то глобальные переменные нужно объявлять после последней из таких строк:


Думаю, что на первый раз хватит. Спрашивайте.
Неизвестный
13.09.2009, 20:22
общий
Витер Александр Анатольевич:
По Вашему совету всё получилось, но как-то всё одно многое не понятно
1)у меня Project Explorer (менеджер проектов) всего два:модуль1 и НьюМакрос
интересно узнать почему у Вас больше и как Вы их переименовываете, как они удаляются, зачем вы их добавляете?
2)Что-то по Вашему совету:Чтобы перейти в зону Declarations необходимо, находясь в окне редактирования кода, нажать Ctrl+Home (произносится как «Контрол Хоум»)
не получается так сделать, ведь нажав эти клавиши поднимаемся в самый вверх, не так ли или я не там нажал эти клавиши?
3)как я понял макросы то есть процедуры у меня находятся в модуле НьюМакрос, поэтому в модуле1 я вставил код:
Public strОбр As String и добился желаемого и как я понял, что в модуле НьюМакрос нужно вставить код:Private strОбр As String
и получилось бы тоже самое. Вопрос в том какой из вариантов лучше я имею ввиду проще для железа компьютера и второе почему-то я не смог в
модуль НьюМакрос вставить это код:Private strОбр As String, потому и поступил так. А как же его вставить?
4)иногда в сети можно встретить всевозможные примеры по ВБА их ярлык выглядит как и в значке модуля в Project Explorer и как я теперь подозреваю файл этот имеющий
разрешение вроде BAS можно как то вставить в проект или что с ним делают знающие люди?
Спасибо Эндрю
Неизвестный
13.09.2009, 22:28
общий
Ципихович Эндрю:
1. Модулей у меня много, потому что у меня много процедур. Если все их хранить в одном модуле, то потом очень трудно ориентироваться.
Чтобы удалить модуль, нужно щелкнуть правой кнопкой мыши на нем и выбрать пункт, начинающийся со слова Remove. После этого появится сообщение с предложением сохранить модуль перед его удалением. Если вы не хотите его сохранять, нажмите «Нет». Если нажать «Да», то появится окно сохранения файла, где вы сможете указать место, куда сохранить ваш модуль. Он будет иметь расширение bas.
Чтобы переименовать модуль, выделите его в Project Explorer, нажмите F4 и в появившемся окне свойств задайте свойство Name.
2. А куда вы попадаете, если нажмете Ctrl+Home?
3. Если вы в одном модуле объявили переменную как Public, то вы не можете в другом модуле объявить переменную с тем же именем. Ни как Public, ни как Private. После объявления переменной в одном модуле вы просто используете ее и все. Повторно объявлять не нужно.
4. Да, модули в виде файлов можно импортировать в проект, а можно экспортировать. Все это делается через контекстное меню в Project Explorer, которое вызывается правой кнопкой мыши.
Неизвестный
14.09.2009, 02:36
общий
Витер Александр Анатольевич:
+1, за терпение..
Неизвестный
14.09.2009, 08:21
общий
Витер Александр Анатольевич Вам уже дали +1 за терпение, я ещё дам сверху +10
Кое что стало ясно, наконец то с сети я могу импортировать в проект файлы с расширением BAS и смотреть на труд других юзеров-программистов.
У Вас как я понял в одном модуле как правило одна процедура, то есть один макрос.
А у меня один модуль и в нём 50 макросов как лучше относительно железа? я не знаю, но мне удобней как у меня.
Поэтому нажав Ctrl+Home я попадаю в верхний макрос он у меня тот который записан раньше всех согласно даты, но наверное их порядок можно и менять, например по алфавиту.
Даже не спрашиваю как их менять разницы в этом не вижу так как в Ворде нажав сервис>макрос они мои 50 макросов расположены по алфавиту и выбрать из них
интерисующий нет труда.
С одной стороны я всего чего хотел добился но есть интерес ещё и понимать процессы происходящие
Вот как в моём случае 1 модуль - пятдесят макросов я понял, что нужна только инструкция вида Public strОбр As String
и тогда переменная strОбр будет видна в 50 макросах или я не правильно понял?, потому что я пробовал код вида Private strОбр As String
и результата не добился или я не правильно понял? Спасибо за доходчивые ответы Эндрю.
Неизвестный
14.09.2009, 09:15
общий
Нажав Сtrl+Home вы попадаете в ваш первый макрос. Хорошо. Нажмите два раза Enter и снова Ctrl+Home Над первым макросом появились две пустых строки. И где вы теперь находитесь?
Далее. Если у вас все 50 макросов расположены в одном модуле, то как бы вы в этом модуел не объявили переменную хоть Public, хоть Private она будет видна для всех макросов этого модуля. Вот у вас есть два модуля: Module1 и NewMacros. Если вы объявите в модуле Module1 свою переменную как Public, то эта переменная будет видна и для процедур, находящихся в модуле Module1 и для всех остальных модулей. Если же вы объявите эту переменную как Private, то она будет видна только для процедур, находящихся в Module1. Таким образом, если вам нужна переменная, доступная только для всех процедур одного модуля, то эту переменную нужно объявить как Private в разделе Declarations вашего модуля. Если же у вас несколько модулей и вам нужно передавать значения между модулями, то переменную нужно объявлять как Public в одном из этих модулей.
Железу абсолютно фиолетово, где вы размещаете свои макросы. Хоть в одном модуле, хоть в 10. В документе, который я привел на картинке у меня в 12 модулях находятся 43 процедуры и функции, занимающие 841 строку кода. Только не спрашивайте, как я считал , не вручную
Немного еще терминологии.
Процедурой называется часть программы, которая не возвращает никаких значений. Процедуру можно узнать по слову Sub (сокращение от Subroutine), которое стоит перед именем процедуры. Те макросы, которые пишутся автоматически, и есть ничто иное как процедуры. То, что в обиходе называется макросом, и есть процедура.
Также существуют функции. Они, в отличие от процедур, умеют возвращать значения. Функцию можно узнать по слову Function, которое стоит перед ее именем.
Неизвестный
14.09.2009, 13:00
общий
Витер Александр Анатольевич:
Как вот Вы умеете доходчиво объяснять, Вам бы книги писать в хорошем смысле слова.
Где я не читал ни чего подобного не пишут. И осталось одно не понятно, что такое - "функции. Они, в отличие от процедур, умеют возвращать значения".
Я лично подразумеваю под этим умеют присваивать значение или я не прав?
И я так понял, что я например не могу записать 51 макрос сообщает, что мало места, тогда надо создать второй модуль и там написать ещё штук 50 макросов и
тогда хватит места на диске, правильно? Эндрю.
Неизвестный
14.09.2009, 13:09
общий
Нет, неправильно. Макросов может быть сколько угодно в одном модуле, по крайней мере, я не слышал об ограничениях. Но мне удобно ориентироваться, когда макросы сгруппированы в модули в соответствии с их назначением. Например, в том документе, что на рисунке, я сразу по названию модуля знаю, что RibCommon содержит процедуры общие для всей «ленты» — элемента интерфейса в Word2007. RibDynMenuBookmarks — процедуры для обработки динамического меню закладок и т.д. Это чисто ваши предпочтения.

А функциями займемся, когда это будет нужно . В отдельной теме
Неизвестный
14.09.2009, 14:19
общий
Витер Александр Анатольевич:
Отдельную тему я закинул на форум, помоему она переплетается с функциями, хотел переспросить по этому Вашему изречению
"процедуры и функции, занимающие 841 строку кода. Только не спрашивайте, как я считал , не вручную"
Я понимаю откуда это значение имеется в окошке там есть 111Ln? а вот вопрос что рядом означает 1Col. Я так понимаю это столбик первый?, а в каких случаях бывает 5-9 столбиков, подскажите? Эндрю.
Неизвестный
14.09.2009, 14:24
общий
Нет, строки и процедуры я считал макросом , до вашего метода не додумался.
Col показывает смещение курсора относительно левого края. Строго говоря, это не столбик, а позиция курсора. Но, поскольку, в шрифте, который используется для отображения кода, все символы одинаковой ширины (такие шрифты называются моноширинными), то можно считать что это столбик.
Форма ответа