#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. Но он по-прежнему завершается ошибкой в той же строке.