• 締切済み

VB6でユーザー定義型がNothingかどうか調べるには?

VB6でユーザー定義型がNothingじゃなかったら~処理~をするという事をしたいのですが 下記のように書くと「型が一致しません。」のエラーが出ます。 If Not ユーザー定義型 Is Nothing Then ~処理~ End If どのようにしたらユーザー定義型がNothingかどうか見分けられるのでしょうか?

  • rough
  • お礼率55% (11/20)

みんなの回答

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

他の方の指摘にあるように ユーザー定義型は、値型なので、Nothing には、なりません。 くだらない例ですが Type MyType a As String b As Integer End Type Public MyNothing As MyType '値が未設定な状態(デフォルト初期化状態) Public Sub test() Dim a As MyType If a.a = MyNothing.a And a.b = MyNothing.b Then MsgBox "yes" End If End Sub みたいにすればどうでしょう。 メンバがそれぞれ未初期化のものと同じであるかどうかは、function にするといいかもしれません。 (未初期化が有効な値を表す場合には使えません)

rough
質問者

お礼

いろいろやってみてたらよくわからないけど、 ↓のようにすると望んだように動いてくれました。 If Not Not ユーザー定義型 Then ~処理~ End If 回答ありがとうございました。

  • teiou68k
  • ベストアンサー率28% (202/721)
回答No.2

私が知ってる限り、On Errorとかを使って・・・という無理矢理な方法しかないです。 そういうわけで私は 構造体(ユーザー定義型)→クラス 配列→コレクション を使ってます。

rough
質問者

お礼

いろいろやってみてたらよくわからないけど、 ↓のようにすると望んだように動いてくれました。 If Not Not ユーザー定義型 Then ~処理~ End If 回答ありがとうございました。

回答No.1

>ユーザー定義型がNothingじゃなかったら ユーザー定義型とは? Type ユーザー定義型  aaa as string bbb as integer end Type と宣言してあって、 Dim 変数 as ユーザー定義型 で変数がNothingであるかどうかを知りたいということ? Nothingはオブジェクトに対しての比較なので、単なる型で定義されている変数はNothingにしようがありません。 この場合、Typeで型を宣言するのではなく、クラスを作成したら、質問者さんの望む事が可能かと思います。

rough
質問者

お礼

いろいろやってみてたらよくわからないけど、 ↓のようにすると望んだように動いてくれました。 If Not Not ユーザー定義型 Then ~処理~ End If 回答ありがとうございました。

