Сначала небольшое предисловие.
Я все еще немного новичок в 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