2015-03-26 2 views
1

Удовлетворение работы переменных при использовании в заявлении Case. Похоже, они заявлены в первом случае, независимо от того, относится ли это дело.VBA Variable Scope в случае Case

'The following code will throw an error 

Select Case team 
    Case "Philadelphia Eagles" 
     dim record as String 
    Case "Dallas Cowboys" 
     dim record as String 
End Select 

Даже если «команда» не Philadelphia Eagles, он утверждает, что я уже объявил переменную «запись»

я был под впечатлением, что ничего в сазе было полностью пропускается, если этот случай не имеет отношения к делу.

'The following code works 

Select Case team 
    Case "Philadelphia Eagles" 
     dim record as String 
    Case "Dallas Cowboys" 
     record = "8-8" 
End Select 

Просто хочу подтвердить, что я правильно понимаю положение дел здесь.

Спасибо!

Джош

+1

Объявление переменной рассматривается до ввода кода в область действия (глобальная или локальная). Вы можете протестировать его, отлаживая код (вы увидите, что строка с «Dim ...» пропущена. Следовательно, не имеет значения, является ли объявление внутри или вне предложения 'Case', когда ваш код запускается если вы хотите изменить тип в зависимости от случая, объявите 'As Variant'. –

+0

Хорошее объяснение объявляющих переменных можно найти здесь: [Переменные и типы данных] (http://www.functionx.com/vbaexcel/Lesson03.htm) –

ответ

2

Объявления переменных (Dim заявления) разрешаются в начале выполнения программы, поэтому ваши Dim record заявления не были «пропущены» через в вашем примере.

Вы должны поместить объявления переменных один раз в верхней части кода сразу после запуска подпрограммы или функции. Вы не можете использовать Dim по одной и той же переменной дважды. Если переменная представляет собой массив, который вам нужно изменить, вы можете вместо этого использовать ReDim [Preserve].

Sub Subname() 
    Dim record as String 

    Select Case team 
     Case "Philadelphia Eagles" 
      record = "16-0" 
     Case "Dallas Cowboys" 
      record = "8-8" 
    End Select 

End Sub 
+0

Хорошее объяснение! Исключение из этого правила (вида) является условной компиляцией, но это не касается этого вопроса :) –