質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1325閲覧

なぜエラーが出る・・?

sigret

総合スコア45

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/03/20 00:41

現在選択したEXCELブックの中身をXMLファイルに書くマクロを作っています。
しかし「この操作は、ELEMENT型のノードでは実行できません」とエラーが出てしまいます。
問題ないように見えるのですが何がおかしいのでしょうか・・。
お願いします。

Sub XML() Dim TargetWorkbook As Workbook Dim OpenFileName As String Dim SheetName As String Dim x As String Dim y As String Dim i As Integer Dim Row As Integer Dim Col As Integer Dim xmlDoc As MSXML2.DOMDocument60 Dim xmlPI As IXMLDOMProcessingInstruction Dim xmlNode As Object Dim xmlObj As Object Set xmlObj = New MSXML2.DOMDocument60 Set xmlDoc = New MSXML2.DOMDocument60 Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")) Row = 3 Col = 2 ~中略~ Do While Col < 7 If TargetWorkbook.Worksheets(i).Cells(Row, Col).Value <> "" Then If Col = 2 Then Set xmlNode = xmlDoc.appendChild(xmlDoc.createElement("x")) If Col > 2 Then Row = Row - 1 Col = Col - 1 Do If TargetWorkbook.Worksheets(i).Cells(Row, Col).Value <> "" Then Set xmlNode = xmlDoc.appendChild(xmlDoc.createElement("x!")) Else: Row = Row - 1 End If Loop End If End If x = TargetWorkbook.Worksheets(i).Cells(Row, 7).Value y = TargetWorkbook.Worksheets(i).Cells(Row, 9).Value  ここでエラー発生→Set xmlNode = xmlNode.appendChild(xmlObj.createElement("x")) Set xmlNode = xmlNode.appendChild(xmlObj.createTextNode("y")) Col = 2 Row = Row + 1 Else: Col = Col + 1 End If Loop ~略~ End Sub

よろしくお願いします・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

nodeにelementを追加しようとしているからエラーなのでは?
.createElementではなくて、.createnodeじゃないでしょうか。

投稿2018/03/20 01:12

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーが出ている行に2つのSetが混在しているのは、コピペミスという前提で。
とりあえず実行してみましたが、質問されているエラーは発生しませんでした。
XMLの操作の仕方が正しいかまでは見ていませんが、xとyにセルの値を代入しているのにも関わらず、そのあと使っていないのは気になりました。
エラーが出ている行で"x"と書いていますが、これは変数xではなく文字列xを表します。
こうしたほうが良いと思われます。

VBA

1Set xmlNode = xmlNode.appendChild(xmlObj.createElement(x)) 2Set xmlNode = xmlNode.appendChild(xmlObj.createTextNode(y))

投稿2018/03/20 01:01

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigret

2018/03/20 01:17

た・・確かに(苦笑) これでは文字列ですね・・・。 しかしやはりこれでもエラーが出てしまいますね・・。 変数”x”、”y”に代入はして後に使っていない・・とのことですがこれは物理名のある(Row,7)、初期値のある(Row,9)を要素、テキストとしてXMLにセットしている・・という認識だったのですがこれも間違っているのでしょうか・・。(泣きたいw)
sazi

2018/03/20 01:18

teratailなんかバグってません? 多分マークダウン内の記述によるものでしょうけど、以降がグレーの網掛けで表示されてますね。
ttyp03

2018/03/20 01:20

"x"というノードを作りたいのか、Cells(Row,7)の値でノードを作りたいのか。 今は前者で、後者が正しいのでは?という回答になります。
ExcelVBAer

2018/03/20 01:21

確かになんかバグってるw
sigret

2018/03/20 01:22

ttyp03さん 後者が正しいです。
guest

0

ベストアンサー

2つの処理を書いてるのに、コンパイルが通ってるのでしょうか?

1行に2つの処理を書きたい時は、
1つの処理の後に「:」を記述すると書けることになってたはずなんですが。。。。

ただ、エラーメッセージを見るに、
Set xmlNode = xmlNode.appendChild(xmlObj.createElement("x"))
の処理で発生しているようですよね

上記処理も2つの処理があるので、下記の様に分けると、
どちらの処理でエラーが発生しているのか判明するかと。
Dim xlElement As Object
set xlElement = xmlObj.createElement("x"))
Set xmlNode = xmlNode.appendChild(xlElement)

