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を生成するための必須のテクニックと言えます。