関連するQ&A

  • 名前が二重に定義されています

    If 条件 then dim arry(2) arry(0)="null" arry(1)="null" arry(2)="null" else if 条件 then dim arry(2) arry(0)="0" arry(1)="0" arry(2)="0" elseif y(0)="1" then arry=split(x,",") end if end if と書いてみたのですが、arryのところで「名前が二重に定義されています」というエラーが出てしまいます。自分としてはif文の条件にあてはまらない限り中の処理を実行しないため、二重に定義してはいないと思っているのですが間違っているのでしょうか? if文の外に dim arry(2) と1回だけ宣言すればこのエラーは出なくなりますが今度はsplitの処理のところで「型が一致しません」というエラーが出ます。 これの原因または回避方法を教えてください。

  • 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 のように、長々と記述するのが間違えそうで・・・ 簡単に比較できると、楽です。

  • マクロエラー 1004 1004 アプリケーション定義またはオブジェクト定義のエラーです。

    下記のプログラムで 自分のパソコンでは正常に動くのですが 違うパソコンでは エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 セルの書式設定 → 表示形式  を変更するとエラーがでてしまいます。 自分のパソコンでは何をしてもエラーは出ません。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Private Sub CommandButton2_Click() Dim myShp As Shape Dim myR As Range, SR As Range On Error Resume Next Set myR = Range("G87:K96") If Err.Number <> 0 Then Exit Sub On Error GoTo 0 For Each myShp In ActiveSheet.Shapes Set SR = Range(myShp.TopLeftCell, myShp.BottomRightCell) If Not Intersect(SR, myR) Is Nothing Then myShp.Delete End If Set SR = Nothing Next Set myR = Nothing End Sub

  • vbスクリプトからexcelのVBAを起動したい。

    vbスクリプトからexcelのVBAを起動したいので、初心者ながら下記のようにコーディングしましたが、excelのVBA;main()が実行できません。  <excelのVBA;main()は単独では正常に起動します。> vbスクリプトからexcelのVBAの起動の方法を教えて下さい。 そのスクリプトをタスク(元旦)に起動したいです。 <vbスクリプト コーディング> dim exlApp On Error Resume Next set exlApp = createobject("Excel.Application") exlApp.visible = true exlApp.Workbooks.Open "C:\年賀状.xls" exlApp.run "Main" If Err Then WScript.Quit End IF If Not(exlApp Is Nothing) Then exlApp.Quit set exlApp = nothing End If

  • mySheet Is Nothing

    以下の処理を実行して、「代入されています。」というメッセージを表示したいのですが、 どのようにすれば良いのでしょうか? Sub 代入の確認() Dim mySheet As Worksheet If mySheet Is Nothing Then MsgBox "代入されていません。" Else MsgBox "代入されています。" End If End Sub

  • VB2005でのEXCELマクロ操作

    お世話になっております。 VB2005から指定したEXCELファイルを開き、標準モジュールにあるマクロを起動したいと考えております。 調べたところ、Runメソッドを使用するようですが、マクロファイルを開くところで停止してしまいます。 以下にソースを書きましたので、アドバイス頂きたいと思います。 Dim n As Short Dim xlApp As Excel.Application = Nothing Dim xlBooks As Excel.Workbooks = Nothing Dim xlBook As Excel.Workbook = Nothing Dim xlSheets As Excel.Sheets = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim Fname As String = "C:\Documents and Settings\hoge\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS" '読み込むファイル Try xlApp = New Excel.Application() xlBooks = xlApp.Workbooks For n = 0 To fil.Length - 1 xlBook = xlBooks.Open(fil(n)) xlSheets = xlBook.Worksheets xlApp.Run("'" & Fname & "'!module2.DB処理", fil(n)) '引数をもつ処理の呼び出し方法 '1000ミリ秒(1秒)待機する System.Threading.Thread.Sleep(1000) ' Excel ブックを保存する xlApp.DisplayAlerts = False xlBook.Save() Next ' Microsoft Excel を終了する xlApp.Quit() Finally If Not xlSheet Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) End If If Not xlSheets Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) End If If Not xlBook Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) End If If Not xlBooks Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) End If If Not xlApp Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) End If End Try

  • VB2005でDB接続後、DBを後からパスワードを付けた時のVB設定を教えて下さい。

    VB2005が超初心者ですがよろしくお願いいたします。 VB2005でACCESSのDBに接続後、後からパスワードをDBにつけた時のVB設定を教えて下さい。 -------------------------------- Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Accessファイルの絶対パス;Persist Security Info=False;Jet OLEDB:Database Password=パスワード 上記の事もやりましたが下記のエラーが出ます。 If (Me._connection Is Nothing) Then Me.InitConnection End If -------------------------------- 初心者の私ではこれ以上はいじれません。 簡単に設定出来ないでしょうか? よろしくお願いいたします。

  • エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

    例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。 それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。 簡略化すると以下のようなもので、一応正しく作動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Address(0, 0) Case "A1" MsgBox "A処理します。" Case "B2" MsgBox "B処理します。" Case "C3" MsgBox "C処理します。" End Select End Sub ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。 ( ̄~ ̄;) 定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。 (T.T) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Names.Name 'ここでエラー Case "入力A" MsgBox "A処理します。" Case "入力B" MsgBox "B処理します。" Case "入力C" MsgBox "C処理します。" End Select End Sub どうやったら、Targetに設定されている名前を取得できるのでしょうか? (^∇^`)? 実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。 If文の羅列(これでも正しく作動はします。) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub If Not Intersect(Target, Range("入力A")) Is Nothing Then MsgBox "A処理します。" ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then MsgBox "B処理します。" Else MsgBox "C処理します。" End If End Sub なにとぞよろしくお願いします。 (o。_。)oペコッ

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • Excel VBA ユーザー定義関数をイベントマクロで使用する

    Excel VBA ユーザー定義関数をイベントマクロで使用する Excel2003を使用しています。 あるセルと同色に塗りつぶされたセルの値を合計したく、下記1のユーザー定義関数を作成しました。 このユーザー定義関数を下記2のイベントプロシージャ内で呼び出して使用したいのですが、可能でしょうか? 可能であれば、どのようにコードを書いたらいいでしょうか? Call を使用するのかな?と思い、コードを追加してみましたが、引数の型が一致しないといった内容のエラーメッセージが表示されてしまいました。 よろしくお願いします。 ------------------------------------------------------------- 1.ユーザー定義関数(同色セルの合計) Function SumColor(hanni As Range, iro As Range) As Double   Dim myrng As Range   SumColor = 0    For Each myrng In hanni     If myrng.Interior.ColorIndex = iro.Interior.ColorIndex Then      SumColor = SumColor + myrng.Value     End If    Next myrng End Function 2.イベントマクロ(C列3行目以下ダブルクリックで塗りつぶし) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)   If Target.Column = 3 And Target.Row >= 34 Then    Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36   End If End Sub

専門家に質問してみよう