2013-10-27 2 views
0

Извините за непонятное название, я просто не знал, как описать свою цель. Я новичок в VBA и еще не понял, как все работает.Excel VBA глобальные переменные "lifetime"?

Я написал функцию, которая получает каталог от пользователя и отображает данные из первого файла в каталоге. Теперь я хочу добавить кнопку «Далее». Когда нажата кнопка «Далее», мой код должен отображать данные из следующего файла в каталоге.

Я пытался использовать глобальные переменные, но они кажутся инициализированными каждый раз при нажатии кнопки. Каков наилучший способ достичь моей цели? Должен ли я использовать электронную таблицу в качестве памяти и писать и читать все оттуда? Или у Excel VBA есть другой механизм «живой памяти»?

Спасибо, Li

+0

Может быть, вы могли бы написать в какой-то файл и повторно считывать значения в соответствующее время. –

+0

Можете ли вы поделиться кодом, который у вас есть в настоящее время? –

+0

Мой код слишком велик и включает в себя множество других действий, это только смущает всех. Удалось ли мне объяснить мою цель? – user429400

ответ

1

Этому можно подойти многому, как с любой проблемой, я думаю!

Вы можете разбить проблему на две подпрограммы:

1) Получить все имена файлов в выбранной директории и отображать данные первого файла

2) Если это не последний файл, получить следующие данные файла и отобразите его

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

Global filenames As Collection 
Global fileIndex As Integer 

Public Sub GetFilenames() 
    Dim selectedDirectory As String 
    Dim currentFile As String 

    selectedDirectory = "selected\directory\" 
    currentFile = Dir$(selectedDirectory) 

    Set filenames = New Collection 

    While currentFile <> "" 
     filenames.Add selectedDirectory & currentFile 
     currentFile = Dir$() 
    Wend 

    ' Make sure there were files 
    If filenames.Count >= 1 Then 
     fileIndex = 1 

     ' Call a method to display data 
     DisplayData(filenames(fileIndex)) 
    Else 
     ' No files 
    End If 
End Sub 

Public Sub GetNextFile() 
    ' Make sure we have a filenames object 
    If Not filenames Is Nothing Then 
     If fileIndex < filenames.Count Then 
      fileIndex = fileIndex + 1 

      ' Call the display method again 
      DisplayData(filenames(fileIndex)) 
     Else 
      ' Decide what to do after reaching the final file 
     End If 


    Else 
     ' No filenames 
    End If  
End Sub 

я не включил процедуру DisplayData, как я не уверен, какой тип файлов вы захвата или то, что вы делаете с ними, но если бы сказать Excel файлы это может быть что-то вроде:

Public Function DisplayData(filename As String) 
    Dim displayWb As Workbook 

    Set displayWb = Workbooks.Open(filename) 

    ' Do things with displayWb 
End Function 

Вы можете установить макрос кнопки на «GetNextFile», и он будет циклически перемещаться по файлам после каждого нажатия. Что касается времени жизни глобальных переменных, они только повторно инициализируются, когда проект VBA сбрасывается или когда они специально инициализируются посредством процедуры или непосредственного окна.

4

Глобалы, обычно не инициализируется при нажатии на кнопку. Они будут переизданы в, если вы перекомпилируете свой проект VBA. Поэтому во время отладки вы можете увидеть, что глобальный объект повторно инициализирован.

Вы можете использовать электронную таблицу в качестве памяти. Один из способов сделать это - иметь листок, чье свойство Видимости вы установили в xlSheetVeryHidden (вы можете сделать это из проекта VBA). Этот рабочий лист не будет отображаться для пользователей, поэтому ваше приложение VBA может использовать его для хранения данных.

+0

+ 1 Именно мои мысли. –

Смежные вопросы