CallByName с несколькими уровнями свойств

Я хочу использовать CallByName в VBA для чтения определенных данных с таких веб-страниц. Эти веб-страницы имеют разную структуру HTML. В моем случае есть элемент, который мне нужно сослаться на 2 или 3 родительских узла и получить элемент с тегами или. См. код:

элемент на всех веб-страницах, которые я назвал MyElem

на одной веб-странице мне нужен этот код:

MsgBox MyElem.parentElement.parentElement.parentElement.getelementsbytagname("tr")(3).innertext

на другой веб-странице мне нужен этот код:

MsgBox MyElem.parentElement.parentElement.getelementsbytagname("div")(2).innertext

и так далее ...

Я хочу написать в VBA, как показано ниже:

Select Case Webpage
     Case "webpage_1"
        property ="parentElement.parentElement.parentElement.getelementsbytagname("tr")(3).innertext"
     Case "webpage_2"
        property = "parentElement.parentElement.getelementsbytagname("div")(2).innertext"

      ' and so on ...

 End Select

MsgBox CallByName(MyElem, property, VbGet)

Проблема в том, что CallByName не поддерживает несколько уровней свойств. Я читал аналогичную тему здесь, но в моем случае это не помогает. Есть ли идея?


person AliM67    schedule 05.12.2018    source источник
comment
Будет полезно, если вы поделитесь образцами HTML и ожидаемыми результатами. Может быть лучший способ. И поскольку у вас уже есть Select Case, почему бы просто не поместить туда свой селектор?   -  person QHarr    schedule 06.12.2018
comment
К сожалению, веб-страницы закрыты. Ваша идея о селекторе css хороша, и я думаю, что она лучше. БЛАГОДАРНОСТЬ!   -  person AliM67    schedule 06.12.2018


Ответы (2)


Почему не это?

Dim res

Select Case Webpage
     Case "webpage_1"
        res = MyElem.parentElement.parentElement.parentElement.getelementsbytagname("tr")(3).innertext
     Case "webpage_2"
        res = MyElem.parentElement.parentElement.getelementsbytagname("div")(2).innertext

      ' and so on ...

 End Select

MsgBox res
person Tim Williams    schedule 05.12.2018
comment
Я не могу использовать этот способ, потому что элемент MyElem, созданный после Case. - person AliM67; 06.12.2018
comment
Так создать его раньше? Или оберните выбор в функцию, передав MyElem в качестве аргумента. - person Tim Williams; 06.12.2018
comment
Я должен попробовать. Есть ли способ использовать CallByName для установки объекта в другой? Вот так: Set obj = CallByName(MyElem,property,VbSet) Если возможно, я могу сделать окончательный объект с несколькими уровнями свойств. - person AliM67; 06.12.2018
comment
Да - было бы Set obj = CallByName(MyElem,property, VbGet) - person Tim Williams; 06.12.2018

Function PropDotVal(wObjName$, PropNa$)

Затемнить wObj как объект: установить wObj = ObjFromStr(wObjName)

' ObjFromStr в модуле с такими строками, как ' должна быть встроенная функция vba, которая не нуждается во многих функциях case ' str obj 'Case sTable: Set ObjFromStr = sTable ' ShapePlus 'Case WHCages: Set ObjFromStr = WHCages ' spt

Dim Si%, NaA$() PropDotVal = NA При ошибке GoTo NotAvailable NaA = Split(PropNa, .)

Если UBound(NaA) › 0 Тогда

  ' PropNa format multi like  wObj.Objb.objc  etc  .prop
  '  convert wObj as  FredsFarm      with     PropNa as TopEnd.fill.backcolor.rgb
  ' to wobj as FredsFarm.TopEnd.fill.backcolor
  'and  Nsa(si) as "rgb" to CallByName from it

  For Si = 0 To UBound(NaA) - 1
     Set wObj = CallByName(wObj, NaA(Si), VbGet)
  Next Si

Конец, если

PropDotVal = CallByName(wObj, NaA(Si), VbGet) Недоступно:

Конечная функция

enter code here
person Harry S    schedule 27.10.2020