2009-05-15 4 views
3

저는 VB6 (그리고 어떤 형식 으로든 시각적 인 기본) 개발에 익숙하지 않고 문제를 보았습니다. 아래에 어휘 오류가있을 수 있습니다. 왜냐하면 내가 코드를 좀 더 읽기 쉽도록 형식화했기 때문입니다. 그러나 문제의 본질은 그대로 남아 있습니다. 다음은 코드입니다내 VB6 변형이 할당시기에 따라 달라지는 이유는 무엇입니까?

내 문제는 변수 scrWord 및 resWord에 할당 할 때 MsgBox 호출 (변수 scrWord 및 resWord를 참조하는 두 번째 집합)에 표시된 값이 서로 다릅니다. 위에 표시된 코드에서 주석 처리되지 않은 첫 번째 위치의 변수 scrWord 및 resWord에 할당하면 코드 하단의 메시지 상자에 관심이없는 문자열이 표시됩니다 (예 : 첫 번째 메시지 상자에서 "srcws : resColNum : #"와 같은 출력) 또는 가비지 데이터로 보이는 것. 이것은 이전 메시지 상자에서 사용 된 정적 문자열을 scrWord 변수에 할당했다는 것을 의미합니다. 이것은 결코 의도 된 행동이 아니며 나는 그것이 어떻게 일어나고 있는지 전혀 모른다.

반면에 위의 코드에서 변수 할당이 주석 처리 된 메시지 상자 바로 전에 할당이 수행되면 변수는 예상보다 다소 다른 값을 인쇄하지만 그렇지 않은 경우 정확하게 (일반적으로 두 변수가 정확히 같거나 하나가 숫자가 다른 알파 문자열이 될 것으로 예상되는 경우).

나는이 문제에 당황하고있다. 그리고 나는 Variant 데이터 형식을 반환하는 GetData 호출과 관련이 있다고 생각한다.

는 에반

새로운 코드는 아래 게시, 감사합니다. 아직도 작동하지 않습니다.

Dim srcWord As Variant 
Dim resWord As Variant 

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True) 
    Dim groupmismatch As Boolean 

    groupmismatch = False 

    For j = 1 To FormHyst.GroupList.ListCount 


     srcWord = sourceWS.Columns(j).GetData(i, 1) 
     resWord = "hello, world" 



     MsgBox ("srcws:" & srcWord & vbNewLine &_ 
       "resws:" & resWord & vbNewLine &_ 
       "test:" & (resWord <> srcWord)) 
    Next 
Loop 

이 새 코드에서는 srcWord와 resWord가 모두 "hello, world"로 표시됩니다.

여전히이 동작을 이해할 수 없습니다.

+0

디버거로 코드를 실행 해 보았습니까? VB6 디버거는 꽤 괜찮습니다. 이렇게하면 MsgBox 호출을 뿌리는 것보다 예기치 않은 동작의 원인이 훨씬 잘 표시됩니다. – Tomalak

+0

호스트 응용 프로그램을 확장하는 DLL을 작성하고 있습니다. VB6 디버거가 좋지만 호스트 응용 프로그램을 실행해야하는 경우 디버깅하는 방법이 확실하지 않습니다. 그렇지 않으면 "GetData"에 대한 호출에 대상이 없습니다. –

+0

sourceWS 및 resultWS 개체 란 무엇입니까? Excel 워크 시트? –

답변

1

 

    Dim srcWord As Variant 
    Dim resWord As Variant 

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True) 


    For columnnum = 1 To FormHyst.GroupList.ListCount 

     scrWord = (sourceWS.Columns(columnnum).GetData(rownum, 1)) 
     resWord = (resultWS.Columns(columnnum + 3).GetData(grouprownum, 1)) 

     MsgBox ("srcColNum:" & columnnum & vbNewLine & "srcRowNum:" & _ 
        rownum)  MsgBox ("resColNum:" & (columnnum + 3) & vbNewLine & "resRowNum:" & _ 
        grouprownum) 


     MsgBox ("srcws:" & srcWord) 
    Next            
