Excelのセルに入力されたデータをVBAでXMLファイルに出力する際、セル内に含まれる改行コードが原因で、意図しないXMLが生成されてしまうことがあります。
この記事では、セルから取得した値の改行コードをReplace
関数で除去し、クリーンなデータにしてからXMLの要素(ノード)を作成する、実用的な方法を解説します。
なぜ改行コードの除去が必要か?
XMLにおいて改行やスペースは「意味を持つ文字」として扱われるため、セル内の改行がそのままXMLに出力されると、データの構造が崩れたり、連携先のシステムでエラーが発生したりする原因となります。
データをXML化する前には、不要な改行コードなどの制御文字をあらかじめ取り除いておくことが、安定した動作のための重要なステップです。
完成したVBAコード
以下が、指定したセルの値から改行コードを削除し、その値をテキストとして持つXML要素を作成してファイルに保存するコードです。
Sub CreateXmlElementFromCell()
' 変数を宣言します
Dim xmlDoc As Object
Dim rootElement As Object
Dim textNode As Object
Dim sourceCell As Range
Dim cellValue As String
Dim outputXmlPath As String
' --- 設定箇所 ---
' データが入力されているセルを指定します
Set sourceCell = ThisWorkbook.Worksheets("Sheet1").Range("B2")
' --- 設定ここまで ---
' 書き出すXMLファイルのパスを指定します
outputXmlPath = ThisWorkbook.Path & "\ElementData.xml"
' 1. セルから値を取得し、改行コードを削除します
' vbLf (LF) と vbCrLf (CRLF) の両方に対応します
cellValue = Replace(sourceCell.Value, vbLf, "")
cellValue = Replace(cellValue, vbCrLf, "")
' XMLドキュメントオブジェクトを生成します
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
' --- XMLの組み立て ---
With xmlDoc
' XML宣言を作成して追加します
.AppendChild .CreateProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")
' 2. 要素ノードを作成します (例: <item>)
Set rootElement = .CreateElement("item")
' 3. テキストノードを作成します (改行除去済みの値を使用)
Set textNode = .CreateTextNode(cellValue)
' 4. テキストノードを要素ノードの子として追加します
rootElement.AppendChild textNode
' 5. 要素ノードをドキュメントのルート要素として追加します
.AppendChild rootElement
' 6. ファイルとして保存します
.Save outputXmlPath
End With
' オブジェクトを解放します
Set textNode = Nothing
Set rootElement = Nothing
Set xmlDoc = Nothing
MsgBox "XMLファイルの作成が完了しました。"
End Sub
コードのポイント解説
① セル値の取得と改行コードの除去
cellValue = Replace(sourceCell.Value, vbLf, "")
cellValue = Replace(cellValue, vbCrLf, "")
このコードの最初の重要なステップです。指定されたセル(sourceCell
)から値を取得し、Replace
関数を使って改行コードを空の文字列(""
)に置換しています。
Excelのセル内改行には、vbLf
(LF) と vbCrLf
(CRLF) の2種類が主に使われるため、両方に対応することで、より確実に改行を除去できます。
② 要素ノードの作成 (.CreateElement)
Set rootElement = .CreateElement("item")
CreateElement
メソッドを使い、<item>
という名前の要素ノードを生成します。この時点では、まだ中身は空っぽのタグだけが作られたイメージです。
③ テキストノードの作成 (.CreateTextNode)
Set textNode = .CreateTextNode(cellValue)
CreateTextNode
メソッドを使い、要素の「中身」となるテキストノードを生成します。引数には、①で改行コードを除去したクリーンな文字列cellValue
を渡します。
④ 親子関係の構築 (.AppendChild)
rootElement.AppendChild textNode
.AppendChild rootElement
XMLの構造は、.AppendChild
メソッドでノード同士を親子として繋ぎ合わせることで構築します。
rootElement.AppendChild textNode
まず、テキストノード(textNode
)を要素ノード(rootElement
)の子として追加します。これにより、<item>セルの値</item>
という構造がメモリ上で完成します。.AppendChild rootElement
次に、完成した要素ノード(rootElement
)を、ドキュメント全体(xmlDoc
)の子として追加します。
この2段階の追加処理が、XML構造を組み立てる際の基本となります。
まとめ
VBAでセルデータをXMLに出力する際は、CreateElement
やCreateTextNode
でXMLの部品を作るだけでなく、その元となるデータ自体を事前にクリーンアップすることが非常に重要です。
特に、Replace
関数を使って予期せぬ改行コードをあらかじめ除去しておくことは、安定したXMLを生成するための必須のテクニックと言えます。