VB6で構造体(ユーザー定義型)の比較でエラーになる理由と解決方法

このQ&Aのポイント
  • VB6で構造体(ユーザー定義型)を比較する際にエラーが発生します。このエラーの原因として、構造体はポインタとして扱われるため、値の比較ができないことがあります。
  • VB6で構造体(ユーザー定義型)の比較を行うためには、各フィールドの値を個別に比較する必要があります。
  • エラーを回避するためには、比較演算子を使用してフィールドごとに値を比較する方法があります。ただし、フィールドの数が多い場合やネストした構造体の場合は、長くなる可能性があります。
回答を見る
  • ベストアンサー

VB6で構造体(ユーザー定義型)の比較でエラーになります。

VB6で構造体(ユーザー定義型)の比較でエラーになります。 仕様でしょうか? type TEST_STRUC x as integer y(0 to 10) as byte end type a as TEST_STRUC b as TEST_STRUC a.x = 1 b.x = 1 if a = b then    <--- ここでエラー msgbox("同じ") end if 強引でも比較できる方法があれば知りたいです。 項目ごとに比較するしかないのでしょうか if a.x = b.x then のように、長々と記述するのが間違えそうで・・・ 簡単に比較できると、楽です。

  • hdkoa
  • お礼率0% (1/117)

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Function TEST_STRUC_EQUAL(a As TEST_STRUC, b As TEST_STRUC) As Boolean Dim i As Integer If a.x <> b.x Then TEST_STRUC_EQUAL = False: Exit Function For i = 0 To 10 If a.y(i) <> b.y(i) Then TEST_STRUC_EQUAL = False: Exit Function Next TEST_STRUC_EQUAL = True End Function のような等値判定する関数を作って If TEST_STRUC_EQUAL(a, b) Then MsgBox ("同じ") End If のようにする