投稿2018/03/20 00:51

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sigret

2018/03/20 01:07

ふ、、二つ処理を書いてる・・? 本当に申し訳ありません。もう少し噛み砕いて説明していただいてもよろしいでしょうか・・? 申し訳ないです・・?
ExcelVBAer

2018/03/20 01:11

ご提示のコードでは、下記の処理が1行に書かれていますよね? ここでエラー発生→Set xmlNode = xmlNode.appendChild(xmlObj.createElement("x")) Set xmlNode = xmlNode.appendChild(xmlObj.createTextNode("y"))
ExcelVBAer

2018/03/20 01:12

恐らく下記のように書かれていて、転記ミス、ということでしょうか? Set xmlNode = xmlNode.appendChild(xmlObj.createElement("x")) Set xmlNode = xmlNode.appendChild(xmlObj.createTextNode("y"))
sigret

2018/03/20 01:20

あ、そうです。ごめんなさい。「ここでエラー発生→」を入力したときにずれてしまい元の位置まで戻したら(y)の行も一緒に戻ってきてしまっていたみたいで・・。 記載していただいた通りであっています。<m(__)m>
ExcelVBAer

2018/03/20 01:23

では、下記のように処理を細かく分けて、正確なエラー箇所を判明させる方がいいですね Dim xmlElement As Object set xmlElement = xmlObj.createElement("x")) Set xmlNode = xmlNode.appendChild(xmlElement)
sigret

2018/03/20 01:41

んん・・。そうすると今度は同じ適用範囲内で宣言が重複している。。と出ます・・。 一度も宣言してないはずなのに・・。
ExcelVBAer

2018/03/20 01:46

あぁデバッグ時にコードを書き換えた時などになっちゃうやつですね。 挙動から予想するに、コンパイルがバグるケースがあると思っています。 ブックを保存して閉じて、開き直すか、 モジュール内のコードを全部切り取り、コンパイルを実行、元に戻す のどちらかで解消できますよ~
sigret

2018/03/20 01:55

解消は出来ましたが新たにエラーが・・(泣) set xmlElement = xmlObj.createElement("x") createElementに対してメソッドまたはデータメンバーが見つからない・・と出ます。
ExcelVBAer

2018/03/20 02:06

なんと。。。 直接関係ないかもですが、素朴な疑問で、 Dim xmlObj As Object は、 Dim xmlObj As MSXML2.DOMDocument60 としないのですか?
ExcelVBAer

2018/03/20 02:11

これも直接関係ないですが、 If Col > 2 Then は、 ElseIf Col > 2 Then と記述すべきかと。
ExcelVBAer

2018/03/20 02:12

これも直接関係ないですが、 TargetWorkbook.Worksheets(i) は、 Do ~ Loop の外で With TargetWorkbook.Worksheets(i) ~ End With とした方が見やすいし、処理も早くなります。
ExcelVBAer

2018/03/20 02:14

もし TargetWorkbook の全シートを回してるのであれば、 Dim Sheet As Worksheet For Each Sheet In TargetWorkbook.Worksheets と、Sheetを回す方法もあります。 ご参考まで。
sigret

2018/03/20 02:43

いろいろとありがとうございます。なんかごちゃごちゃしていたらIf Col > 2 Then →ElseIf Col > 2 Thenは自分で気づけました(笑) そして今エラーは解決し、ループ処理の中身に苦戦しています。 (その行が終わったら次に行きたいのにCol > 2 Then の処理のせいで無限ループしているw) 階層の紐付けって苦労しますね・・((+_+))
ExcelVBAer

2018/03/20 02:49

Do ~ Loop はミスると無限ループになって、応答不能になるので開発効率が悪い点があります。 自分はできるだけ For ~ Next で記述するよう習いましたし、今でもそうだと思っています。 きっちり、開始・終了の行・列を取得し、For文にできるものは変えた方が良いでしょう。
sigret

2018/03/20 03:02

なるほど・・ありがとうございます。一応無限ループも回避し出力もできました!・・が、出力順の階層になってしまっていたのでそこが直せれば完成です! ありがとうございます!<m(__)m>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問