Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Глобальная переменная. VBA / 25 сообщений из 31, страница 1 из 2
20.04.2009, 20:37
    #35942923
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Есть модуль Module, в нём есть переменная CurrentName типа String и процедура SetCurrentName, инициализирующая переменную.

В WorkBook_Open() создаётся кнопка в тулбаре и вызывается SetCurrentName с ненулевым параметром.

На момент нажатия кнопки в тулбаре, CurrentName = "". Из-за чего?
...
Рейтинг: 0 / 0
20.04.2009, 20:38
    #35942924
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
*Module1
...
Рейтинг: 0 / 0
20.04.2009, 21:29
    #35942980
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
SOFT FOR YOU,

Из-за того, что у тебя не срабатывает событие WorkBook_Open. Ты закрой книгу сначала.
...
Рейтинг: 0 / 0
21.04.2009, 09:44
    #35943421
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
VladConn,

Всё срабатывает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Sub Workbook_Open()
...

' инициализация
SetCurrentName( ... )

' всё показывается правильно!
MsgBox ("Workbook_Open(). CurrentName = " & CurrentName)
...
Рейтинг: 0 / 0
21.04.2009, 10:56
    #35943611
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Код: plaintext
1.
Dim l As Long
Public g As Long
Переменная g доступна глобально, а l только в модуле. Обычно Option Explicit в таких случаях помогает.
...
Рейтинг: 0 / 0
21.04.2009, 11:35
    #35943723
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
sergeyvg,

Public CurrentName As String

Код: plaintext
Что такое "Option Explicit" ?

Я ещё вот что думаю...

Код: plaintext
1.
2.
3.
4.
5.
 With OracleButton
  .caption = "Скопировать Oracle"
  .TooltipText = "Заполнить лист Oracle"
  .Style = msoButtonIconAndCaption
  .OnAction = "CopyToOracle"
 End With

Я указываю макрос "CopyToOracle", который находится в Module1. Может, он другой макрос берёт, какое-то другое адресное пространство берёт?
...
Рейтинг: 0 / 0
21.04.2009, 11:35
    #35943725
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
P.S. я в VBA новичок
...
Рейтинг: 0 / 0
21.04.2009, 12:12
    #35943855
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Если в модуле книги, где процедура Public Sub Workbook_Open() первой строчкой было бы указано Option Explicit, то при компиляции все необъявленные переменные всплыли бы, в том числе CurrentName. Это бы заставило задуматься, а там бы глядишь, почитав хелп, вместо Dim нашел бы Public.

Про макрос "CopyToOracle", раз он не объявлен Private, то автоматом Public, и из "воздуха", как переменные, не всплывает:)
...
Рейтинг: 0 / 0
21.04.2009, 12:17
    #35943871
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
sergeyvg,

Код: plaintext
1.
2.
3.
4.
5.
Option Explicit
Option Base  1 


Public Sub Workbook_Open()
...
...
Рейтинг: 0 / 0
21.04.2009, 13:26
    #35944201
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
После вчитывания в первое сообщение, стало более понятна проблема:)
По быстрому можно так обойти.
В модуль вставить функцию
Код: plaintext
1.
2.
Public Function test1() As String
  test1 = CurrentName
End Function

В обработчике кнопки вставить получение значения (book3.xls - имя книги с модулем)
Код: plaintext
1.
2.
Sub testx()
  a = Run("book3.xls!test1")
End Sub
...
Рейтинг: 0 / 0
21.04.2009, 14:32
    #35944457
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
sergeyvg,

не понял.
кнопке присвоен один обработчик, кнопка висит в тулбаре, выполняется на всех листах
...
Рейтинг: 0 / 0
21.04.2009, 16:10
    #35944810
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
SOFT FOR YOU,

Блин, не понимаю.
Тестирую тот же самый файл на своей машине - всё нормально!!!
Почему?
...
Рейтинг: 0 / 0
21.04.2009, 17:08
    #35945019
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
SOFT FOR YOU,

Покажите Ваш первоначальный код. Если вы называли переменную глобальной и не объявляли ее как Public в модуле, то Вы вводили всех в заблуждение.
...
Рейтинг: 0 / 0
21.04.2009, 17:16
    #35945050
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
VladConn,

Attribute VB_Name = "Module1"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Type TAutoFilterInfo
  SheetName As String
  IsOn As Boolean
  FiltRange As String
  filterArray() As Variant
End Type

Public CurrentName As String 


Sub ApplicationBeginUpdate()
'Application.BeginUpdate()
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Application.Interactive = False
  Application.UserControl = False
  Application.Calculation = xlCalculationManual
End Sub

Sub ApplicationEndUpdate()
'Application.EndUpdate()
  Application.EnableEvents = True
  Application.Interactive = True
  Application.UserControl = True
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub



Sub BeginAutoFilter(ByVal SheetName As String, ByRef Info As TAutoFilterInfo)

Dim w As Worksheet
  
  Set w = Worksheets(SheetName)
  Info.SheetName = SheetName
  Info.IsOn = False
  
  Set w = Worksheets(SheetName)
  If (IsEmpty(w.AutoFilter)) Then
    Exit Sub
  End If
...

