Ошибка несоответствия типов при использовании range.find - PullRequest
0 голосов
/ 02 февраля 2020

Как часть большего кода, я ищу значение в электронной таблице (1.xlsx) в другой электронной таблице (все defaults.xls). Я запускаю макрос из текстового документа, и поэтому я импортирую обе таблицы в виде объектов. Однако при использовании функции range.find всегда возвращается ошибка несоответствия типов. Код ниже

Dim OXL As Object
Set OXL = GetObject(, "Excel.Application")
Set OWB = OXL.Workbooks.Open("All Defaults.xls")
Set OWB2 = OXL.Workbooks.Open("1.xlsx")

OWB.ActiveSheet.Range("E:E").Find(What:=OWB2.ActiveSheet.Range("A1").Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

Я пытался вместо того, чтобы просто активировать функцию, присвоить значение функции поиска объекту или варианту, но я все еще получаю ту же ошибку несоответствия.
Запуск та же самая функция find в макросе excel не дает ошибок.
Редактировать: я также попытался записать фактическое значение в коде вместо OWB2.ActiveSheet.Range ("A1") но такая же ошибка возникает

1 Ответ

3 голосов
/ 02 февраля 2020

Здесь происходит несколько вещей:

  • ActiveSheet является свойством Excel.Application, а не Workbook. Поэтому используйте OXL.ActiveSheet
  • Слово не знает ActiveCell, поэтому используйте OXL.ActiveCell
  • Даже тогда After должна быть ячейкой в ​​диапазоне поиска
  • Слово не знает именованных констант для Find. Поэтому используйте там значения.

Итак, измените на

OXL.ActiveSheet.Range("E:E").Find(What:=OXL.ActiveSheet.Range("A1").Value, After:=OXL.Range("E1"), LookIn:=-4123, LookAt:=2, SearchOrder:=1, SearchDirection:=1, MatchCase:=False, SearchFormat:=False).Activate

После всего этого рассмотрите

  • Вы должны объявить все ваши переменные
  • Вы должны указать полный путь к книге, а не полагаться на расположение по умолчанию
  • Как узнать, какой лист будет активным при открытии книги? Укажите тот, который вы хотите
  • Откуда вы знаете, что Find найдет результат? Допустим, что он не работает
  • Вы должны получить ссылку на найденную ячейку, а не Activate ее
  • Рассматривать код с ранней связью, а не с поздней связью. Есть веские причины для использования.
  • GetObject(, "Excel.Application") предполагает, что экземпляр Excel работает. Что если нет? Ваш код должен обрабатывать этот случай

Что-то вроде

Sub Demo()
    Dim oXL As Object ' Excel.Application
    Dim oWB As Object ' Excel.Workbook
    Dim oWB2 as Object ' Excel.Workbook
    Dim oSH As Object ' Excel.Worksheet
    Dim oSearchRange As Object ' Excel.Range
    Dim oRng As Object ' Excel.Range

    Set oXL = GetObject(, "Excel.Application")
    Set oWB = oXL.Workbooks.Open("C:\Full\Path\To\All Defaults.xls")
    Set oWB2 = oXL.Workbooks.Open("C:\Full\Path\To\1.xlsx")
    Set oSH = oWB.Worksheets("SpecifySheet")
    Set oSearchRange = oSH.Range("E:E")
    Set oRng = oSearchRange.Find( _
      What:=oSH.Range("A1").Value, _
      After:=oSearchRange.Cells(1, 1), _
      LookIn:=-4123, _
      LookAt:=2, _
      SearchOrder:=1, _
      SearchDirection:=1, _
      MatchCase:=False, _
      SearchFormat:=False)

    If Not oRng Is Nothing Then
        oRng.Activate
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...