2015-02-19 2 views
1

Я пытаюсь запустить как макрос пользовательскую функцию Excel XpathOnUrl из надстройки под названием SeoTools от Niels Bosma. Функция работает нормально, и кажется, что я могу сохранить ее результат в переменной. Затем эту переменную можно корректно выводить в ячейку Excel, но когда я пытаюсь найти в ней строку в следующей части макроса, я получаю ошибку Run-time error '13': Type mismatch. Из того, что я понимаю из here, функция возвращает массив, но когда я пытаюсь получить к нему доступ в качестве первого элемента массива, я получаю ту же ошибку. Я попытался преобразовать переменную в строку с CStr, но там не повезло. Что мне не хватает?Функция результата функции функции VBA

Вот проблематичная часть кода:

WebSite = Sheet1.Range("A1") 
contactPage = Application.Run("XPathOnUrl", WebSite, "//a[contains(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),""contact"")]", "href") 

MsgBox TypeName(contactPage) 'trying to find out the data type results in 'Error' 

    If Left(contactPage(0), 4) = "http" Then 

     Sheet1.Range("B1").Value = contactPage 

    ElseIf InStr(contactPage, "/") = 1 Then 

     Sheet1.Range("B1").Value = WebSite & contactPage 

    End If 

Просто, чтобы понять: проблема возникает только с условными операторами. Если я присваиваю значение переменной непосредственно ячейке, такой как Sheet1.Range("B1").Value = contactPage, она выдает правильный результат.

+1

Что 'contactPage' выглядеть, когда вы его просмотра в окне' Locals'? Он отображается как массив, который заполняется и индексируется? –

+0

У вас есть опечатка в вашей первой строке. change 'WebSite = Sheet1.Range (" A1) "' to 'WebSite = Sheet1.Range (" A1 ")' –

+0

Прежде всего, спасибо, что помогли мне открыть окно «Locals». Похож на очень полезный инструмент. И на ваш вопрос 'contactPage' появляется как Type: variant/error и Value: error 2015 – Inverbis

ответ

2

Вот простое решение:

Сделать XpathURL выплюнуть его возвращение в диапазон. Затем используйте Range.value, чтобы назначить возврат contactpage и очистить диапазон, используя .Clearcontents. Я думаю Application.Run не разрешил XpathURL вернуться на contactpage.

Edit: Добавлен комментарий ниже:

Sheet1.Range("B1").Value = Application.Run("XPathOnUrl", WebSite, "//a[contains(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),""contact"")]", "href") 
contactPage = Sheet1.Range("B1").Value 
+0

Итак, для тех, кому это может понадобиться в будущем, я немного изменил код, как описано в ответе @JLILI Aman, поэтому теперь переменная 'contactPage' определяется следующим образом:' Sheet1.Range («B1»). Значение = Application.Run («XPathOnUrl», WebSite, // // содержит (перевод (@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "" контакт "")] "," href ")', а затем ' contactPage = Sheet1.Range ("B1"). Value' – Inverbis

0

Вы пробовали функции Formula и FormulaR1C1? Просто мои предположения.

Попробуйте и сообщите нам, если это поможет.

Sheet1.Range("B1").Formula = WebSite & contactPage 

или

Sheet1.Range("B1").FormulaR1C1 = WebSite & contactPage 

Что делает дисплей MsgBox TypeName(contactPage)?

+0

Как может' Sheet1.Range («B1»). Формула = WebSite & contactPage' возвращает формулу, если она начинается с строки из переменной 'WebSite'? – Inverbis

+0

Это было мое предположение, как я уже говорил. Я не знаю, как, но Formula работает для меня вместо Range.Value. –

0

Кроме того, я бы посоветовал использовать Set с WebSite:

Dim WebSite As Range 
... 
Set WebSite = Sheet1.Range("A1") 
+0

Хорошая точка, спасибо. К сожалению, условный оператор все еще возвращает ошибку несоответствия – Inverbis

+0

Собственно, с вашей коррекцией теперь он возвращает действительный вариант. Я попытаюсь работать оттуда – Inverbis

+0

Посмотрите на https://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.project(v=vs.100).aspx: «Возвращает метод Run независимо от вызванного макроса. " Это означает, что есть проблема с вашим макросом. JLILI Aman прав, есть проблема с макросом XPathOnUrl. –

Смежные вопросы