Sub SetCurrentName(ByVal TableName As String)

CurrentName = TableName
'MsgBox ("SetCurrentName(). CurrentName = " & CurrentName)
Application.CommandBars("Для таблиц").Enabled = (TableName <> "")

End Sub



ERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "MainBook"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'+=======================================================================+
'|   Copyright (c) 2002 Oracle Corporation, Redwood Shores, CA, USA      |
'|                 All rights reserved.                                  |
'+=======================================================================+
'Generated:BneOAExcel: Release $Revision: 115.201.1013.27 $ - on Tue Nov 18 10:57:19 2008
Option Explicit
Option Base  1 

Public Sub Workbook_Open()
...
'определение текущей таблицы (для кнопок)
Str = ThisWorkbook.ActiveSheet.name
Str = Left(Str,  1 )
If (Str = "1") Or (Str = "2") Or (Str = "3") Or (Str = "4") Then
  Str = "Table" + Str
Else
  Str = ""
End If
SetCurrentName (Str)

'MsgBox ("Workbook_Open(). CurrentName = " & CurrentName)
...
...
Рейтинг: 0 / 0
22.04.2009, 08:37
    #35945926
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Из приведенного текста вобще не понятно, зачем нужна переменная CurrentName, которая нигде не используется. А вот кнопка не будет задействована при открытии книги, если она была до этого сохранена с активным листом, имя которого начинается не с 1-4, может в этом дело.
...
Рейтинг: 0 / 0
23.04.2009, 15:35
    #35950236
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
SOFT FOR YOU,

Я не уверен, но если проблема еще не решена, то попробуй
вместо

SetCurrentName (Str)

написать

SetCurrentName Str

Мне кажется, много лет назад у меня было что-то похожее из-за использования устаревшего синтаксиса.
...
Рейтинг: 0 / 0
23.04.2009, 16:43
    #35950543
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
И точно, str то зарезервировано за именем функции, не стоит такие слова использовать.
...
Рейтинг: 0 / 0
23.04.2009, 19:11
    #35951029
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
sergeyvg,

Бинго.
...
Рейтинг: 0 / 0
24.04.2009, 09:44
    #35951695
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Доброе время суток.

Многое перепробовал: изменил названия макросов и глобальной переменной, Workbook_Open по какой-то причине был Public - сделал Private. Только что заменил SetCurrentName (Str) на:
1) SetCurrentName Str
2) Call SetCurrentName (Str)

Результат прежний - у меня всё работает, у неё - нет.
Причём! После Call SetCurrentName (Str) вызываю MsgBox ("Workbook_Open(). CurrentName = " & CurrentName) - значение верное! Вызываю макрос - строка пустая.
...
Рейтинг: 0 / 0
24.04.2009, 20:18
    #35953462
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
SOFT FOR YOU,

Переименуй переменную Str. Это зарезервированное слово. Тебе же sergeyvg указал.
...
Рейтинг: 0 / 0
25.04.2009, 01:07
    #35953639
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Чтобы процедура Sub Workbook_Open() автоматически запускалась при загрузке, она должна быть в модуле (класса) ЭтаКнига, в англ. версии Excel этот модуль по умолчанию называется ThisWorkbook. А судя по приведенному коду, эта процедура прописана в отдельном модуле класса MainBook.
...
Рейтинг: 0 / 0
09.11.2009, 13:06
    #36298543
_Maverick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
что случилось немогу понять:

Пишу Public start_day as variant

Вроде как должна переменная быть видна всем модулям, а при запуске макроса выдаёт ошибку:
Compile Error:
Invalid attribute in sub or Function

????
...
Рейтинг: 0 / 0
09.11.2009, 14:33
    #36298816
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Кстати да, я вот тоже не могу понять, где надо дописать Public, чтобы конструкция работала?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub tt()
    Dim x As Long
    x =  1 
    test
End Sub

Sub test()
    MsgBox x
End Sub

Работает только таких 2 варианта, с Public ничего не получается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub tt()
    Dim x As Long
    x =  1 
    test x
End Sub

Sub test(ByVal xx As Long)
    MsgBox xx
End Sub

и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub tt()
    Dim x As Long
    x =  1 
    test x
End Sub

Function test(ByVal xx As Long)
    MsgBox xx
End Function
...
Рейтинг: 0 / 0
09.11.2009, 14:56
    #36298905
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
> Автор: Hugo121
> Кстати да, я вот тоже не могу понять, где надо дописать Public, чтобы конструкция работала?

1. Добавляешь отдельный модуль в котором пишешь 2 строчки:
Код: plaintext
1.
Option Explicit
Public x As Long
2. Во всех остальных модулях(модулях, формах, классах) проверяешь и если нет добавляешь первой строкой Option Explicit
3. из Sub tt() удаляешь строку Dim x As Long
4. Запускаешь и смотришь

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.11.2009, 15:22
    #36299006
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глобальная переменная. VBA
Вот спасибо! А то нигде сейчас не нашёл, что Public надо в отдельном модуле объявлять. Как-то раньше особо не требовалось, вот и не запомнилось, если и встречал...
Всё работает. Только ведь Option Explicit не обязательно, и так работает?
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Глобальная переменная. VBA / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]