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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

0回答

2288閲覧

マクロツールの汎用化 <初学者です。>

saito.kaz

総合スコア76

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2018/09/10 09:07

編集2018/09/10 09:42

イメージ説明XMLからExcelのマクロを利用して、Excelに特定の値を転記するロジックを組んでいるのですが、
下記の3パターンに対応するため、マクロを汎用化する必要があります。

★パターン1 <Value>値が複数存在する場合
<preference name="名前1" type="String" array="true" disabled="false">
<preference_description>備考1</preference_description>
<context name="test">
<value>r-</value>
<value>r-</value>
</context>
</preference>

★パターン2 <Value>値が1つのみ存在する場合
<preference name="名前2" type="Logical" array="false" disabled="false">
<preference_description>備考2</preference_description>
<context name="test">
<value>TRUE</value>
</context>
</preference>

★パターン3 <Value>が存在しない場合
<preference name="名前3" type="String" array="true" disabled="false">
<preference_description>説明1</preference_description>
</preference>

独学で勉強しており、一度自分に業務に近い内容を実装してみたく、
今回教えて頂いたプログラムを通して、学習したいとも考えております。
大変申し訳ございませんが、どのように実装すれば良いか教えて頂けないでしょうか。

初学者であり、どしょっぱつからつまずいております。

○サンプルファイル 

<?xml version="1.0" encoding="Shift_JIS"?> <preferences> <category name="カテゴリ名"> <category_description></category_description> <preference name="名前1" type="String" array="true" disabled="false"> <preference_description>説明1</preference_description> </preference> <preference name="名前2" type="Logical" array="false" disabled="false"> <preference_description>説明2</preference_description> <context name="Teamcenter"> <value>true</value> </context> </preference>

○実行結果 
|名前|タイプ|配列|無効化|説明|値|
|name値|type値|array値|disable値|description値|value値|

○実行結果Excel (例)
|名前|タイプ|配列|無効化|説明|値|
|名前1|String|true|false|説明1| |
|名前2|Logical|false|false|説明2|true |

*帰宅したため作成中のプログラムはないのですが、下記のようなイメージです。
汎用化ができておらず、また階層が深くなるとどのように書けば良いのかわからなくなります。
(1週間前に参考書を利用して見よう見真似でコーディングしているので、階層が深くなったり少しでも
やりたいことが変わると書けなくなります。申し訳ございません。)

Sub XMLスキーマ対応付け() Dim myXMLMap As XmlMap Set myXMLMap = ActiveWorkbook.XmlMaps.Add _ (Schema:="C:\スキーマ\order.xsd") Range("B3").XPath.SetValue Map:=myXMLMap, _ XPath:="/order/date", Repeating:=False Range("B4").XPath.SetValue Map:=myXMLMap, _ XPath:="/order/customer", Repeating:=False With ActiveSheet.ListObjects("注文データ") .ListColumns(1).XPath.SetValue Map:=myXMLMap, _ XPath:="/order/goods/no", Repeating:=True .ListColumns(2).XPath.SetValue Map:=myXMLMap, _ XPath:="/order/goods/name", Repeating:=True .ListColumns(3).XPath.SetValue Map:=myXMLMap, _ XPath:="/order/goods/amount", Repeating:=True End With myXMLMap.Name = "orderDataXmlMap" End Sub
<?xml version="1.0" encoding="UTF-8" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="order"> <xsd:complexType> <xsd:sequence> <xsd:element name="date" type="xsd:string" /> <xsd:element name="customer" type="xsd:string" /> <xsd:element name="goods" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="no" type="xsd:string" /> <xsd:element name="name" type="xsd:string" /> <xsd:element name="amount" type="xsd:int" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

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

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

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

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

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

Zuishin

2018/09/10 09:10

どこまでできるんですか?
saito.kaz

2018/09/10 09:15

帰宅したため作成中のプログラムはないのですが、下記のサンプルを最近作って勉強しているレベルです。
saito.kaz

2018/09/10 09:16 編集

Sub XMLスキーマ対応付け()   Dim myXMLMap As XmlMap    Set myXMLMap = ActiveWorkbook.XmlMaps.Add (Schema:="C:\スキーマ\order.xsd") Range("B3").XPath.SetValue Map:=myXMLMap, _ XPath:="/order/date", Repeating:=False Range("B4").XPath.SetValue Map:=myXMLMap, _ XPath:="/order/customer", Repeating:=False With ActiveSheet.ListObjects("注文データ") .ListColumns(1).XPath.SetValue Map:=myXMLMap, _ XPath:="/order/goods/no", Repeating:=True .ListColumns(2).XPath.SetValue Map:=myXMLMap, _ XPath:="/order/goods/name", Repeating:=True .ListColumns(3).XPath.SetValue Map:=myXMLMap, _ XPath:="/order/goods/amount", Repeating:=True End With myXMLMap.Name = "orderDataXmlMap" End Sub
saito.kaz

2018/09/10 09:16

すいません、うまく記載できませんでした。
Zuishin

2018/09/10 09:18

そうですね。読むのは厳しいです。質問を編集してコードブロックを使って掲載してください。サンプルやパターンもコードブロックに入れてください。
Zuishin

2018/09/10 09:31

やりたいことが変わるのでは回答できません。まず仕様をちゃんと練って「どういうデータ」から「どういう結果」を得るのか確定させてください。そして結果のサンプルを Excel で作り、画像を掲載すればイメージしやすくて回答もつくと思います。
saito.kaz

2018/09/10 09:43

ありがとうございます。次回意識します。修正依頼にもとづき、タグ値と出力結果のマッピング表を添付します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問