Страницы: 1
RSS
Инициализация глобальных переменных
 
Всем добрый день! Делаю окошко для отправки запросов к БД. Все гуд, решил сделать глобальные переменные чтобы пользователь один раз вводил свои установки (пароль, драйвер,..) а програма до закрытия ексель-файла их запоминала и тут вылезла проблемка.
Когда запускаю диалоговое окно через процедуру, глобальные переменные не прописвываються, а когда запускаю "напрямую" из ВБА все нормально. Подскажите пожалуйста что я делаю не правильно:

Инициализация переменных:
Код
Private Sub Workbook_Open()
    driverFormMySQL = "MySQL ODBC 5.3 Unicode Driver"
    ipFormMySQL = "127.0.0.1"
    databaseFormMySQL = "database1"
    userFormMySQL = "root"
    passwordFormMySQL = "1111"
    queryFormMySQL = ""
End Sub

Module1: (Обявление переменных и процедура вызова окна)
Код
Option Explicit
Public driverFormMySQL As String
Public ipFormMySQL As String
Public databaseFormMySQL As String
Public userFormMySQL As String
Public passwordFormMySQL As String
Public queryFormMySQL As String

Sub Start()
    FormMySQL.Show
End Sub



FormMySQL:
Код
Private Sub ButExecute_Click()
    Const title = "Ðåçóëüòàò çàïèòó"
    connection = "ODBC;DRIVER={" & Trim(TxtDriver.text) & "};SERVER=" & Trim(TxtIP.text) & ";DATABASE=" & Trim(TxtDatabase.text) & ";USER=" & Trim(TxtUser.text) & ";PASSWORD=" & Trim(TxtPassword.text) & ";"
    Dim table As ListObject
    Dim x As Range
        Worksheets.Add
        On Error GoTo Errhandler
        Set table = ActiveSheet.ListObjects.Add(xlSrcExternal, connection, True, xlYes, Range("A2"))
        With table.QueryTable
            .CommandType = xlCmdSql
            .CommandText = TxtQuery.text
            .Refresh False
            .Delete
        End With
        Set x = Range(Cells(1, 1), Cells(1, (Cells(2, Columns.Count).End(xlToLeft).Column)))
        With x
            .Merge
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
            .Value = title
        End With
        Range("A1").AddComment TxtQuery.text
        Range("A1").Comment.Visible = False
    Unload FormMySQL
    Exit Sub
Errhandler:
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
    MsgBox "Íà æàëü, òðàïèëàñÿ ïîìèëêà - " & Err & vbNewLine & Err.Description, vbOKOnly, "Ïîìèëêà"
End Sub
Private Sub UserForm_Initialize()
    TxtDriver.text = driverFormMySQL
    TxtIP.text = ipFormMySQL
    TxtDatabase.text = databaseFormMySQL
    TxtUser.text = userFormMySQL
    TxtPassword.text = passwordFormMySQL
    TxtQuery.text = queryFormMySQL
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    driverFormMySQL = Trim(TxtDriver.text)
    ipFormMySQL = Trim(TxtIP.text)
    databaseFormMySQL = Trim(TxtDatabase.text)
    userFormMySQL = Trim(TxtUser.text)
    passwordFormMySQL = Trim(TxtPassword.text)
    queryFormMySQL = Trim(TxtQuery.text)
End Sub
Изменено: fed_lviv - 23.10.2015 18:38:34
 
Запустил макрос Start - появилась форма с заполненными полями  8)
 
Извиняюсь, немного плохо описал проблему. Если закрыть окно, то при следующем запуске все поля пустые.
 
Опа  8-0 Если запускаю через: Разработчик-Макросы-Выполнить - все гуд. Это конечно хорошо, проблемы нет, но все же интересно, а почему когда запускаю из ВБА не происходит инициализация?  
Изменено: fed_lviv - 23.10.2015 18:59:31
 
А попробуйте в 24 строке вместо Unload сделать Hide. Или проверьте, чему равны значения комбобоксов при выполнении UserForm_QueryClose. Быть может, не во всех случаях нужно обновлять глобальные переменные при закрытити?
F1 творит чудеса
 
