Не могу на всю жизнь выяснить, что вызывает эту ошибку несоответствия VBA Excel? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть этот код, который вызывает ошибку несоответствия, и я не могу понять, почему он работал как-то раньше с ошибкой несоответствия, и в попытке исправить это, я не могу вернуть его к работе. Все значения в листе слияния являются числовыми. По сути, я пытался сделать так, чтобы при вводе значения в ячейку было бы выполнено VLookup для ввода значения в соседнюю ячейку, и как только я получу эту работу, больше ячеек в одной строке. Если кто-то из вас жаждет что-то исправить, просто дайте мне знать!

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Dim LooupValue As String
    Dim sfx As Long
    Set KeyCells = Columns(1)
    LooupValue = ActiveCell.Value
    sfx = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)

    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then

        Range(Target.Address).Offset(0, 1).Value = sfx

    End If
End Sub

Редактировать: Спасибо @ Marcucciboy2, @MathieuGuindon и @BigBen за их успешную помощь, я провел еще несколько исследований и опубликовал, что решило мою проблему ниже.

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Я бы также вложил настройку значения в «Если», которое проверяет пересечение; в противном случае каждый раз, когда вы меняете лист, он выполняет ненужный просмотр в фоновом режиме.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then
        Target.Offset(0, 1).value = Application.VLookup(Target.value, Worksheets("Merge").Range("D:BD"), 2, False)
    End If
End Sub
0 голосов
/ 03 июля 2018

Я выяснил, в чем заключалась последняя проблема ... По какой-то причине из предыдущего редактора документов столбец поиска был отформатирован как текст. Причина, по которой работали только некоторые значения поиска, заключалась в том, что даже после того, как я отформатировал весь столбец в числа, указанные значения были переформатированы в числа только после того, как я отредактировал ячейку. Я не собирался редактировать каждую ячейку, поэтому я провел некоторое исследование и выяснил, как обновить формат всего столбца.

Я обновил столбец, выполнив следующее:

  1. Выберите весь столбец
  2. При необходимости отформатируйте столбец
  3. Перейдите на ленту данных и выберите «Текст в столбцы»
  4. Убедитесь, что выбран разделитель, нажмите Далее
  5. Снимите флажки со всех разделителей, нажмите Далее, затем Готово
0 голосов
/ 26 июня 2018
Dim sfx As Long
sfx = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)

Если vlookup дает xlErrNA, то есть #N/A, то VBA не может преобразовать свой результат в Long, и вы получите именно это: несоответствие типов ошибка - потому что xlErrNA - это значение Error, которое не может быть неявно преобразовано в String, Long или что-либо еще. Единственный тип, который может содержать эти данные, это Variant.

Dim result As Variant
result = Application.VLookup(LooupValue, Worksheets("Merge").Range("D:BD"), 2, False)

Dim sfx As Long
If Not IsError(result) Then 
    sfx = CLng(result)
Else
    'lookup yielded no match
End If

Кроме того, похоже, что это одно за другим:

LooupValue = ActiveCell.Value

Вероятно, ActiveCell - это не та же ячейка, что и Target, то есть ячейка, которая была изменена. Вам, вероятно, нужно это вместо:

LookupValue = Target.Value

Я бы также рекомендовал делать неквалифицированные Range (то же самое с Rows, Colomns, Names и Cells) явно определенными вызовами - потому что тот же самый код ведет себя по-разному в зависимости от того, где он написан в Присваивая им Me, вы делаете свой код более явным. Код, который говорит, что он делает, и делает то, что говорит , всегда лучше кода.

Worksheets("Merge") - это запах: если лист существует в ThisWorkbook во время компиляции, присвойте ему кодовое имя (т.е. установите его свойство (Name)) и используйте этот идентификатор напрямую:

result = Application.VLookup(LooupValue, MergeSheet.Range("D:BD"), 2, False)

Если лист существует только во время выполнения (например, он находится в рабочей книге, которая была открыта макросом), то у вас должна быть ссылка на эту рабочую книгу рядом с тем местом, где вы открыли этот файл, например, Set book = Application.Workbooks.Open(path) - используйте эту ссылку для уточнения вызова участника Worksheets, вместо того, чтобы косвенно ссылаться на ActiveWorkbook.

Диапазон поиска D:DB является чрезмерным, когда вы ищете только значение в столбце E. Если этот жестко запрограммированный 2 останется, я бы сделал диапазон поиска равным D:E.

...