2016-06-07 2 views
1

Я хочу импортировать два значения в общей сложности из двух разных рабочих листов. У меня есть рабочие листы Site1 и Site2. Из них я хочу импортировать значения, соответствующие строкам (Product1,Cost) и (Product2,Cost) соответственно.Изменение рабочего листа при использовании VLookup вызывает проблемы

Для этого я пробовал:

Set currentWb = ActiveWorkbook 
    Set openWb = Workbooks.Open(filepath & Path) ' It imports the correct file 
    Set openWs = openWb.Sheets("Site1") 
    currentWb.Sheets("Sheet1").Cells(2,3).Value = Application.WorksheetFunction.VLookup("Product1", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1"))) 
    Set openWs = openWb.Sheets("Site2") 
    currentWb.Sheets("Sheet1").Cells(3,3).Value = Application.WorksheetFunction.VLookup("Product2", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1"))) 

Это, однако, получает мне ошибку: Error code '13'.: Incompatible types на втором ряду, где я бегу код (со ссылкой на лист site2). Когда я попытался отладить эту ошибку, кажется, что ошибка возникает, когда я пытаюсь вызвать рабочий лист Site2.

Я просмотрел типы данных в исходном файле, и это число в обоих случаях. Тип данных тот же в моей «ActiveWorkbook». Я пробовал использовать новый Set openws2 = openWb.Sheets("Site2") и адаптировать код к нему, но он по-прежнему вызывал ту же ошибку.

Что я делаю неправильно при попытке использовать VLookup на рабочем листе Site2?

Редактировать: Отредактировано для отражения изменений, чтобы VLookup охватывал несколько столбцов + добавление «WorksheetFunction» в качестве префикса для VLookup.

Редактировать 2: Я теперь пробежал свою строку кода до строки (используя F8). Добавляя MsgBox Application.Match("Cost", openWs.Range("A1:R1")) до и после строки Set openWs = openWb.Sheets("Site2"), вернул правильный индекс столбца для листа «Site1», но ничего не возвращал после того, как я изменил openWs на Site2. Означает ли это, что невозможно выполнить команду Set openWs = openWb.Sheets("Site2) в mannor, которую я сделал - то есть программа не признает это как просто открытие нового листа?

Редактирование 3: В основном каждый рабочий лист состоит из массива, где A1 пуст, а A2: A30 состоит из заголовков строк имен продуктов - Product1, Product2, ...., Product30. Диапазон A1: R1 состоит из заголовков столбцов количества, затрат и т. Д. Я хочу использовать Application.Match в комбинации VLookup как способ избежать «несоответствия» столбцов в случае, если какой-либо другой пользователь вставит, скажем, новый столбец. Поэтому я использую VLookup, сначала для поиска строки, для которой находится «product1», а затем с помощью Application.Match. Я могу найти столбец «Стоимость». В этом я должен найти, а также найти, значение, соответствующее индексу (строка, столбец) (Product1, Cost). Проблема возникает, когда я хочу использовать новый лист «Site2». Простое приспособление кода для захвата «Product2, Cost» в этом листе должно работать (я думаю). Вместо этого я получаю сообщение об ошибке, которое я пытался отлаживать, и если я понимаю, что это правильно, это связано с тем, что программа не переводит Set openWs = openWb.Sheets("Site2") в то, что я хотел достичь, просто новый рабочий лист для проведения того же типа формулы Vlookup на.

EDIT4: В связи с тем, что проблемы могут были вызваны SpecialCharacter å, когда я пытаюсь импортировать данные из листа я называю Site2 (который на самом деле разные, и включает в себя å - давайте впредь называть его Site2å чтобы попытаться использовать подстановочные знаки), я пробовал несколько разных подходов.

Ни используя

set openWs = openWb.Sheets(3) '3 is the index of `Site2å` 

или

For Each openWs In openWb.Worksheets 
     If LCase(openWs.Name) Like "Site2?" Then 
       openWs.Select 
       Exit For 
     End If 
Next openWs 

работ. Последний дает ошибку Object or With variable not set.Я определил openWs как Dim openWs as Worksheet

+1

Во-первых, в вашей четвертой строке вы имеете ошибку типа, вы имеете в виду 'currentwb', а не' current.wb'. Во-вторых, функция VLookup должна быть изменена на 'Application.WorksheetFunction.VLookup' –

+0

@ShaiRado Спасибо! Я обновил свой OP, чтобы отразить эти изменения. Однако проблема сохраняется. – Cenderze

+0

Ваш обновленный код также не исправляет все экземпляры 'current.wb' в 'currentwb'. Это должно устранить оставшуюся проблему. –

ответ

0

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

Для меня решение было просто закрыть книгу, используемую до изменения рабочего листа. В моем коде я добавил незначительные корректировки кода.

Set currentWb = ActiveWorkbook 
    Set openWb = Workbooks.Open(filepath & Path) ' It imports the correct file 
    Set openWs = openWb.Sheets("Site1") 
    currentWb.Sheets("Sheet1").Cells(2,3).Value = Application.WorksheetFunction.VLookup("Product1", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1"))) 
    openWb.Close saveChanges:=False ' Added this line 
    Set openWs = openWb.Sheets("Site2") 
    currentWb.Sheets("Sheet1").Cells(3,3).Value = Application.WorksheetFunction.VLookup("Product2", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1"))) 
    openWb.Cloe saveChanges:=False  'And this one 

Надеюсь, это может помочь любой другой! Я определенно должен был пойти в Google довольно некоторое время, прежде чем осознать, что искал не то место.

(И я хотел бы поблагодарить @PaaquaGrant за то, что он инвестировал столько времени в эту тему и был очень хорошим человеком, с которым можно было поговорить).

1

Ваш диапазон VLOOKUP представляет собой единый столбец вместо многоколоночного диапазона. Это всегда будет терпеть неудачу.

Как было предложено в некоторых комментариях, вам также необходимо настроить все экземпляры current.wb к currentwb.

+0

Спасибо за ответ! Эти изменения не устранили проблему. Однако +1 за полезную информацию. – Cenderze