Пропуск приватной функции для цикла - PullRequest
1 голос
/ 10 июня 2019

Сейчас я пытаюсь узнать, как работают словари в VBA, поэтому я создал простой модуль класса A, а затем две подпрограммы, но по независящим от меня причинам цикл For полностью пропущен внутри функции.Ниже приведен код для всех предметов, упомянутых выше.У меня действительно проверена среда выполнения сценариев Microsoft в Инструменты> Ссылки.Я не очень знаком с тем, как используются Позднее и Раннее связывание, поэтому мне интересно, не является ли это одной из проблем.

В настоящее время Set rg = LoanData.Range("AH2") находится в таблице, я пробовал данные в этом диапазоне каки таблица, а также просто диапазон, но цикл For в функции пропускается, если данные находятся в таблице или нет.

Data Set

Модуль класса называется clsCounty

Public CountyID As Long
Public County As String

Функция называется ReadCounty

Private Function ReadCounty() As Dictionary
    Dim dict As New Dictionary

    Dim rg As Range
    Set rg = LoanData.Range("AH2")

    Dim oCounty As clsCounty, i As Long


    For i = 2 To rg.Rows.Count

        Set oCounty = New clsCounty

        oCounty.CountyID = rg.Cells(i, 1).Value
        oCounty.County = rg.Cells(i, 2).Value

        dict.Add oCounty.CountyID, oCounty
    Next i

    Set ReadCounty = dict


End Function

Две подпрограммы для записи в непосредственныйокно

Private Sub WriteToImmediate(dict As Dictionary)
    Dim key As Variant, oCounty As clsCounty

    For Each key In dict.Keys
        Set oCounty = dict(key)
        With oCounty
            Debug.Print .CountyID, .County
        End With
    Next key

End Sub

Sub Main()
    Dim dict As Dictionary

    Set dict = ReadCounty

    WriteToImmediate dict

End Sub

Ответы [ 2 ]

5 голосов
/ 10 июня 2019

Вы объявили свой диапазон как Set rg = LoanData.Range("AH2"), а затем используете For i = 2 To rg.Rows.Count в цикле. rg.Rows.Count будет 1, поскольку в вашем диапазоне есть только 1 ячейка. Это перед начальным значением для вашего For цикла (2), поэтому он ничего не будет делать.

т.е. For i = 2 to 1

Объявите переменную rg с полным диапазоном. Я собираюсь угадать что-то вроде

With LoanData
    Set rg = .Range(.Cells(1,"AH"), .Cells(.Cells(.Rows.Count, "AH").End(xlUp).Row, "AH"))
End With
1 голос
/ 10 июня 2019

Проблема действительно в использовании Set rg = LoanData.Range("AH2"), , как указано в другом ответе .

Однако, чтобы быть немного более элегантным, вы можете рассмотреть возможность использования LastRow, функция, которая принимает в качестве аргументов columnToCheck и wsName:

Public Function LastRow(wsName As String, Optional columnToCheck As Long = 1) As Long

    Dim ws As Worksheet
    Set ws = Worksheets(wsName)
    LastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row

End Function

В коде это будет выглядеть так:

Private Function ReadCounty() As Dictionary

    Dim dict As New Dictionary
    Dim oCounty As clsCounty, i As Long

    'For i = 2 To LastRow("LoanData", 34)
    For i = 2 To LastRow(LoanData.Name, Range("AH1").Column) 
        Set oCounty = New clsCounty
        oCounty.CountyID = LoanData.Cells(i, "AH").Value
        oCounty.County = LoanData.Cells(i, "AI").Value
        dict.Add oCounty.CountyID, oCounty
    Next i

    Set ReadCounty = dict

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