какой метод более оптимизирован? - PullRequest
4 голосов
/ 01 ноября 2011

Что ж, мне нужно создать XML-файл и записать в него некоторые теги. Я создал XML-файл, как обычное создание текстового файла, но с расширением XML и используя эти операторы

Первый подход

a.writeline("<root>")
if (check_boxapp.value = true ) then
   a.writeline("<condition>value</condition>")
end if
if (check_boxname.value = true ) then
   a.writeline("<condition>value1</condition>")
end if

вот так, и у меня есть около 50 операторов if.20 для тегов <условие> и 5 других для какого-то другого тега и 2 других для именования тегов. Так что я не могу перейти к описанию случая переключения. Мой вопрос заключается в том, замедляет ли он выполнение макроса vba, потому что для каждого if if я обращаюсь к файлу. Я проверяю условие и обращаюсь к файлу, поэтому это замедляет производительность. Это мой первый подход

Второй подход

создание массива и отслеживание состояния флажков в массиве, а затем в конце цикл по массиву, если он равен 1, тогда используйте writeline else dont. что-то вроде

if chechk_box.value = true then
   a(i) = 1 
end if 

and at the end 

for i = 1 to 20 
       if(a(i)=1) then
          a.writeline("something")
       end if
next i
for i = 1 to 10 
       if(a(i)=1) then
          a.writeline("something")
       end if
next i

Может быть, я предполагаю, что у меня около 6 циклов. При таком подходе я создаю массив и использую 50 операторов if, а затем снова 6 циклов for. Я считаю, что создание массива приводит к потере памяти, а также коду большой по сравнению с первым и немного сложный для понимания.

Но я не уверен, какой из них будет более быстрым. Пожалуйста, помогите с этим или любой другой умный способ высоко ценится

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Это очень небольшое количество операций ввода-вывода, и беспокойство по поводу времени записи кажется ненужным, поскольку любой из этих подходов должен находиться в диапазоне низких миллисекунд.

Вот еще один подход, который вы можете использовать, чтобы упростить задачу, перечислив сами элементы управления;

'//checkbox example
Dim Ctrl As Control
For Each Ctrl In Me.Controls
    if TypeName(Ctrl) = "CheckBox" Then
        '//look at each checkbox
        '//you could use the controls .name to pull out its node value
        '//by using a naming convention like "chk_XML_NodeValue" + mid$(Ctrl.Name, 9)
        '//or by putting the node value in the Tag propery of the control (in the designer or code)
        if (Ctrl.value) then
            a.writeline "<condition>" & Ctrl.Tag & "</condition>"
        end if
    End If
Next
0 голосов
/ 01 ноября 2011

Создайте свой файл в памяти, используя объектную модель MSXML, затем выгрузите весь объект на диск, используя DOMDocument.Save. Я предполагаю, VBA здесь - вы используете «WriteLine» в вашем примере, но VBA не имеет метода «WriteLine».

Ex:

Dim xmlDoc As Object ' MSXML2.DOMDocument60
Dim pi As Object ' MSXML2.IXMLDOMNode
Dim rootelem As Object ' MSXML2.IXMLDOMNode
Dim valueNode As Object ' MSXML2.IXMLDOMNode

' create new MSXML Document
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")

' add XML declaration at top of file
Set pi = xmlDoc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
xmlDoc.appendChild pi

' create root element
Set rootelem = xmlDoc.createElement("root")
xmlDoc.appendChild rootelem

If check_boxapp.value then
  Set valueNode = xmlDoc.createElement("condition")
  valueNode.nodeTypedValue = "value"
  rootelem.appendChild valueNode
End If

If check_boxname.value then
  Set valueNode = xmlDoc.createElement("condition")
  valueNode.nodeTypedValue = "value1"
  rootelem.appendChild valueNode
End If

' save to disk
xmlDoc.Save "C:\MyFile.xml"

Теперь у вас есть действительный файл XML. Было бы просто настроить этот код (используя код, предоставленный Alex K) для циклического обхода ваших флажков и записи XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...