オプション:
リンクされたフォーラムの投稿から VBA コードを試したことはなく、以下に含まれています。うまくいくことを願っています。ただし、以下の回避策は簡単で、マッピング内のデータを参照する数式に影響を与えないようです。したがって、それがうまくいかない場合、またはマッピングが複雑な場合、または複数回半自動的に更新する必要があると予想される場合を除き、私はそれを使用します (ただし、以下の回避策は労力にほとんど時間がかかりません)。
Excel 2007 の正式な解決策はないようです。Excel 2003 (アドオン) 用と Excel 2010 ([開発者] タブ) 用の 2 つの個別の公式解決策があるようです。
質問Excel Add A Field To An Xml Mapは、うまくいくかもしれない3つの方法を提供しました。
- 1 つ目は、 Excel 2003でこれを行うことができるExcel 2003 用の XML ツールボックスです。Excel で古いバージョンを使用する必要がある場合や、古いオペレーティング システムを使用する必要がある場合もあります。
- 2つ目は「.xlsファイルを編集する」方法です。
- 3 つ目は、Excel 2010 の [開発] タブを使用することです。
追加オプション:
- 以下に提供する回避策 (おそらく、繰り返されることが予想されず、マッピングが単純な、単純な 1 回限りの更新に対する私の選択です)。
- ワークシートを XML スプレッドシートとして保存します。ファイルの末尾に記録されているスキーマを編集します。XML であるため、完全にテキストです。スキーマは理解しやすいです。列の追加は、数行の XML テキストを (変更を加えて) コピー アンド ペーストするだけの簡単なものです。この方法を使用する場合、ワークシートの複製を作成し、マップとマッピングを削除して再作成し、カット アンド ペーストするのがおそらく最も簡単です。XML の例:
(SO フォーマットには空白のテキストが必要)
<x2:Field x2:ID="Add-E-head">
<x2:Range>RC[4]</x2:Range>
<x2:XPath>Add-E-head</x2:XPath>
<x2:XSDType>string</x2:XSDType>
<ss:Cell>
</ss:Cell>
<x2:Aggregate>None</x2:Aggregate>
</x2:Field>
回避策: [追加/挿入/削除された列] (1 つの大きなテーブルなど、単純なマッピングの場合は簡単):
- ワークシートのバックアップ コピーを作成します。
- XML マップを削除します。シート内のマッピングではありません。XML マップだけです。
- マップを再作成します。これで、新しい XML スキーマが作成されます。
- 追加の列によって上書きされる数式/データがある場合: XML マップ データを含むシートの現在の領域のすぐ右に十分な数の列を挿入します。
- 古い列の間に挿入された列がある場合は、シートに列を挿入します。はい、これは XML マップされたデータ領域にあり、一般的な列名が一時的に割り当てられます。
- 新しい XML に存在しない列をすべて削除します。
- 新しくマップされたテーブルから現在のマッピングの左上隅に要素をドラッグ アンド ドロップします (または、削除していないマッピングの上に直接シートにマッピングを再作成します)。
- 更新された見出しを手動で変更します (データに見出しがあるとマークされている場合)。
- ワークブックにあるすべての個別のマッピングに対して、手順 4 ~ 8 を繰り返します。通常、複数の小さなマッピングではなく、参照する大きなマッピングが 1 つだけあります。
- XML データを更新します。
数式は変更されておらず、XML マップ データへのセル参照は正しいままである必要があります。手順 3 で列を正しく挿入したことを確認するには、他の変更を行う前に (手順 1a など)、XML マッピングの上に行を作成し、一番上の行の値だけをコピーして貼り付けます。手順 10 で XML データを更新すると、古い行見出しが新しい配置と一致することを確認できます。
注: 手順 3 と 4 は、XML 要素のより複雑なマッピングを作成することによって、交互に行うことができます。列を挿入するだけで、XML 要素と 1 対 1 の対応を保つ方が簡単だと思います。
これは私のマシンで複数回の試行を通じて機能し、その領域を参照する式を正しいものとして残しました。SO-XML mapping.xml という実験可能なファイルは、以下にリンクされているサンプル ファイル (およびここ)に含まれています。
ソースから取得した (または複数のソースを交換可能に使用した) 一部のデータ テーブルの一般的な列の変更を説明します。
持っているデータが XML マップのようなものによって動的に提供されない場合や、挿入された列を考慮に入れることに煩わされたくない場合があります。これを達成するための強引な回避策は、列の位置を制御するワークシート内のテーブル (シート) へのデータ列の独自のマッピングを作成することです。これを行うには、別のシートにインポート/コピーしたデータを間接的に参照するテーブルを作成します。このような間接マッピングを使用すると、設定した数式への入力として、2 つ以上の異なるデータ セットを簡単に切り替えることもできます。
間接マッピングはINDIRECT()
、ソース データを含むシートを参照するために使用します。すべての数式は、ソース データではなく、この間接シートを指します。間接シートの列の内容は、指定された列見出しに一致するソース データの列から取り込まれたデータを使用して、固定位置に編成されます。次に、ソース データ内の列の編成に変更が加えられた場合は、代わりに書式設定されたデータを含む新しいシートを作成するか、元のデータがあったシートに配置して列見出しを変更することができます。参考に使っています。複数のデータ セットを切り替える場合は、1 つのセルを変更するだけで、使用されるソース データを完全に変更できます。
この間接マッピング シートを使用すると、ソース データの再編成の可能性について心配する代わりに、(間接シートの外にある) 数式内の列を修正できます。または、2 つ以上のデータ セットを切り替えたときに同じ列構成に自動的に変換されるようにすることもできます。データセットに同じ実際のデータに使用される異なるヘッダーがある場合でも、これを実現できます (データの代替セットが選択されたときに使用されるヘッダーの行があるだけです)。
これは、このような投稿で説明するよりも、おそらく示す方が簡単です。したがって、ここでは5 つの異なるシートからデータを選択する例を示します。
この例では、すべての数式が間接ページを参照します。この例では、すべてのファイルがC:\
ディレクトリに配置されていることを前提としています。残念ながら、XML マッピングを使用するには完全なファイル パスが必要であり、C:\
Excel を実行しているほとんどのマシンに存在する可能性が最も高い場所です。
2009 年 11 月 16 日のKMKfanからの VBA コード:
XML の質問 - スキーマ/マッピングの更新(アーカイブ)に投稿されました(参照を投稿する XML マッピング機能をプログラムで使用するページのアーカイブ)。
投稿のコメントは次のとおりです。
このコードの更新は次のとおりです。このコードでは、xsd マップと xml マップが同じ名前である限り、同じワークブック内で複数の XML マップを更新できます (つまり、ソース マップ "MyMap" は MyMap.xsd に基づいています。XML を使用している場合は非常に役立ちます)。レポートを支援し、取得するデータの一部を追加することを決定する. 既存のマッピングを自動的に更新でき、新しいデータ要素を手動で更新するだけで済みます.
Dim r, c As Integer
Dim wb1, wb2 As Workbook
Dim StrMap, StrWS, StrRng, StrXPath As String
Dim nStrWS, nStrRng, nStrXPath As String
Dim nStrMap As XmlMap
Sub Update_XML()
Call Get_XPath
Call Add_NewMap
Call Assign_Elements
End Sub
Sub Get_XPath()
'Gets Available XML Mappings (XPath) for current workbook and sends the text information to a temp file.
Set wb1 = ThisWorkbook
Set wb2 = Workbooks.Add
wb1.Activate
For Each Sheet In wb1.Sheets
Sheet.Select
Range("A1").Select
Selection.UnMerge
For c = 1 To ActiveSheet.UsedRange.Columns.Count
For r = 1 To ActiveSheet.UsedRange.Rows.Count
If ActiveCell.Offset(r - 1, c - 1).XPath <> "" Then Call Send_XPath
wb1.Activate
Next r
Next c
Selection.Merge
Next Sheet
End Sub
Sub Send_XPath()
'Sends text information to a temporary workbook for use later.
StrWS = ActiveSheet.Name
StrRng = ActiveCell.Offset(r - 1, c - 1).Address
StrXPath = ActiveCell.Offset(r - 1, c - 1).XPath
StrMap = ActiveCell.Offset(r - 1, c - 1).XPath.Map.Name
With wb2
.Activate
ActiveCell = StrMap
ActiveCell.Offset(0, 1) = StrWS
ActiveCell.Offset(0, 2) = StrRng
ActiveCell.Offset(0, 3) = StrXPath
ActiveCell.Offset(1, 0).Select
End With
End Sub
Sub Add_NewMap()
'Delete the current XML map and add a new XML Map that has the same schema structure.
'XML Map and XSD schema must be named identically. Only the .xsd extension should be different.
Dim MyPath, MyMap As String
MyPath = 'Path of .xsd file goes here
For Each XmlMap In wb1.XmlMaps
MyMap = XmlMap.Name
wb1.XmlMaps(XmlMap.Name).Delete
wb1.XmlMaps.Add(MyPath & "\" & MyMap & ".xsd").Name = MyMap
Next XmlMap
End Sub
Sub Assign_Elements()
'Assign XPath of new XML Map to ranges based on the information in the temp workbook. Close 2nd workbook w/o saving.
With wb2
.Activate
Application.Goto Range("$A$1")
End With
Do Until ActiveCell = ""
Set nStrMap = wb1.XmlMaps(ActiveCell.Text)
nStrWS = ActiveCell.Offset(0, 1)
nStrRng = ActiveCell.Offset(0, 2)
nStrXPath = ActiveCell.Offset(0, 3)
With wb1
.Activate
Sheets(nStrWS).Select
Range(nStrRng).XPath.SetValue nStrMap, nStrXPath
End With
wb2.Activate
ActiveCell.Offset(1, 0).Select
Loop
wb2.Close False
End Sub