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

このQ&Aのポイント
  • Excel2007 VBAで「実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません」となる場合、オブジェクトのプロパティの存在を判定する方法を教えてください。
  • コード中で objPrice の存在を確認することはできますが、objPrice の text プロパティが存在しない場合、値を取得する方法を教えてください。
  • <ccc>文字</ccc>の中の値(実際は数値)を取得したい場合、text プロパティは使用できないようですが、他に有効な方法があれば教えてください。
回答を見る
  • ベストアンサー

エラー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がないようなのでうまくいきません。 すみませんが、よろしくお願いします。

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

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

SelectNodesメソッドは、指定されたxPathにマッチするノードのリストを取得するメソッドです。 MsgBox TypeName(objPrice)を実行すると分かりますが、IXMLDOMNodeList型のオブジェクトが返ってきます。 objPrice.lengthで要素数が取得でき、 objPrice(0).textで1番目の要素の内容が取得できます。

yamakiyo2
質問者

お礼

ありがとうございましたm(__)m 解決し助かりました。 型の調べ方までありがとうございました。 型を調べて、メンバを見れば良いのですね。 ちょっと理解できました。

関連するQ&A

  • Excel-VBAでXMLの複数ノードの取り出し

    すみません、いつも、いろいろな方に助けて頂いていますが、また、初歩的な質問をさせて頂きます。 Excel2007のVBAでXMLの扱いが良くわかっておりません。 以下のプログラムで複数ItemのASINを出力したいのですが、うまくいきません。 XMLがきちんと取得できているのはWireSharkでキャプチャして確認できております。 VBAで表示出力するのがうまくいきません。ご教授方よろしくお願いします。 selectSingleNodeで一つの場合はうまく取り出せています。複数ノードの場合にSelectNodesの使い方に問題がありますでしょうか? 型の宣言などに誤りがありますでしょうか? また、基本的なことですが、MSXML2を使おうとしたら、Excel2007で使えませんでした。 XMLDOMは、サポート切れ?で古いので、MSXML2を使うのが良いとWebで見ました。 DLLなどが必要な気がしているのですが、よくわかっていないのでご教授頂きたいです。 すみませんが、よろしくお願いします。 *****VBAプログラム(抜粋)****** Dim xml As Object, xmlItems As Object, objPrice As Object 'XML オブジェクト作成 Set xml = CreateObject("Microsoft.XMLDOM") xml.async = False xml.Load URI Set xmlItems = xml.SelectNodes("ItemLookupResponse/Items/Item") For Each objPrice In xmlItems ' ASIN If Not objPrice.SelectSingleNode("ASIN") Is Nothing Then curWS.Cells(rowIndex, ASINCol) = objPrice.SelectSingleNode("ASIN").text End If Next *****取得したXML(抜粋)****** <ItemSearchResponse > <Items> <Item> <ASIN>111</ASIN> </Item> <Item> <ASIN>222</ASIN> </Item> <Item> <ASIN>333</ASIN> </Item> </Items> </ItemSearchResponse>

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

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

  • xmlの値を配列に格納したいんですけどエラーがでてしまう。

    <?xml version="1.0" encoding="UTF-8" ?> <Dataroot> <aaa> <bbb> <ccc>値1</ccc> </bbb> <bbb> <ccc>値2</ccc> </bbb> </aaa> </Dataroot> ---------------------------------------------------------------- のようなXML文書がある時<ccc></ccc>の値を取り出す場合 ---------------------------------------------------------------- Imports System Imports System.IO Imports System.Xml public class Sample public shared sub Main() Dim doc as XmlDocument = new XmlDocument() doc.Load("data.xml") 'XML文書の読み込み Dim root as XmlElement = doc.DocumentElement Dim nodeList as XmlNodeList nodeList = root.SelectNodes("/Dataroot/aaa/bbb")'/cccまでやる方が簡単 Dim node as XmlNode Dim ccclist() As String = Nothing for each node in nodeList ccclist(nodeList.Count) = node.SelectSingleNode("ccc").InnerText '内容の取り出し next end sub end class としているのですが ccclist(nodeList.Count) = node.SelectSingleNode("ccc").InnerText '内容の取り出し この行で オブジェクト参照がオブジェクト インスタンスに設定されていません。 とエラーがでて困っています。 これはどのように修正すればよろしいでしょうか? 教えてください。お願いします。

  • Folderオブジェクトでsubfoldersプロパティが使えない

    Excel2000のVBAで、ユーザーがダイアログで選択したフォルダのサブフォルダのコレクションを取得しようとしています。 次のようなコード1にしたら、oFolderオブジェクトでは「Subfoldersプロパティをサポートしていない」旨のエラーが出ます。そこで、もう一段関数をかませて、その関数中でSet oFileSys = CreateObject("Scripting.FileSystemObject")    Set folder1 = oFileSys.GetFolder(folder_name)のようにして、別途folderオブジェクトを作成し、コード1の「colFolder」へ返すようにしてみたところ、うまく動きました。下記コード1中の「oFolder」と上の関数内の「folder1」は、いずれもFolderオブジェクトなのに、プロパティの種類が違うのはなぜでしょうか? ちなみに、オブジェクトブラウザで調べると、Folderクラスには、subfoldersプロパティというのが確かにありません!が、VBのヘルプにはしっかりとFolderオブジェクトの中にSubfoldersプロパティが載っています。 <コード1> Function フォルダ選択(メッセージ As String) As Object Dim oShell As Object,oFolder As folder,colFolder As Object Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.BrowseForFolder(0, メッセージ, 1, "S:\")   If Not (oFolder Is Nothing) Then Set colFolder = oFolder.subfolders Set フォルダ選択=colFolder Else MsgBox "フォルダを選択しないと継続できません。" End;End If;END SUB

  • AccessVBAでオブジェクトの説明欄を取得したい

    ACCESS97のVBAにて開発をしています。 データベースウィンドウに表示される、各オブジェクトの説明欄の値を取得しようとしています。先日同様の質問内容に対していただいたアドバイスをもとに、DB内の全データベースオブジェクト(「テーブル」や「フォーム」の全てのテーブルやフォーム)を一括して取得しようとしているのですが、テーブル名は取得(デバックウィンドウに出力)できるのですが、説明欄の取得ができませんでした。 テーブルの場合のソースを以下に示しますが、どこがまずいのかご指摘願えないでしょうか? また、フォームの場合はどうすればよいか、あわせて教えていただけると大変助かります。 Dim myCont As Container Dim myDoc As Document Dim i As Integer Dim tds As DAO.TableDefs Dim td As DAO.TableDef Set tds = CurrentDb.TableDefs i = 0 For Each myCont In CurrentDb.Containers For Each myDoc In myCont.Documents If myCont.NAME = "Tables" Then If TableAndQuery(myDoc.NAME) = "Table" Then Set td = tds(i) Debug.Print td.NAME Debug.Print td.Properties("Discription").Value i = i + 1 End If End If Next Next Set td = Nothing Set tds = Nothing 初歩的な質問で大変申し訳ありませんが、よろしくお願いいたします。

  • マクロにてオブジェクトの線を太線にするには?

    テキストBOXとオブジェクトが数個混在しているシートにおいて、 1.テキストBOXは文字有りで枠線なし 2.オブジェクトは線あり の場合で、 ドラッグして選択した任意の個数のテキストBOXの文字は太字に                 オブジェクトの線は太線に 変更するマクロを作りたいのですが、よろしくおねがいします。 ちなみに、EXCELでは以下でOKです。 Sub aaa()   Dim SelOb As Object   Set SelOb = Selection   If TypeName(SelOb) = "DrawingObjects" Then     For Each DrOb In SelOb       If TypeName(DrOb) = "TextBox" Then        Selection.Font.Bold = True       Else        Selection.ShapeRange.Line.Weight = 1.5       End If     Next   End If   Set SelOb = Nothing End Sub

  • マクロエラー 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

  • vbaにて、オブジェクトエラー

    ただいまvbaで、ユーザーフォームとテキストボックスを用いて、数字のからまで、でフィルタリングするvbaをつくっています。 オブジェクトエラーがでてしまうのですが、 ちゃんとsetを入れているのになぜ出てしまうのでしょうか? また、その他何かご指摘あればいただきたいです。 何卒宜しくお願い致します。 Sub 集計開始() Dim drng As Range Dim kara As String, made As String Dim cnt As Long ActiveSheet.AutoFilterMode = False Set drng = Range("A1").CurrentRegion kara = Val(usetform1.TextBox1.Text) made = Val(usetform1.TextBox2.Text) If kara <> "" And made = "" Then drng.Worksheets("●●●").AutoFilter Field:=15, Criterial1:=">=" & kara ElseIf kara = "" And made <> "" Then drng.Worksheets("●●●").AutoFilter Field:=15, Criterial1:="<=" & made ElseIf kara <> "" And made <> "" Then drng.Worksheets("kwzweb").AutoFilter Field:=15, Criterial1:=">=" & kara, _ Operator:=xlAnd, Criteria2:="<=" & made Else MsgBox "数字を入力してください" Exit Sub End If End Sub

  • 範囲内の同名オブジェクトの削除

    任意の範囲にあるオートシェイプを削除しようとして、調べて見たところ下記のような例文がありました。 Dim Obj As Object Dim MyR As Range, CkR As Range Dim M_Range As Range For Each Obj In ActiveSheet.DrawingObjects Set MyR = Range(Obj.TopLeftCell, Obj.BottomRightCell) Set CkR = Intersect(MyR, Range("B25:CN27")) If Not CkR Is Nothing Then If CkR.Count = MyR.Count Then Obj.Delete End If Set CkR = Nothing End If Set MyR = Nothing Next これだと通常に貼り付けたシェイプは削除出来るのですが、やろうとしているシートにはグループ化したシェイプを複数コピーして貼り付けてあります。 その為だと思うのですが、上記の方法だと削除出来ません。 原因は名前が同じなのでObj.Deleteが実行できないのだと思います。 同名のオブジェクトがある場合削除する方法はあるのでしょうか? 実行したいのはシートの一部の範囲内だけです。 宜しくお願い致します。 尚、マクロの記録で行うと以下の様な状態です。 ActiveSheet.Shapes.Range(Array("グループ化 16", "グループ化 16", ・・・・)).Select Selection.Delete

  • SetとNothingの存在意味?

    数値とオブジェクトの変数セットはそれぞれ、 Dim num as integer num = 5 Dim obj as Object set obj = new From set obj = Nothing ですが、 オブジェクトの場合でインスタンスを生成しない、単なる参照?別名? の場合はNothingは不要でしょうか? Dim obj as Object For x = 1 to 10 set obj = Form2 ' newとインスタンスを生成するのではなく、単なる参照  obj.Caption = str(x) & "回目" 'set obj = nothingは不要? Next x