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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

VBA

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

Q&A

解決済

1回答

1010閲覧

VBAでXMLファイル作成

peCopeCo

総合スコア2

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

VBA

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

1グッド

0クリップ

投稿2023/07/01 17:37

実現したいこと

エクセルファイルからXMLを作成するVBAを作成中です。

具体的には
A9にセル9  P9にCell9
B10にセル10 P10にCell10
C11にセル11 P11にCell11
C12にセル12 P12にCell12
B13にセル13 P13にCell13
の値があった場合
下記のようなXMLを作成したいです
<Cell9 Japanese="セル9">
<Cell10 Japanese="セル10">
<Cell11 Japanese="セル11" />
<Cell12 Japanese="セル12" />
</Cell10>
<Cell13 Japanese="セル13" />
</Cell9>
P列に英語の値が入りA列~O列の一か所に日本語の値が入ります
そこで下記のようなソースを作成しましたが
A列~O列の値を読み込むことができません
Set currentColumn = ws.Range(startColumn & rowIndex & ":" & endColumn & rowIndex).Columns(columnIndex + 1)
でA列~O列で空白以外の値が存在している箇所を取得できる想定なのですが取得できません。
何が間違っているのでしょうか?
ご教授をお願い致します。

該当のソースコード

VBA

1Sub CreateXMLElements(ws As Worksheet, xmlDoc As Object, parentElement As Object) 2 Dim lastRow As Long 3 lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row 4 5 If lastRow >= 9 Then ' 行番号が10行目から始まる場合、lastRowが9以上である必要があります。 6 7 Dim rowIndex As Long 8 For rowIndex = 9 To lastRow Step 1 ' 行番号が10行目から始まる場合、rowIndexは9から始まる必要があります。 9 10 Dim elementName As String 11 Dim elementValue As String 12 13 elementName = ws.Cells(rowIndex, "P").value 14 elementValue = ws.Cells(rowIndex, "A").value 15 16 If elementName <> "" Then 17 Dim element As Object 18 Set element = xmlDoc.CreateElement(elementName) 19 element.setAttribute "Japanese", elementValue 20 21 parentElement.appendChild element 22 23 Dim startColumn As String 24 startColumn = "A" 25 Dim endColumn As String 26 endColumn = "O" 27 28 Dim currentColumn As Range 29 Dim columnIndex As Integer 30 columnIndex = 0 31 Set currentColumn = ws.Range(startColumn & rowIndex & ":" & endColumn & rowIndex).Columns(columnIndex + 1) 32 Do While Not IsEmpty(currentColumn) 33 columnIndex = columnIndex + 1 34 elementName = ws.Cells(rowIndex, "P").value 35 elementValue = ws.Cells(rowIndex, columnIndex).value 36 If elementValue <> "" Then 37 Dim childElement As Object 38 Set childElement = xmlDoc.CreateElement(elementName) 39 childElement.setAttribute "Japanese", elementValue 40 element.appendChild childElement 41 End If 42 43 Set currentColumn = ws.Range(startColumn & rowIndex & ":" & endColumn & rowIndex).Columns(columnIndex + 1) 44 Loop 45 End If 46 Next rowIndex 47 End If 48End Sub
takanaweb5👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/07/02 01:47 編集

「取得できません」とのことですが、どのような結果を以て「取得できません。」と判断されたのでしょうか。 こちらでサンプルでワークシートのデータを自作し、テストで作った関数から簡易的にCreateXMLElements関数を呼び出したところ、CreateXMLElements 自体は正常に動作しました。 (実行中にブレークポイントを設定して、ローカルウィンドウを確認したところ、appendChildの部分で子要素も正常に追加できています) おそらく、質問では省略されている「結果を出力するコード」を実行すると、何も取得できていないから「取得できません」と書かれているのではないかと推測します。 または、元となるワークシートのつくりに問題があったり、そもそもCreateXMLElementsを呼び出す関数が想定通りになっていない可能性があります。 しかし、書かれていない以上、こちらではどうすることもできません。 ・ワークシートの元データの画像 ・CreateXMLElements関数を呼び出すコード ・CreateXMLElementsの結果を受け取り出力するコード まで含めて、ご自分の判断で省略せず「すべて」記載していただけると、こちらも「どこで躓いていらっしゃるのか」について再現し解析しやすいです。 また何かエラーが出ているのであれば、エラーが出た個所とその内容について省略せず記載してください。 追記する場合は、コメントに書かれるとインデントがなくなり読みづらいので、必ず質問の編集ボタンをクリックして質問欄に追記してください。
guest

回答1

0

ベストアンサー

おそらくですが、各行の先頭列からスキャンしていって、途中で空欄のセルがあったらすぐ次の行に移ってしまう点を以て「取得できません」と表現されているのではないでしょうか。
であれば、下記のように、空欄のセルがあってもそのセルだけ飛ばして隣の列に移るようにすればよいと思います。

vba

1Sub CreateXMLElements(ws As Worksheet, xmlDoc As Object, parentElement As Object) 2 Dim lastRow As Long 3 lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row 4 5 If lastRow >= 9 Then ' 行番号が10行目から始まる場合、lastRowが9以上である必要があります。 6 7 Dim rowIndex As Long 8 For rowIndex = 9 To lastRow Step 1 ' 行番号が10行目から始まる場合、rowIndexは9から始まる必要があります。 9 Dim elementName As String 10 Dim elementValue As String 11 12 elementName = ws.Cells(rowIndex, "P").Value 13 elementValue = ws.Cells(rowIndex, "A").Value 14 15 If elementName <> "" Then 16 Dim element As Object 17 Set element = xmlDoc.CreateElement(elementName) 18 element.setAttribute "Japanese", elementValue 19 20 parentElement.appendChild element 21 22 Dim startColumn As String 23 startColumn = "A" 24 Dim endColumn As String 25 endColumn = "O" 26 27 Dim currentColumn As Range 28 29 For Each currentColumn In ws.Range(startColumn & rowIndex & ":" & endColumn & rowIndex).Columns 30 If Not IsEmpty(currentColumn) Then 31 elementName = ws.Cells(rowIndex, "P").Value 32 elementValue = currentColumn.Value 33 If elementValue <> "" Then 34 Dim childElement As Object 35 Set childElement = xmlDoc.CreateElement(elementName) 36 childElement.setAttribute "Japanese", elementValue 37 element.appendChild childElement 38 End If 39 End If 40 Next 41 End If 42 Next rowIndex 43 End If 44End Sub

投稿2023/07/02 02:20

編集2023/07/02 02:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

peCopeCo

2023/07/04 14:26

SaYGOE5THlGH様。 適格な回答ありがとうございます。 おっしゃる通り出力はできるのですが、一部の値が取得できずに困っておりました。 教えて頂きました。 「空欄のセルがあってもそのセルだけ飛ばして隣の列に移るようにすればよいと思います。」 を使用する事ににより求めてる結果を得ることができました。 ご教授ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問