2015-07-08 3 views
-1

У меня есть код, который находит определенный столбец и переходит к его последнему значению строки и отображает его. Моя проблема заключается в том, что application.match не работает над объединенными ячейками. Вот мой код;Application.match не работает с объединенными ячейками

Dim rng As Range 
Dim LastRow As Long 

With ActiveSheet 

    Set rng = Sheets("COMPAS").Range("A10:" & .Range("ZZ9").End(xlToRight).Address) 
    col = Application.Match("*Crt.*", rng, 0) 

    If IsError(col) Then 

     Sheets("MACRO TEMPLATE").Cells(2, 2) = 0 

    Else 

     col = Application.Match("*Crt. Accrual*", rng, 0) 
     LastRow = Sheets("COMPAS").Cells(1000000, col).End(xlUp).Row 
     Sheets("MACRO TEMPLATE").Cells(2, 2) = Sheets("COMPAS").Cells(LastRow, col) 

    End If 

End With 

То, что я пытаюсь найти, это «Crt. Accrual». В отличие от «Allotment-Total», который находится на строке 9 и 10 (объединен) «Crt. Accrual» находится в строке 10. не объединен со строкой 9.

Любой ответ будет оценен.

enter image description here

+0

Если вы используете встроенную функцию в VBA, которые необходимо используйте правильный объект. 'Application.WorksheetFunction.Match (...)' – PatricK

+0

Это дает мне ошибку времени выполнения 438, поэтому я использовал application.match без функции рабочего листа. –

+0

Я думаю, что ваш ** Crt. В Accrual ** есть ручная подача строки (Alt-Enter)? Если это так, матч НЕ найдет его, если вы его не включите ('CHAR (10)'). Попробуйте удалить фид строки или сопоставить другую строку. – PatricK

ответ

1

Несколько проблем с вашим кодом:

  1. Этот синтаксис не дает вам то, что вы ожидали бы

    Set rng = Sheets("COMPAS").Range("A10:" & .Range("ZZ9").End(xlToRight).Address)

    Вы могли бы использовать что-то вроде этого

    Set rng = Sheets("COMPAS").Range("A9:ZZ10")

  2. Match можно найти один массив (один строки или столбца), так что вы должны будете использовать Match для каждой строки

    • Для поиска на нескольких строках можно использовать Найти
  3. «col» должен быть объявлен как вариант (не уверен, как вы его объявили)

  4. Вам необходимо проверить наличие ошибок каждый раз, когда вы выполняете Match (также в блоке Else)

Примечания:

  • Если объединить ячейку A1 с A2, и место "Test" в присоединяемых клетках «Тестовое значение будет найдено в строке 1 (A1) и A2 будет пустой

Это (непроверенные) код показывает, как вы можете использовать матч на несколько строк:

Option Explicit 

Sub SubName() 
    Const HDR1 As String = "*Crt.*" 
    Const HDR2 As String = "*Crt. Accrual*" 

    Dim row1 As Range, row2 As Range 
    Dim col1 As Variant, col2 As Variant 
    Dim lastRow As Long, macroCell As Range 

    With Worksheets("COMPAS").UsedRange 
     Set row1 = .Rows(9) 
     Set row2 = .Rows(10) 
    End With 
    With Application 
     col1 = .Match(HDR1, row1, 0) 
     col2 = .Match(HDR2, row1, 0) 
     If IsError(col1) Then col1 = .Match(HDR1, row2, 0) 
     If IsError(col2) Then col2 = .Match(HDR2, row2, 0) 
    End With 

    Set macroCell = Worksheets("MACRO TEMPLATE").Cells(2, 2) 

    If IsError(col1) Or IsError(col2) Then 
     macroCell.Value2 = 0 
    Else 
     With Worksheets("COMPAS") 
      lastRow = .Cells(.UsedRange.Rows.Count + 1, col2).End(xlUp).Row 
      macroCell.Value2 = .Cells(lastRow, col2).Value2 
     End With 
    End If 
End Sub 
+0

Это не дает мне ошибок, но не дает правильного значения. Он дает нуль. Когда я запускаю код на строку, col равен ошибке 2042 –

+0

Спасибо за вашу помощь. Я исправляю свою проблему, помещая диапазон в соответствие. col = Application.Match («* Crt *», листы («COMPAS»). Диапазон («A10: ZZ10»), 0) –

+1

Отлично! Я рад, что это помогло –

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