関連するQ&A

  • 構造体のコピー

    VB6ですが、構造体のコピーは正しくできるのでしょうか type a test1(0 to 5) as byte test2 as integer test3 as string end type dim b1 as a dim c1 as a b1.test = 2 c1 = b1 私はここで、c1.test2が0だった

  • 構造体に関するエラーについて(VB6.0→VB.NET)

    私はプログラミング初心者なのですが、 モジュールAにて Type test A_test() As String End Type Global AAA As test 他の複数のモジュールにて For i = 1 To 10 AAA.Atest(i) = "123"   ←(A) Next i VB6.0では上記のようなプログラムが問題無く動作するのですが、VB.net(2003)にてアップグレードし、実行すると他のモジュールの(A)のところにて"オブジェクト参照がオブジェクト インスタンスに設定されていません。"といったエラーが発生してしまいます。"AAA.A_test(i)"の値"Nothing"になっており、それが問題だと思うのですが対処法が分かりません。ご存知の方がおられましたら御教授宜しく御願いします。

  • マインスイーパーもどき(VBA)

    ExcelのVBAでマインスイーパーもどきを作っていますが、どうも上手くいきません。9が地雷で0が何もないと言うことです。以下、ソースです。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer, x As Integer x = 0 Randomize For i = 1 To 20 a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then x = x + 1 i = i - 1 End If minefield(a, b) = 9 Next i MsgBox "地雷が" & x & "回重複" countMine minefield, 10, 12 showInt minefield, 10, 12 show minefield, 10, 12 End Sub Sub show(f() As Integer, h As Integer, w As Integer)  Dim a As Integer, b As Integer For a = 1 To 10 For b = 1 To 12 If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " Next b Next a End Sub If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " の部分でコンパイル時に 「コンパイルエラー:修正候補 識別子」 とでます。ヘルプを見てもよくわかりませんでした。 テキストが長すぎるので途中は省きました。 よろしくお願いします。

  • VB6.0 →VB2005 のアップグレードでエラー表示

    VB6.0の標準モジュールでは Private Type typset a As String b As String c As Integer End Type Public make() As typset と記述してエラーもなく正常なのですが、VB2005にアップグレードしたときに、 Option Strict Off Option Explicit On Module Module1 Private Structure typset Dim a As String Dim b As String Dim c As Integer End Structure Public make() As typset←▼エラー▼            End Module 【エラー内容】 'make' は、module 'Module1' をとおして型 'typset' を namespace 'WindowsApplication1' で公開することはできません。 structure部をPublicなどにしてもエラーは消えますが、参照先に影響が出てしまいます。 根本的な解決方法が分かりません。 教えていただけないでしょうか?

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • A、Bさんが記入した明細をクロスチェックするマクロ

    EXCEL2007でAさんが記入した売上と明細のBOOKがあります。また、Bさんが記入した売上と明細のBOOKがあります。同じフォルダーにあります。Aさんの明細とBさんの明細をマクロでクロスチェックをかけ、BさんのBOOKに”Sheet1"を新たに作成して、Aさんの明細を正解として、Bさんの明細と比較して違いをBさんの明細に色を付けて、新たに作成した”Sheet1"にも色を付けたいのですが、下記のマクロでは上手く動作しません。どうしたら動作するのでしょうか?ご教授願います。10月5日までには、上司に見せなくてはならないので、初めてですが、どうか宜しくお願い致します。 Option Explicit Dim bookname1, bookname2 As String Dim sheetname1, sheetname2, sheetname3 As String Sub 管理部様式Aの比較() Dim a, b, d, e a = MsgBox("比較元のAを指定して下さい。", vbOKCancel) If a = 2 Then End End If b = Application.Dialogs(xlDialogOpen).Show If b = False Then End End If On Error Resume Next bookname1 = ActiveWorkbook.Name Workbooks(1).Activate d = MsgBox("比較されるBを指定して下さい。", vbOKCancel) If d = 2 Then End End If e = Application.Dialogs(xlDialogOpen).Show If e = False Then End End If On Error Resume Next bookname2 = ActiveWorkbook.Name Dim ws1 As Object Dim ws2 As Object Set ws1 = Workbooks(bookname1).Worksheets("明細") 'シートの名前をストリングとして変数ws1に代入する Set ws2 = Workbooks(bookname2).Worksheets("明細") 'シートの名前をストリングとして変数ws2に代入する Dim i As Integer, j As Integer, k As Integer, l As Integer, x As Integer, y As Integer 'カントの変数 i = Application.InputBox(Prompt:="比較したいセルの列方向の一番初めの列数値を入力して下さい左上隅(A,B,・・・)の数値", Type:=1) If i <> False Then End If j = Application.InputBox(Prompt:="比較したいセルの列方向の一番終りの列数値を入力して下さい右上隅(AA,AB,・・・)の数値", Type:=1) If j <> False Then End If k = Application.InputBox(Prompt:="比較したいセルの行方向の一番初めの行数値を入力して下さい左上隅(1,2,・・・)の数値", Type:=1) If k <> False Then End If l = Application.InputBox(Prompt:="比較したいセルの行方向の一番終りの行数値を入力して下さい左下隅(11,12,・・・)の数値", Type:=1) If l <> False Then End If '================================================================================== Sheets.Add After:=Worksheets(Sheets.Count), Count:=1 'sheet1を作成終了。 Dim ws3 As Object Set ws3 = Workbooks(bookname2).Worksheets("Sheet1") 'bookname2のWorksheetsの名前をSheet1としている。 '================================================================================== Dim c As Integer c = 0 For y = k To l For x = i To j If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then '値が一致した場合何もしない。 Else ws2.Cells(y, x).Interior.ColorIndex = 3 '================================================================================== Worksheets("Sheet1").Select Range(y, x).Select ws3.Cells(y, x).Interior.ColorIndex = 3 '================================================================================== c = c + 1 End If '比較の判定終了。 Next x Next y '================================================================================== If c > 0 Then MsgBox "エラーが" & c & "セルあります。" 'Debug.Print c; Else MsgBox "終了" 'マクロの終了をWindows標記で示す End If ErrorHandler: End Sub 'マクロの終了

  • ユーザー定義関数の再計算

    ユーザー定義関数を作りました。 ところが、この関数が自動再計算をしてくれません。 どうしたら自動再計算するようになるのでしょうか? よろしくお願いします。 ちなにこの関数は、自分のシートのB2とsheet1~sheet4のB9を比較して、正しければB9の4つ右のセルの値を合計して返すものです。 =SheetLook($B$2,"sheet1,sheet2,sheet3,sheet4",B9,4) コードです。 Function SheetLook(参照元 As Variant, 比較対象シート As String, 比較対象セル As Range, 参照セル位置 As Integer) As Variant   Dim i As Integer   Dim rng As Range   Dim sss As Variant   Dim kei As Variant   Dim cnt As Integer   sss = Split(比較対象シート, ",")   kei = 0   cnt = 0   For i = 0 To UBound(sss)     Set rng = Sheets(sss(i)).Range(比較対象セル.Address)     If 参照元 = rng Then       kei = kei + rng.Offset(0, 参照セル位置)       cnt = cnt + 1     End If   Next   If cnt <> 0 Then     SheetLook = kei   Else     SheetLook = ""   End If End Function

  • VB IF なぜ構文エラーにならないのですか?

    Dim x, y, z As Integer x = 1 y = 1 z = 1 If x = y And y = z Then MessageBox.Show("OK") End If 3つの値が同じならアラートを出したいのです。このソースでできるかとおもいます。。。 しかし・・・・ If x = y = z Then MessageBox.Show("OK") End If とするとアラートが出ません。関数的に使い方が間違っているのでしょうか? もしそうならなぜ構文エラーが出ないのでしょうか? よろしくお願いします。 言語Microsoft Visual Basic 2008 Express Edition

  • 定数を構造体で・・・

    こんにちわ。 ちょっと疑問に思いまして、お聞きしたいのですが。 VB.net2005を使用しています。 定数宣言を構造体で宣言するのは 考え方として変でしょうか? たとえば public structure TEST   public dmy as byte '←エラー解除のダミー   public const CNUM as integer = 1 end structure public sub testM()   Lbl1.Text = TEST.CNUM end sub のように作り 定数宣言が多くあった場合に いちいちページ切り替え等をしなくても TEST.と打った後にすぐに一覧がでてくるので 便利だと思ったのですが。 この考え方はやっぱりへんなんですかね? もともとC言語出身なもので、 色々試していて疑問におもったのです。 もっとほかによい方法あるよ!ってのが あればお教えください。 お暇なときでよいので回答お願い致します^^   

  • [と”の意味を教えてください。

    http://okwave.jp/qa/q5945112.html を参考に、 Sub test1() Dim i As Integer i = 2 If i Like "[1-3]" Then MsgBox i & "です" End If End Sub Sub test2() Dim i As Integer i = 2 If i Like "[1-5]" Then MsgBox i & "です" End If End Sub Sub test3() Dim i As Integer i = 2 If i Like "[1-10]" Then MsgBox i & "です" End If End Sub を作ったのですが、 test3はうまく行きません。 意味としては、 iが "[1-10]"の中の数字の間のどれかであれば、 MsgBox i & "です" を表示させたいです。 でも上記のマクロを実行させた結果、 "[1-10]"の中で計算が行われてるのではないかと思います。 だから、test3は、1-10=-9 という事になり、msgboxが反応しないのではないかと思っています。 でもそうすると、test2だって "[1-5]"は、-4になって、i=2とは違う値なのに なぜMsgBoxが反応してしまうのかわかりません。 でもそもそも[と”の意味が分からないのでそこから教えていただけませんか? “の意味、は二つで挟んで文字列にすると思っています。

専門家に質問してみよう