В vba, каков правильный синтаксис для циклического прохождения нескольких диапазонов, используя & - PullRequest
0 голосов
/ 06 марта 2019

Я хочу перебрать код, чтобы сделать следующее: Если в столбце E есть пустая ячейка, я хочу выделить всю строку от A до H. Я попытался заменить число на переменную, используя '&'как показано ниже, но не удалось.Каков синтаксис, чтобы сделать это с помощью VBA?

 Sub CheckForBlanksInName()

    Dim myRange As Range
    Set myRange = Sheet1.Range("A2:H103")
    Dim rowrng As Range

    'clear all color
    myRange.Interior.ColorIndex = xlNone

    'Last Row
    last_row = Range("A2").End(xlDown).Row 'Last row of the data set
    MsgBox last_row '=> returns
    For 

   rownum = 2 To last_row - 1
   If IsEmpty(Range("E" & rownum)) = True Then
        'myRange(("A & rownum : H" & rownum)).Interior.Color = RGB(166, 166,
      166) 'Gray DID NOT WORK

     ' Set rowrng = Range("A & rownum : H" & rownum)
        rowrng.Interior.Color = RGB(166, 166, 166)  'DID NOT WORK

     'Cell E is blank
          MsgBox rownum & "Cell E", rownum
   End If
   Next rownum
   End Sub

Ответы [ 4 ]

0 голосов
/ 06 марта 2019

1.) Синтаксис цикла: For ... To должен находиться в одной строке.

2.) Синтаксис диапазона: Ваша попытка использовать «myRange ((« A & rownum: H »& rownum))» ссылаясь на диапазон внутри объекта диапазона "myrange". Это можно сделать но вам здесь это не нужно, и это неправильный синтаксис. Ссылаться на: http://www.cpearson.com/excel/cells.htm

Вот несколько способов указать диапазон, который вы хотите выделить:

sheet1.Range ("A" & rownum & ": H" & rownum)

sheet1.Range ("A" & rownum.row & ": H" & rownum.row)

sheet1.Range ("A" & rownum, sheet1.range ("A" & rownum) .offset (0,7))

sheet1.Range (sheet1.Cells (rownum, "H"), sheet1.Cells (rownum, "H"))

sheet1.Range (sheet1.Range ("A" и rownum), sheet1.Cells (rownum, "H"))

VBA допускает большое разнообразие при обращении к диапазонам, но несколько советов:
1. Полностью квалифицируйте свою ссылку на лист [например, - sheet1.Range (sheet1 ...)] 2. Будьте осторожны с утомительными цитатами 3. Использовать с ... Конец с блоками

3.) Ваша переменная last_row будет ненадежной, если в вашем поле есть пустые ячейки данные, потому что он будет возвращать последнюю строку перед любой пустой ячейкой. Смотри ниже

4.) Вам не нужен цикл для этого; Я предлагаю вместо этого использовать автофильтр.

Вот как бы я это сделал:

   Sub CheckForBlanksInName()
    Dim myRange As Range
    Dim last_row As Double

    With Sheet1

      last_row = .Cells(.Rows.Count, "A").End(xlUp).Row 'Last row of the data set
      MsgBox last_row '=> returns
      Set myRange = .Range("A2:H" & last_row)

      'clear all color
      myRange.Interior.ColorIndex = xlNone

      .AutoFilterMode = False  'clear any filters
      .Range("E1:E" & last_row) _ 
        .AutoFilter _
            field:=1 _
          , Criteria1:="=" _
          , Operator:=xlFilterValues  'filter column "E" on blank cells

      'Highlight
      myRange.SpecialCells(xlCellTypeVisible).Interior.Color = vbYellow

      .AutoFilterMode = False  'clear filters

    End With
   End Sub
0 голосов
/ 06 марта 2019

или просто цикл по строкам

Sub CheckForBlanksInName2()

   Dim rng As Range, roww As Range
   Set rng = ThisWorkbook.Sheets(1).Range("A2:H103")
       rng.Interior.ColorIndex = xlNone

   For Each roww In rng.Rows
       If IsEmpty(roww.Cells(1, 5)) Then roww.Interior.ColorIndex = 50
   Next

End Sub
0 голосов
/ 06 марта 2019

Вы можете просто просмотреть определенные Cells в "E" Column и, в зависимости от результата их функции isEmpty(), вы можете выделить их как вам угодно.

Dim cell As Range
Dim ws as Worksheet: Set ws = Sheets("Sheet1") ' <- change to whatever sheet you're using
Dim lr as Long: lr = ws.Cells(Rows.Count, 1).End(xlUp).Row

For Each cell In ws.Range("E1:E" & lr)
    If IsEmpty(cell) Then
        cell.EntireRow.Interior.ColorIndex = 27
    End If
Next cell

Дает ожидаемый результат

enter image description here

0 голосов
/ 06 марта 2019

В вашем коде несколько синтаксических ошибок. Вы можете сделать следующее:

Sub CheckForBlanksInName()
        Dim myRange As Range
        Set myRange = Sheets("Sheet1").Range("A2:H103") '<~~ use sheet name instead
        myRange.Interior.ColorIndex = xlNone            '<~~ clear color
    '------
        Dim last_row As Long                            '<~~ declare last_row
        last_row = Range("A2").End(xlDown).Row          '<~~ fix last_row
    '------
        For rownum = 2 To last_row - 1
            If IsEmpty(Sheets("Sheet1").Range("E" & rownum)) = True Then '<~~ use complete addresses
                Sheets("Sheet1").Range("A" & rownum & ":H" & rownum).Interior.Color = RGB(166, 166, 166) '<~~ use complete addresses
            End If
        Next rownum
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...