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

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

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

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

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

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

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

' всё показывается правильно!
MsgBox ("Workbook_Open(). CurrentName = " & CurrentName)
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #35943611
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
Dim l As Long
Public g As Long
Переменная g доступна глобально, а l только в модуле. Обычно Option Explicit в таких случаях помогает.
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #35943723
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Глобальная переменная. VBA
    #35943725
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. я в VBA новичок
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #35943855
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в модуле книги, где процедура Public Sub Workbook_Open() первой строчкой было бы указано Option Explicit, то при компиляции все необъявленные переменные всплыли бы, в том числе CurrentName. Это бы заставило задуматься, а там бы глядишь, почитав хелп, вместо Dim нашел бы Public.

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

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


Public Sub Workbook_Open()
...
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #35944201
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После вчитывания в первое сообщение, стало более понятна проблема:)
По быстрому можно так обойти.
В модуль вставить функцию
Код: 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
Глобальная переменная. VBA
    #35944457
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergeyvg,

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

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

Покажите Ваш первоначальный код. Если вы называли переменную глобальной и не объявляли ее как Public в модуле, то Вы вводили всех в заблуждение.
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #35945050
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Глобальная переменная. VBA
    #35945926
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из приведенного текста вобще не понятно, зачем нужна переменная CurrentName, которая нигде не используется. А вот кнопка не будет задействована при открытии книги, если она была до этого сохранена с активным листом, имя которого начинается не с 1-4, может в этом дело.
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #35950236
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

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

SetCurrentName (Str)

написать

SetCurrentName Str

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

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

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

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

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

Пишу Public start_day as variant

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

????
...
Рейтинг: 0 / 0
Глобальная переменная. VBA
    #36298816
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати да, я вот тоже не могу понять, где надо дописать 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
Глобальная переменная. VBA
    #36298905
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: 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
Глобальная переменная. VBA
    #36299006
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спасибо! А то нигде сейчас не нашёл, что Public надо в отдельном модуле объявлять. Как-то раньше особо не требовалось, вот и не запомнилось, если и встречал...
Всё работает. Только ведь Option Explicit не обязательно, и так работает?
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Глобальная переменная. VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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