Loop 

 

은 당신이 (resWord <> srcWord)

+0

"true"또는 "false"문자열을 표시하려고했습니다. while 루프 외부에서 Dim을 이동하면 아무 것도 수행되지 않음 –

+0

다른 메시지 상자를 제거해도 아무런 효과가 없습니다. 내 새 코드를 반영하도록 질문의 본문을 편집합니다. 극적으로 단순화되어 여전히 기능을 수행하지 못합니다. resWord와 scrWord는 모두 내 프로그램에서 임의의 문자열 구성 요소에 의해로드되거나 언로드되는 휘발성 문자열처럼 작동합니다. –

2
에서 "true"또는 "false"로 끝날 것이다

MsgBox ("resws:" & resWord & vbNewLine & "test:" & (resWord <> srcWord)) 

어떤 의미를하지 않습니다 다음 시도

모듈 상단에 Option Explicit가 있습니까 ???

당신은 오타가 있습니다 srcWord를 scrWord

+0

Noted, 그건 내 코드의 오타였습니다.그러나 resWord의 디스플레이는 여전히 동일한 방식으로 작동하고 임의의 문자열 (예 : "resColNum :")을 표시합니다. –

+0

선언되지 않은 변수를 더 잡으려면 Option Explicit을 사용해야합니다. –

3

대 당신이 여기에, VB6에 몇 가지 일반적인 생각과 조언 새로운 말했듯이.

첫 번째 조언으로, 이 실제로는에 필요하지 않는 한 변종을 사용하지 마십시오. 예상 할 구체적인 데이터 형식을 사용하십시오. MSDN에는 Variants가 내부적으로 어떻게 작동하는지에 대한 설명이 있습니다. 변형을 비교할 때 암시 적 전환이 발생하므로 데이터를 실제로 알지 못하는 경우 일종의 도박 행위입니다.

GetData 함수가 Variant를 반환하는 경우에도 해당 시트 열의 특정 데이터 형식으로 다시 실행 값을 캐스팅 할 수 있습니다. 따라서 열에 문자열 만 있으면 CStr()을 사용하여 문자열로 캐스팅하고 문자열 변수에 넣으십시오. 같은 숫자, 이중 또는 긴 변수로.

또한 VarType 함수를 사용하여 Variant에 저장된 값의 실제 유형을 확인할 수도 있습니다. 다음

디버깅 작업 흐름의 이상이지만, 어쩌면 당신이 당신의 문제를 추적하는 데 도움이 :

  1. 선언되지 않은/맞춤법이 틀린 변수 문제를 방지하기 위해 명시 적 옵션을 사용합니다. (이미 DJ가 언급 한대로)

  2. 각 행 다음에 디버그 출력을 생성하여 예상 한 값을 가지며 다른 것이 아닌지 확인하십시오. 디버깅이나 "Debug.Print"를 통해 단계를 수행 할 수 없다면 외부 로그 파일에 로그온하거나 MsgBox를 사용할 수 있습니다.

  3. 테스트를 위해 소스를 외부 구성 요소 종속성과 분리하십시오. 귀하의 경우에는 외부 그리드에서 데이터를 읽지 않는 동안 문제를 재현 해보십시오 (예 : 변수를 구체적인 문자열로 설정). 그런 다음 문제가 프로그래밍 논리에 있는지 아니면 처리해야하는 데이터에 있는지를 알 수 있습니다.

  4. 외부 데이터 원본이 실제로 예상 한 것일뿐 아니라 다른 데이터 원본이 아니라는 것을 항상 두 번 선택하십시오. (나에게 자주 일어난 일은 ...) 그래서 당신의 그리드가 (i, j)에서 보유하고있는 데이터와 당신이 얻은 데이터와 일치하는지 확인하십시오.

또 하나 개의 포인트 : 문자열 비교는만큼 당신이 넣어하지 않는 모듈/클래스/양식의 상단에있는 "옵션 텍스트 비교", 경우 VB6에 민감하다. 그래서 "hello world"<> "Hello world".

관련 문제