Я хочу импортировать два значения в общей сложности из двух разных рабочих листов. У меня есть рабочие листы 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
Во-первых, в вашей четвертой строке вы имеете ошибку типа, вы имеете в виду 'currentwb', а не' current.wb'. Во-вторых, функция VLookup должна быть изменена на 'Application.WorksheetFunction.VLookup' –
@ShaiRado Спасибо! Я обновил свой OP, чтобы отразить эти изменения. Однако проблема сохраняется. – Cenderze
Ваш обновленный код также не исправляет все экземпляры 'current.wb' в 'currentwb'. Это должно устранить оставшуюся проблему. –