• ベストアンサー

VBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。 エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト が入っているかどうか検査したいのですがどうしたらいいでしょうか。 例えば--- Dim a As Workbook If a <> nothing then ←この部分が分からない。このままだとエラー。 処理 End if --------- 環境 エクセル2003 WinXPsp1

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

  • ベストアンサー
  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.3

もし、aが空だったら If a Is Nothing Then  もし、aが空じゃなかったら If Not a Is Nothing Then

lelion1000
質問者

お礼

ふむふむ

その他の回答 (2)

回答No.2

isを使ってください。

lelion1000
質問者

お礼

ほぉ

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

オブジェクトの比較には Is演算子を使います if a Is Nothing then とすれば aがNothingなのかをチャック出来ます

lelion1000
質問者

お礼

へー

関連するQ&A

  • VBAを始めたばかりです。

    VBAを始めたばかりです。 下記でエラー「オブジェクトが必要です」が出ます。 何故ですか。 Sub A_Sample048() Dim mySht1 As Object Dim mySht2 As Worksheet '準備ここまで Set mySht1 = ActiveSheet If mySht1.Type = xlWorksheet Then Set mySht2 = mySht1 MsgBox mySht2.Name Else MsgBox "最前面のシートはワークシートではありません" End If Set mySht1 = Nothing 'オブジェクトの解放 Set mySht2 = Nothing End Sub よろしくお願いします。

  • エラー438でオブジェクトのプロパティ存在判定方法

    基本的なところですみません。 Excel2007 VBAで「実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません」となります。 Dim xml As Object Dim objPrice As Object Dim tempWprd As Varient Set xml = CreateObject("Microsoft.XMLDOM") 省略(XMLデータを受信しxmlに代入) Set objPrice = xml.SelectNodes("AAA/BBB/CCC") If Not objPrice Is Nothing Then tempWord = objPrice.text ’★ここでエラー End If というようなコードです。 うまく取れることもあるのですが、objPrice は存在するがtextのメンバがいないということだと思いますが、存在を判定する方法をご教授させてください。そもそも<ccc>文字</ccc>の中の文字(実際は数値)を取得したい場合は、textはダメなのでしょうか? cccはNothingではないので存在しているように見えるのですが、textが使える場合と使えない場合があるのは理由があり、値がある場合に取得したいと考えています。 存在確認に関しては if (objPrice.text <> Null) then Empty,Nothingなどいろいろ試しましたが、そもそもtextがないようなのでうまくいきません。 すみませんが、よろしくお願いします。

  • VBAでオブジェクト取得

    VBAでIE10を制御しています。 http://okwave.jp/qa/q8035721.html を参考にしてコーディングしたのですが、 AccessibleObjectFromWindowでobjAccがNothingのままになってしまいます。 何が悪いのでしょうか? ' 通知バーボタン群のハンドル Dim hChild As Long hChild = FindWindowEx(lWndHnd1, 0&, "DirectUIHWND", vbNullString) Dim objAcc As IAccessible Ret = AccessibleObjectFromWindow(hChild, OBJID_CLIENT, IID_IAccessible, objAcc) If Not objAcc Is Nothing Then Ret = ClickPreserve(objAcc) End If

  • VB2008でのExcelオブジェクトの宣言と解放

    下記のようなコードを書きました。 Public Sub XXXXXXXXXXX Dim xlApp As New Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As New Excel.Worksheet try xlApp = CreateObject("Excel.Application") xlApp.Workbooks.Open(Filename:=excelTempPath, UpdateLinks:=0) xlBook = DirectCast((xlApp.Workbooks.Open(excelTempPath)), Excel.Workbook) シートのコピー、削除など操作 xlBook.Close(SaveChanges:=True, Filename:=strExcelPath) xlApp.Quit() Finally MRComObject(xlSheet) MRComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) xlApp = Nothing End Try End Sub Public Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) End If End If Finally objCom = Nothing End Try End Sub MRComObject(xlBook)でコンパイルの警告が出力されるのですが 回避する方法はないのでしょうか。

  • オブジェクトが必要です・・・・・

    オブジェクトが必要です・・・・・ すみません、判りません、丸投げです(爆)、申し訳ありませんがどなたか完成していただけませんか?;; また、この辺りをサルでも判るように解説してくれていて勉強し易いサイトがあったら教えてください・・・ Private Sub コマンド1_Click() Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSht As Excel.Worksheet Set xlsApp = CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Open("■■■■■.xls") Set xlsSht = xlsWkb.Sheets(■■■■) If xlsBook.ReadOnly Then xlsBook.Close MsgBox "そのファイルは既に開かれています。" xlsApp.Quit Else xlsBook.Close End If Set wkb = Nothing: Set xls = Nothing Exit_exOpenEditC: Exit Sub Err_exOpenEditC: MsgBox Err.Number & " - " & Err.Description Resume Exit_exOpenEditC End Sub accessからexcelファイルをシートを指定して開き、重複の場合は開かない様にし、メッセージボックスを表示させたいのです・・・

  • VBAがとまります。

    フォルダ内の全てのエクセルデータを一つにまとめたいのですが、 下記を実行すると、『実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。』のメッセージが出て先に進みません。対象のデータを開いて実行しても同様でした。 調べましたがよくわかりませんので、ご教示いただけませんでしょうか。 基本的なところかもしれませんが、よくわかりません。 どうぞよろしくお願いいたします。 ------------------------------------------------------- 'プログラム1|プログラム開始 Sub GetExcelDataInFolder() 'プログラム2|シート設定 Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'プログラム3|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New FileSystemObject 'プログラム4|対象フォルダを取得 Dim myfolder As Folder Set myfolder = fs.GetFolder(ThisWorkbook.Path) 'プログラム5|対象フォルダ内の全ファイルを処理 Dim myfile As File For Each myfile In myfolder.Files 'プログラム6|拡張子が「xlsx」のファイルのみを処理 If fs.GetExtensionName(myfile) = "xlsx" Then 'プログラム7|フォルダ内のエクセルを開いてシートを設定 Dim wb As Workbook Set wb = Workbooks.Open(Filename:=myfile) Dim ws2 As Worksheet Set ws2 = wb.Worksheets(1) 'プログラム8|開いたエクセルの最終行を取得 Dim cmax As Long cmax = ws2.Range("A65536").End(xlUp).Row Debug.Print myfile.Name & "のcmax=" & cmax 'プログラム9|開いたエクセルのデータを転記 Dim i As Long For i = 2 To cmax Dim cmax1 As Long cmax1 = ws1.Range("A65536").End(xlUp).Row ws1.Range("A" & cmax1 + 1 & ":E" & cmax1 + 1).Value = ws2.Range("A" & i & ":E" & i).Value Next 'プログラム10|エクセルを閉じる wb.Close 'プログラム11|オブジェクト解放 Set ws2 = Nothing Set wb = Nothing End If Next 'プログラム12|エクセルを保存 ThisWorkbook.Save 'プログラム13|オブジェクト解放 Set myfolder = Nothing Set fs = Nothing 'プログラム14|プログラム終了

  • VBAで、デバッグをお願いします。

    作りたいプログラムはpartsno_01から、partsno_20までのテキストボックスに、エクセルのセルA1から、A20までにある製品番号を入力し、データをsubmitするものです。 Sub pn() Dim ObjIE As Object Dim ObjShell As Object Dim ObjWindow As Object Dim WinExist As Boolean WinExist = False Set ObjShell = CreateObject("Shell.Application") For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.document) = "HTMLDocument" Then WinExist = True Set ObjIE = ObjWindow End If Next Set ObjShell = Nothing If Not WinExist = True Then MsgBox "製品番号検索を開いてください。" Exit Sub End If ObjIE.Visible = True Do While i < 21 i = 1 Set elements = ObjIE.document.getElementsByName("partsno_0" & "i") If elements Is Nothing Then Exit Sub End If elements.Item(0).Value = Worksheets(1).Cells(i, 1).Value i = i + 1 Loop End Sub で、 elements.Item(0).Value = Worksheets(1).Cells(1, 1).Value が常にエラーになります。 間違っていはいないと思うんですが・・・・。 何がいけないのでしょうか。

  • エクセル2000VBAでオブジェクトの指定

    エクセル2000VBAでオブジェクトの指定 ワークシート上にボタン、チェックボックス、コンボボックス等のコントロールがあります。(OLEオブジェクトではありません、フォームのオブジェクトです。) そして、それらのすべてが表示されているわけではなく、中にはVisible=False で非表示にされているものもあります。 またフォーム以外にもワードアート、ピクチャー等のオブジェクトも配置されています。 このうち、現在表示されているボタン、チェックボックス、コンボボックス等のコントロールだけを非表示にし、その後再度表示させたいのです。(最初から非表示のものは表示させない) 一応、以下のようなVBAコードで目的は達成されます。 Sub TEST01()   Dim ob As Object   Dim buf As Boolean, myAry As Variant   With ActiveSheet        Application.ScreenUpdating = False '画面更新停止     For Each ob In .DrawingObjects 'Shapesではダメ       If ob.Visible = True Then '可視なら         Select Case TypeName(ob) '以下に該当すれば選択           Case "Button": ob.Select (False)           Case "CheckBox": ob.Select (False)           Case "DropDown": ob.Select (False)           Case "Spinner": ob.Select (False)         End Select       End If     Next ob          If TypeName(Selection) <> "Range" Then '対象があれば       buf = True       Set myAry = Selection       .Range("A1").Select       myAry.Visible = False '非表示に     End If     Application.ScreenUpdating = True '画面更新停止解除          If buf Then       MsgBox "非表示にしました。"       myAry.Visible = True '表示       MsgBox "再度表示しました。"       Set varAry = Nothing     Else       MsgBox "非表示にする対象はありません。"     End If        End With End Sub 質問は2つですが、どちらかへの回答でもかまいません。 1.上記コードでは対象のオブジェクトをSelectしてから Set myAry = Selection で変数を定義しましたが、いちいちSelectしなくともよい方法を知りたいのです。 多分、対象のオブジェクトを配列に取り込めばいいのでしょうが、やり方がわかりません。 2.上記コードではいちいち Case "Button" Case "CheckBox" などと、コントロールの種類を列記していますが、これを列記しないでもコントロールだと識別する方法はないのでしょうか? お知恵をお貸しください。

  • オブジェクト??

    またまた困っております inputboxで入力した日付を検索して複数選択しようとしたのですが unionの使い方がよくわかりません(・・;) どこが間違っているのかもしくは何が足りないのか教えてください<m(__)m> どうかよろしくお願いします! Option Explicit Sub グラフ() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim grahu As Chart Dim target As Range Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then Set target = Union(target, "D" & i) Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i target.Select End With If msg <> "" Then MsgBox msg End If MsgBox "グラフベースを作成しました" End Sub Set target = Union(target, "D" & i) ↑ここでエラーが起きて 「オブジェクトが必要です」と言われました どうすればよいのでしょうか?

  • VBAでWebに値を入力

    VBAでWebに値を入力する操作を考えています。 エクセルシートのA1に入っている値をWeb上に入力する操作なのですが、 以下のコードを実行すると「AllLog.keyword.Value = t」の部分でエラーになります。 googleではkeywordのところを「q」、yahooではkeywordのところを「p」にすれば問題ないのですが、 神奈川中央交通のページではエラーになってしまいます。 なぜですか?? Sub google() Dim objIE As InternetExplorer '参照設定:Microsoft Shell Controls and Automation Dim objShell As Shell Dim WinFlg As Boolean Dim objWin As Object Dim AllLog As Object On Error GoTo EndProcess Set objShell = New Shell For Each objWin In objShell.Windows If TypeName(objWin) = "IWebBrowser2" Then WinFlg = True Set objIE = objWin Exit For End If Next Set objShell = Nothing If WinFlg = False Then MsgBox "IEオブジェクトが取得できません", vbCritical Exit Sub End If EndProcess: If Err() > 0 Then MsgBox Err.Description End If With objIE Set AllLog = .Document.all t = Cells(1, 1) AllLog.keyword.Value = t End With Set objIE = Nothing End Sub

専門家に質問してみよう