Передача массива между щелчками Subs в VBA - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь объявить и заполнить переменную массива (coll), но хочу получить доступ к содержимому массива в другом Sub (UnassignButton_Click ()).Я получаю сообщение об ошибке:

Ошибка компиляции: Sub или Function не определены

Ниже приведен мой код:

Public Sub SearchButton_Click()
Dim RowNum As Long
Dim SearchRow As Long
Dim coll As Object
Set coll = CreateObject("System.Collections.ArrayList")

RowNum = 2
SearchRow = 2

Do Until Cells(RowNum, 1).Value = ""
    If InStr(1, Cells(RowNum, 1).Value, SearchTextBox.Value, vbTextCompare) > 0 Then
        Worksheets("Search_Results").Cells(SearchRow, 1).Value = Cells(RowNum, 1).Value
        Worksheets("Search_Results").Cells(SearchRow, 2).Value = Cells(RowNum, 2).Value
        Worksheets("Search_Results").Cells(SearchRow, 3).Value = Cells(RowNum, 3).Value
        Worksheets("Search_Results").Cells(SearchRow, 4).Value = Cells(RowNum, 4).Value
        Worksheets("Search_Results").Cells(SearchRow, 5).Value = Cells(RowNum, 5).Value
        Worksheets("Search_Results").Cells(SearchRow, 6).Value = Cells(RowNum, 6).Value
        Worksheets("Search_Results").Cells(SearchRow, 7).Value = Cells(RowNum, 7).Value
        Worksheets("Search_Results").Cells(SearchRow, 8).Value = Cells(RowNum, 8).Value
        Worksheets("Search_Results").Cells(SearchRow, 9).Value = Cells(RowNum, 9).Value
        SearchRow = SearchRow + 1
        coll.Add RowNum
    End If
    RowNum = RowNum + 1
Loop

If SearchRow = 2 Then
    MsgBox "No products were found that match your search criteria"
    Exit Sub
End If

SearchResultsListBox.RowSource = "SearchResults"

End Sub

Private Sub SearchResultsListBox_Click()
NumberIndex = SearchResultsListBox.ListIndex
End Sub

Public Sub UnassignButton_Click()
NumberIndex = SearchResultsListBox.ListIndex
MsgBox coll(NumberIndex)

End Sub

Любая помощь, чтобы решитьэтот вопрос будет высоко ценится!

1 Ответ

2 голосов
/ 25 сентября 2019

См. этот ответ , почему вы не можете просто подписать процедуры обработчика событий типа волей-неволей в соответствии с вашими потребностями.

Каждая процедура определяет область действия .Локальные переменные (объявленные с помощью Dim, ... или не объявленные вообще) находятся внутри этой области процедуры и не имеют выхода.

Следующий более высокий уровень области действия - область действия модуля..Переменные, объявленные в этой области, доступны для всех процедур в модуле.Используйте ключевое слово Private, чтобы объявить их (Dim также допустимо, но я предпочитаю резервировать его для местных жителей, поскольку Private недопустимо на уровне процедуры) - рассмотрите возможность использования значимого идентификатора name, тоже ... "coll" мало что говорит о для чего это :

Option Explicit
Private RowNumbers As Object

И затем вы можете инициализировать его в обработчике Initialize:

Private Sub UserForm_Initialize()
    Set RowNumbers = CreateObject("System.Collections.ArrayList")
End Sub

Возможно, также неплохо было бы явно стереть его в обработчике Terminate, поскольку это объект .NET (FWIW, это вообще не массив VBA и не имеет ничего общего с массивами):

Private Sub UserForm_Terminate()
    Set RowNumbers = Nothing
End Sub

Следующий более высокий уровень области действия - глобальная область действия , но как только вы поймете, как передавать параметры между процедурами и когда использовать переменные области действия модуля, вам почти никогда не понадобитсялюбые глобалы.Для полноты картины глобальная переменная будет объявлена ​​в стандартном модуле с использованием ключевого слова Public (тоже работает Global, но это сбивает с толку, поскольку то, что мы называем "глобальным", действительно просто "project-scope ", и, кроме того, Public гораздо более явно противодействует Private, так что это хорошо для согласованности).


Если вы добавите Option Explicit в начало ваших модулей, VBA будетОтказаться от компиляции кода, который использует необъявленные переменные и который выделил бы coll и, вероятно, NumberIndex.

Посмотрите, помечают ли проверки Rubberduck другие проблемы (отказ от ответственности: Iуправлять этим проектом с открытым исходным кодом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...