2009-05-15 2 views
3

私はVB6(そしてどのような形式でもビジュアルベーシック)の開発に慣れていません。以下の字句エラーがあるかもしれません。なぜなら、私はコードをここでは少し読みやすくするように書いていたからですが、質問の本質は残っています。ここにコードがありますVB6のバリアントは、いつ割り当てられるかによって変わるのですか?

私の問題は、変数scrWordとresWordにいつ割り当てるかによって、MsgBoxの呼び出し(変数scrWordとresWordを参照するもの)の値が異なることです。上記のコードでコメントを外した最初の場所の変数scrWordとresWordに変数を代入すると、コードの最下部にあるメッセージボックスに、興味のない文字列が表示されます(たとえば、最初のメッセージボックスでは"srcws:resColNum:#"のような出力)、またはガベージ・データと思われるものがあります。これは、前のメッセージボックスで使用した静的な文字列を変数scrWordに代入したことに注意してください。これは決して意図された動作ではなく、私はどのように起こっているのか分かりません。

一方、上記のコードで変数代入がコメントされているメッセージボックスの直前で代入が行われた場合、変数は予期されているものとは多少異なる値を出力します正確に(通常、2つの変数はまったく同じです。あるいは、両方が異なるアルファ文字列であると予想される場合は1つの数値が数値です)。

私はこの問題に悩まされています。私は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を持っていますか?

あなたはタイプミスがあります:あなたはここで、いくつかの一般的な考えやアドバイスVB6に新しく追加されたと述べたようscrWord

+0

Noted、それは私のコードのタイプミスでした。ただし、resWordの表示は同じように動作し、ランダムな文字列(たとえば「resColNum:」)を表示します –

+0

宣言されていない変数をキャッチするにはOption Explicitを必ず使用してください –

3

対srcWordを。

最初のアドバイスとして、が本当にである必要がない限り、バリアントを使用しないでください。期待する具体的なデータ型を使用します。 MSDNには、バリアントが内部的にどのように機能するかについての説明があります。バリアントを比較する際に暗黙のコンバージョンが発生するため、実際にデータを知らないとギャンブルが発生します。

GetData関数がVariantを返しても、そのシート列の特定のデータ型に再実行値をキャストできます。だから、あなたの列が文字列だけを保持している場合は、CStr()を使って文字列にキャストし、それを文字列変数に入れます。数値と同じ、倍精度または長整数型の変数。

また、VarType関数を使用して、バリアントに格納されている値の実際の型を判別することもできます。次

デバッグワークフローの詳細ですが、多分それはあなたがあなたの問題を追跡できます:

  1. 宣言されていない/スペルミス変数の問題を回避するために、明示的なオプションを有効にします。 (すでにDJが述べたように)

  2. 各行の後にデバッグ出力を生成して、期待どおりの値を持っていることを確認します。ステップスルーのデバッグやDebug.Printが不可能な場合は、外部ログファイルにログを記録したり、MsgBoxを使用したりできます。

  3. テストのためにソースを外部コンポーネントの依存関係から切り離します。あなたのケースでは、外部グリッドからデータを読み取っていない間に問題を再現してみてください(たとえば、変数をいくつかの具体的な文字列に設定するなど)。次に、問題がプログラミングロジックにあるのか、処理しなければならないデータにあるのかを知ることができます。

  4. 外部データソースが実際に期待しているものであり、他にはないものを常にダブルチェックしてください。 (私にはしばしば起こります...)あなたのグリッドが(i、j)に保持するデータと、それがあなたが得るデータと一致するかどうかを確認してください。

もう1つポイント:VB6では、モジュール比較/クラス/フォームの上部に "Option Compare Text"を入れない限り、文字列比較では大文字と小文字が区別されます。だから "こんにちは世界" <> "こんにちは世界"。