2011-03-07 3 views
3

VBA에서 변수 및 함수에 대한 질문이 있습니다. 초기 질문이 애매하게되지 않기를 바라는 프로젝트에 정확히 포함시키지 않을 것입니다. 나는 이것이 요청 될 경우에 사용될 프로젝트를 설명 할 수있다.VBA 함수 및 변수

VBA에서 범용 변수를 만들어 모든 함수에서 사용할 수 있습니까?

예는 : (이 기능에있을 때)

지금 현재로
Dim testVariable As String 
Dim newVariable As String 

testVariable = "A" 

Function testFunction() As String 
    .... 
    newVariable = testVariable 
End Function 

, testVariable는

감사합니다

제시 Smothermon

답변

3

예 등의 기본 설정을 포함하는 모든 코드를 실행하지만, 값 할당은 절차 내에서 발생해야하기 전에 :

Public testVariable As String 
Public newVariable As String 

Sub SetTestVariable() 
    testVariable = "A" 
End Sub 

Function testFunction() As String 
    .... 
    newVariable = testVariable 
End Function 

은 일반적으로 나쁜 있음을 유의하십시오 프로그래밍 실습은 많은 전역 변수를 사용합니다. 변수 범위를 변수의 사용 범위로 제한하려고합니다. Scope of variables in Visual Basic for Applications

+0

답변 해 주셔서 감사합니다. 완벽하게 작동했습니다. 결과적으로 많은 다른 기능과 메인 서브 기능에서 사용해야하는 많은 변수가 있습니다. 비공개로 문제가 해결 될 수 있으므로 모듈 수준에 불과합니다. 내가해야 할 과제의 종류에 대한 조언이 있습니까? 지금 나는 더 많은 것이 추가 될 가능성이 높은 글로벌 변수가 필요한 변수가 10 개 있습니다. 다시 한 번 감사드립니다 –

+2

@ 제시 Smothermon - 클래스는 논리적 인 선택이 될 것입니다. 또한 변수 초기화를 클래스 자체에 캡슐화 할 수 있습니다. – Thomas

+0

@Thomas가 말했듯이. – mwolfe02

1

변수를 남겨 "빈"입니다 어떤 하위/함수에서든지, 그래서 그들은 세계가됩니다

그런 다음, init 함수는 같은 코드

Sub InitGlobalVars 
    testVariable = "A" 
End Sub 

Sub MyProjectMain 
    InitGlobalVars 
    .... 
    ... rest of code 
End Sub 
0

아주 간단한 예 : VBA의 범위에 대한 자세한 내용은 Microsoft 기술 자료 문서를 참조 전역 나쁜 관행이며, 값이 하위 내부에 할당되어야한다 : 다른 게시물에서 언급 한 바와 같이

Dim testVariable As String 
Dim newVariable As String 

Sub setVariable(ByVal x as string) 
    testVariable = x 
End Sub 

Function testFunction() As String 
    testFunction = testVariable 
End Function 

Sub test() 
    Call setVariable("A") 
    MsgBox testFunction() 
    Call setVariable("B") 
    MsgBox testFunction() 
End Sub 

/기능. 또한 모듈 시작 부분에 정의해야합니다.

2

모든 기능에서 사용할 수 있도록 VBA에서 범용 변수를 만들 수 있습니까?

, 당신은 mwolf02에 의해 명시된 범위를 선언 할 필요가 있지만. 그러나 VBA에서 수행 할 수없는 작업은 VBScript를 사용하는 것처럼 함수 또는 프로 시저 호출 외부에 채우는 것입니다.

또한 전역 변수가 실제로 필요한 경우 전역 변수와 로컬 선언 변수 (예 : g_ 접두어)를 구분하는 명명 체계를 사용해야합니다.

Public testVariable as String 

Public Sub Main() 
    Call Foo() 
    Call Bar() 
End Sub 

Public Sub Foo() 
    testVariable = "Foo" 
End Sub 

Public Sub Bar() 
    Dim testVariable As String 
    testVariable = "Bar" 
End Sub 

testVariable의 값은 Bar 나중에를 했더라도, "푸"입니다 :이 혼란 시나리오를 얻을 수 있습니다. 사실 동일한 이름의 로컬 변수를 선언 했으므로 Bar 내부에서 전역 변수 testVariable을 참조 할 방법이 없습니다.

+0

접두사 아이디어가있는 멋진 점 .... 나중에 변수를 변경할 수 없다는 것을 나에게 알리지 않았다. 감사합니다. –

+0

VB에서 제공하는 다른 언어 습득 방법을 사용하면 로컬로 선언 된 변수가 더 넓은 범위의 변수와 고유 한 이름을 가질 필요가 없습니다. 더 좁은 범위의 변수는 더 넓은 범위의 "앞에 서있다". – RolandTumble

0

또는 변수 대신 상수을 사용할 수 있습니다.

Public Const TESTVARIABLE = "A" 

나는 특정 기능 내에서 값을 설정하는 것이 아니라 귀하의 질문에 더 적합하다고 생각합니다.

Obs1 : 글로벌 상수는 (대개) 대문자로 저장됩니다.

Obs2 : 워크 시트 코드 내에서 전역을 상수로 설정할 수 없습니다. 특정 모듈 (예 : global.bas)을 사용하십시오.

Rgds