Возможно имеет смысл в ячейках хранить настройки и потом оттуда извлекать. Тогда пользователь сможет заполнить один раз и далее в любой момент(даже после закрытия книги) запускать именно со своими настройками.
А когда напрямую из VBA запускаете есть шанс, что переменные очищаются из памяти. Это может происходить при любом изменении в VB проекте.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
fed_lviv написал: но все же интересно, а почему когда запускаю из ВБА не происходит инициализация?  
я, конечно, не знаю... но всё же чисто лингвистически - возможно, дело в этом и есть Private Sub Workbook_Open()... т.е. VBEditor не хранит у себя в памяти факт открытия книги (как следствие, всё что УЖЕ было связано с этим событием, - т.е, как факт, уже свершившийся, СЕЙЧАС уже не имеет значения для VBEditor)... сказала бы я на скромных правах предположения... имхо (он же не Workbook, когда вы его юзаете)
Изменено: JeyCi - 24.10.2015 11:42:04
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Всем спасибо за советы. The Prist, была такая мысль, но почему то засомневался. Просто я хочу сделать надстройук (xlam), и не знаю можна ли в ней сохранять/изменять на листе в ячейках значения.
Изменено: fed_lviv - 24.10.2015 12:25:50
 
Можно. Только не стоит забывать сохранить книгу после изменения настроек, если в планах есть сохранять настройки даже после закрытия Excel.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Еще раз большое всем спасибо. Вот что получилось:
КНИГА:
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Save
End Sub
МОДУЛЬ:
Код
Sub MySQLQuery(control As IRibbonControl)
    FormMySQL.Show
End Sub
ФОРМА:
Код
Private Sub ButExecute_Click()
    Const title = "Ðåçóëüòàò çàïèòó"
    Dim table As ListObject
    Dim x As Range
    connection = "ODBC;DRIVER={" & Trim(TxtDriver.text) & "};SERVER=" & Trim(TxtServer.text) & ";DATABASE=" & Trim(TxtDatabase.text) & ";USER=" & Trim(TxtUser.text) & ";PASSWORD=" & Trim(TxtPassword.text) & ";"
        Worksheets.Add
        On Error GoTo Errhandler
        Set table = ActiveSheet.ListObjects.Add(xlSrcExternal, connection, True, xlYes, Range("A2"))
        With table.QueryTable
            .CommandType = xlCmdSql
            .CommandText = TxtQuery.text
            .Refresh False
            .Delete
        End With
        Set x = Range(Cells(1, 1), Cells(1, (Cells(2, Columns.Count).End(xlToLeft).Column)))
        With x
            .Merge
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
            .Value = title
        End With
        Range("A1").AddComment TxtQuery.text
        Range("A1").Comment.Visible = False
    Unload FormMySQL
    Exit Sub
Errhandler:
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
    MsgBox "Íà æàëü, òðàïèëàñÿ ïîìèëêà - " & Err & vbNewLine & Err.Description, vbOKOnly, "Ïîìèëêà"
End Sub
Private Sub UserForm_Initialize()
   Set MySheet = Workbooks("VBA.xlam").Worksheets("Ëèñò1")
    TxtDriver.text = MySheet.Range("B1")
    TxtServer.text = MySheet.Range("B2")
    TxtDatabase.text = MySheet.Range("B3")
    TxtUser.text = MySheet.Range("B4")
    TxtPassword.text = MySheet.Range("B5")
    TxtQuery.text = MySheet.Range("B6")
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set MySheet = Workbooks("VBA.xlam").Worksheets("Ëèñò1")
    MySheet.Range("B1") = Trim(TxtDriver.text)
    MySheet.Range("B2") = Trim(TxtServer.text)
    MySheet.Range("B3") = Trim(TxtDatabase.text)
    MySheet.Range("B4") = Trim(TxtUser.text)
    MySheet.Range("B5") = Trim(TxtPassword.text)
    MySheet.Range("B6") = Trim(TxtQuery.text)
End Sub
Кстати надстройку учился делать по Вашему сайту, The_Prist.
Страницы: 1
Наверх