1

ちょっとした背景として、私はコーディングにかなり慣れていない人です。私が最後に「コード化」してからほぼ10年が経ちましたので、気楽に行ってください;)。

現在、以下の XML ファイルからデータを抽出しようとしています。

- <IPNumber IPNumber="5">
- <Band Band="1">
- <Channel Channel="1">
  <CMPWRE>0.123456</CMPWRE> 
  <CMPWIM>0.234567</CMPWIM> 
  </Channel>
- <Channel Channel="2">
  <CMPWRE>-0.123456</CMPWRE> 
  <CMPWIM>0.234567</CMPWIM> 
  </Channel>
  </Band>
- <Band Band="2">
- <Channel Channel="1">
  <CMPWRE>0.123456</CMPWRE> 
  <CMPWIM>0.234567</CMPWIM> 
  </Channel>
  </Band>
</IPNumber5>
- <IPNumber IPNumber="6">
- <Band Band="1">
- <Channel Channel="1">
  <CMPWRE>0.123456</CMPWRE> 
  <CMPWIM>0.234567</CMPWIM> 
  </Channel>
- <Channel Channel="2">
  <CMPWRE>-0.123456</CMPWRE> 
  <CMPWIM>0.234567</CMPWIM> 
  </Channel>
  </Band>
- <Band Band="2">
- <Channel Channel="1">
  <CMPWRE>0.123456</CMPWRE> 
  <CMPWIM>0.234567</CMPWIM> 
  </Channel>
  </Band>
</IPNumber6>

現時点では、ユーザーに必要な IP 番号、チャネル、およびバンドを選択してもらいたいと考えています。次に、以下のようなリストのそれぞれの CMPWRE および CMPWIM データを抽出したいと考えています。

IPNumber 'X'
Band     'X'
Channel  'X'
CMPWRE   'XXX'
CMPWIM   'XXX' 

データを抽出するために使用しようとしているコードの短いスニペットを次に示しますが、うまく機能させることができません。

コード:

Set oXML = CreateObject("MSXML.DOMDocument")
oXML.async = False
oXML.Load ("H:\14-13-21.xml")


Dim LgChan As String
Dim LgChan1 As String
Dim LgChan2 As String
**Dim LgChan3 As String
Dim LgChan4 As String**

Dim Test As Integer 
Dim Test2 As Integer
Dim Test3 As Integer

Test = mobelenum0.Value ' User Box on GUI where a value is inputted E.G. the number 5
Test2 = FeedSubBand.Value ' User Box on GUI where a value is inputted E.G. the number 1 
Test3 = LogicChannel.Value ' User Box on GUI where a value is inputted E.G. the number 1


LgChan = "TableContents/IPModuleNumber[@IPModuleNumber='1']"
LgChan1 = "//TableContents/IPModuleNumber/FeederSubBand[@FeederSubBand=" & Test2 & "]"
LgChan2 = "//TableContents/IPModuleNumber/FeederSubBand/LogicalChannel[@LogicalChannel=" & Test3 & "]" 
**LgChan3 = "//TableContents/IPModuleNumber/FeederSubBand/LogicalChannel[@LogicalChannel=" & Test3 & "]/CMPWRE"
LgChan4 = "//TableContents/IPModuleNumber/FeederSubBand/LogicalChannel[@LogicalChannel=" & Test3 & "]/CMPWIM"**

 Worksheets("sheet1").Range("B101").Value = oXML.DocumentElement.SelectSingleNode(LgChan).NodeTypedValue
 Worksheets("sheet1").Range("B102").Value = oXML.DocumentElement.SelectSingleNode(LgChan1).nodeTypedValue
 Worksheets("sheet1").Range("B103").Value = oXML.DocumentElement.SelectSingleNode(LgChan2).nodeTypedValue
**Worksheets("sheet1").Range("B104").Value = oXML.DocumentElement.SelectSingleNode(LgChan3).nodeTypedValue
Worksheets("sheet1").Range("B105").Value = oXML.DocumentElement.SelectSingleNode(LgChan4).nodeTypedValue**

私はコードを取得するのに苦労しているので、異なるバンドが選択されている場合、明らかにチャネル値が変更されます... IPNumberの変更がフィルタリングされて再び同じになります。

どんな助けでも素晴らしいでしょう!

スマーフ

4

1 に答える 1

0

「別のバンドが選択されたとき」のイベントをキャッチするコードを追加する必要があります。そのコードは、ユーザーがバンドを選択する方法によって異なりますが、バンドがユーザーフォームのコンボボックスから選択されている場合は、次のように Combobox_Change イベントをキャッチします。

Private Sub FeedSubBand_Change()
    DisplayBands
End Sub

編集:ユーザーが [実行] ボタン を押してバンドを選択した場合は、次のようにボタンの Click イベントを使用する必要があります。

Private Sub ExecuteButton_Click()
        DisplayBands
End Sub

あなたが示唆するように、ここでパフォーマンスの問題に注意することが重要です。XML ファイルが大きいと、読み込みに時間がかかります。その場合は、ユーザーがボタンを押して特に要求した場合にのみドキュメントを読み取るようにすることをお勧めします。もう 1 つのオプションは、テキスト ボックスの 1 つが変更されるたびに自動読み取りを行うことですが、XML ドキュメントが大きい場合は適切ではありません。

于 2012-12-10T16:21:58.147 に答える