Оцените, используя неверный рабочий лист и ошибки - PullRequest
0 голосов
/ 27 января 2020

Сначала небольшое предисловие.

Я все еще немного новичок в VBA. Я пытался написать код для генератора случайных чисел. 8 ди git, альфанумери c. Я достиг этого, имея один лист, куда будет вставлен номер (Список), и другой лист, который скрыт там, где создан номер (Генератор). На листе генератора в столбце BI поместите AZ и 0-9, а затем в A1 эту формулу объединяли 8 раз: INDEX(B:B,RANDBETWEEN(1,36))

Это сработало очень хорошо. Затем я написал небольшой код для обработки повторов, а затем вставил результат в первую пустую ячейку в B: B на листе списка.

Но я хотел стать немного более креативным, и мне не хотелось менять индексную часть формулы 8 раз, если позже я захочу добавить строчные или специальные символы. Я хотел иметь возможность изменить это в одном месте, а затем остальные последуют их примеру. Таким образом, с concatenate у меня была ячейка с этим текстом в качестве значения: CONCATENATE (INDEX (B: B, RANDBETWEEN (1,36)), et c ...

Затем я использовал Evaluate в VBA, чтобы обработать это как формулу. Когда я напечатал это в непосредственном окне, он работал нормально. Поэтому я запустил код. Но он не будет работать. Наконец-то понял, что он ищет в листе списка для INDEX(B:B, так как это первая вкладка. Итак, я добавил Worksheets("Generator").Activate в надежде, что он посмотрит на нужный лист. Ничего не изменилось.

Затем я немного исследовал и попытался использовать Worksheet.Evaluate(), думая, что это сделайте свое дело. Но затем я получил либо ошибки #VALUE !, либо ошибки несоответствия типов.

Тем не менее, при попытке либо Application.Evaluate() с указанием рабочего листа, либо Worksheet.Evaluate() в непосредственном окне перед отладкой, оба параметры будут работать так, как я хочу. Но при запуске кода или попытке открыть окно сразу после начала отладки код не будет работать должным образом.

Вот фактический код:

Dim strRandNum As String
Dim lgLastRow As Long
Dim intCounter As Integer

lgLastRow = WorksheetFunction.CountA(Worksheets("List").Range("B:B"))
intCounter = 0

TryAgain:

Worksheets("Generator").Activate
' Original: strRandNum = Evaluate(Worksheets("Generator").Range("C1").Value)
strRandNum = Worksheets("Generator").Evaluate(Range("C1").Value)
If WorksheetFunction.CountIf(Worksheets("List").Range("B:B"), strRandNum) > 0 Then
    Calculate
    intCounter = intCounter + 1
    If intCounter = 5 Then
        MsgBox ("An error has ocurred. Contact your developer.")
       Exit Sub
    Else
    GoTo TryAgain
    End If
Else
End If

Worksheets("List").Range("B" & lgLastRow + 1).Value = strRandNum
Worksheets("List").Range("B1").Select
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...