Код последней строки для выбранных диапазонов кодов обращения

#excel #vba #named-ranges

#excel #vba #именованные диапазоны

Вопрос:

Я добавил последнюю строку для выбора кода обращения, см. Ниже. Ошибка гласит

Method Range of Object _Worksheet Failed

Не слишком уверен, как справиться с ошибкой? Означает ли это, что он может t find the range on the worksheet? I поместить процедуру окрашивания ниже, чтобы вы могли видеть, что код работает нормально, за исключением последней строки в диапазонах

 Option Explicit

Private Sub Add_Break_Lines_Click()

    Dim Com As ComboBox
    Dim ws As Worksheet

    Set ws = Application.Workbooks("Automated ardworker.xlsm").Worksheets("Job Card Master")
    Set Com = Me.Add_Break_Lines
    LastRow = ws.Range("C299").End(xlUp).row
    
    With ws
        Select Case Com.Value
        Case "Break Lines 1 Page Job Card"
            Color .Range("A13:Q amp; LastRow")
        End Select
    End With

End Sub

Function Color(rng As Range)

    Dim row As Range
    Dim EmptyRowNum As Integer
    
    For i = 1 To rng.Rows.Count
        Set row = rng.Rows(i)
        If WorksheetFunction.CountA(row) = 0 Then
            EmptyRowNum = EmptyRowNum   1
        End If
        If EmptyRowNum = 2 Then
            EmptyRowNum = 0
            row.Interior.ColorIndex = 6
        End If
    Next i

End Function
 

Комментарии:

1. Color .Range("A13: amp; LastRow") не имеет особого смысла. Что вы пытаетесь сделать? Диапазон должен быть примерно таким "A13:A" amp; LastRow .

2. Не могли бы вы опубликовать Color процедуру?

3. Также проверьте это Automated ardworker.xlsm , возможно, в нем была ошибка. Похоже, это может быть CardWorker .

4. Извините, теперь он говорит Cardworker, но все еще не работает

5. Я добавил процедуру Color в приведенный выше код

Ответ №1:

Изменение поля со списком

  • Всегда используйте Option Explicit .
  • Используйте имена переменных, которые отличаются от имен ключевых слов, свойств, методов … которые используются в VBA .
  • Вы можете рассмотреть возможность использования
     If WorksheetFunction.CountBlank(rrg) = rrg.Columns.Count Then 
     

    в функции по причине, указанной Томом Брунбергом в комментариях, а именно, если у вас есть формулы, оценивающие значение «» в диапазоне, никогда не будет empty строки, только blank единицы. Возможно, перед циклом используйте переменную:

     cCount = rng.Columns.Count
     

Модуль листа, например, Лист1 (в VBA имя в скобках)

 Option Explicit

Private Sub Add_Break_Lines_Change()

    Dim cmb As ComboBox
    Dim ws As Worksheet
    Dim LastRow As Long

    Set ws = ThisWorkbook.Worksheets("Job Card Master")
    Set cmb = Me.Add_Break_Lines
    cmb.AddItem "Break Lines 1 Page Job Card"
    cmb.AddItem "Dummy"
    LastRow = ws.Range("C" amp; ws.Rows.Count).End(xlUp).row
    
    Select Case cmb.Value
        Case "Break Lines 1 Page Job Card"
            colorAbove ws.Range("A13:Q" amp; LastRow)
    End Select

End Sub
 

Стандартный модуль, например, Module1 (необязательно в том же модуле листа)

 Option Explicit

Sub colorAbove(rng As Range)
    
    Dim brg As Range
    Dim rrg As Range
    Dim EmptyRowNum As Long
    Dim i As Long
    
    For i = 1 To rng.Rows.Count
        Set rrg = rng.Rows(i)
        If WorksheetFunction.CountA(rrg) = 0 Then
            EmptyRowNum = EmptyRowNum   1
        End If
        If EmptyRowNum = 2 Then
            EmptyRowNum = 0
            If brg Is Nothing Then
                Set brg = rrg
            Else
                Set brg = Union(brg, rrg)
            End If
        End If
    Next i
    
    If Not brg Is Nothing Then
        brg.Interior.ColorIndex = 6
    End If

End Sub
 

Комментарии:

1. Я ve done what you said but it все еще говорю об ошибке «Ошибка диапазона методов рабочего листа» в этой части кода, ColorAbove ws.Range («A13: Q amp; lastRow»)

2. Не могли бы вы сообщить, какое значение LastRow имеет, когда возникает ошибка? Просто наведите на него курсор.

3. Говорит lastRow = 0

4. Вот оно. Есть ли у вас Option Explicit в верхней части модуля (это важно)?

5. lastRow теперь работает, и я также добавил опцию Explicit. Но он по-прежнему завершается ошибкой в той же строке.