Синтаксис VBA для большого выбора - PullRequest
1 голос
/ 20 июня 2019

У меня есть таблица, к которой я регулярно добавляю данные ежедневно. Иногда требуется новая строка данных, поэтому я вставляю новую строку. Затем я использую VLOOKUPS в своей таблице, чтобы вставить данные для моих столбцов.

Однако, когда я несу формулу VLOOKUP для всего столбца, каждая ячейка имеет тот же формат, что и ячейка с исходной формулой.

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

Поскольку у меня такая большая коллекция строк, как я могу сохранить свой код VBA, чтобы он соответствовал удобочитаемому формату вместо длинного горизонтального списка?

Пожалуйста, смотрите мой код и ошибку ниже:

Range("E12:W12,E14:W14,E16:W16,E18:W18,E20:W20,E22:W22,E24:W24,E26:W26,E28:W28, _
    E30:W30,E32:W32,E34:W34,E36:W36,E38:W38,E40:W40, _
    E42:W42,E44:W44,E46:W46,E48:W48,E50:W50,E52:W52,E54:W54,E54:W54,E56:W56,E58:W58, _
    E60:W60,E62:W62,E64:W64,E66:W66,E68:W68,E70:W70,E72:W72,E74:W74,E76:W76,E78:W78, _
    E80:W80,E82:W82,E84:W84,E86:W86,E88:W88,E90:W90,E92:W92").Select

With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0

ERROR: Syntax Error

Ответы [ 4 ]

3 голосов
/ 20 июня 2019

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

А пока посмотрим, поможет ли это:

Sub loopnsub()
Dim ws As Worksheet: Set ws = ActiveWorkbook.Sheets("Sheet1")
Dim lRow As Long: lRow = ws.Cells(Rows.Count, "E").End(xlUp).Row
Dim R As Long

For R = 12 To lRow Step 2
    With ws.Range(ws.Cells(R, "E"), ws.Cells(R, "W"))
        .Interior = 65535 'set your background colour here
        .Font.Color = -16776961 'set your font colour here
        'etc, etc, etc
    End With
Next R

End Sub
1 голос
/ 20 июня 2019

Каждая новая строка должна начинаться с ", а перед подчеркиванием вам нужно " & для конкатенации такой большой строки. Тем не менее, я думаю, что это все равно не будет работать, потому что вы в любом случае можете определить адрес диапазона, который длинен, так как есть некоторые недокументированные ограничения на длину строки , которые вы можете передать на Range, и ваш конструкция превышает этот предел.

Обратите внимание, что на самом деле вы можете построить диапазоны (например, используя Union), которые превышают этот предел, но если вы затем запросите этот диапазон Address, в соответствии с вышеприведенной проблемой, он будет молча усечен.

Dim addr As String

addr = "E12:W12,E14:W14,E16:W16,E18:W18,E20:W20,E22:W22,E24:W24,E26:W26,E28:W28," & _
    "E30:W30,E32:W32,E34:W34,E36:W36,E38:W38,E40:W40," & _
    "E42:W42,E44:W44,E46:W46,E48:W48,E50:W50,E52:W52,E54:W54,E54:W54,E56:W56,E58:W58," & _
    "E60:W60,E62:W62,E64:W64,E66:W66,E68:W68,E70:W70,E72:W72,E74:W74,E76:W76,E78:W78," & _
    "E80:W80,E82:W82,E84:W84,E86:W86,E88:W88,E90:W90,E92:W92"

Debug.Print Len(addr)  '### This will print 335, versus the limit of 255

Таким образом, даже если вы правильно построите свой адрес (см. Выше), вы все равно не сможете использовать его для определения диапазона.

В конечном счете, это, вероятно, должно быть обработано с помощью Union или пошаговой итерации. Но неясно, что вам нужно делать с этими диапазонами.

1 голос
/ 20 июня 2019

Что-то вроде этого должно работать для вас:

Sub tgr()

    'Change these as necessary
    Const StartRow As Long = 12
    Const FinalRow As Long = 92
    Const RangeCols As String = "E:W"
    Const RowStep As Long = 2

    Dim ws As Worksheet
    Dim rFormula As Range
    Dim i As Long

    Set ws = ActiveWorkbook.ActiveSheet
    Set rFormula = Intersect(ws.Columns(RangeCols), ws.Rows(StartRow))

    For i = StartRow + RowStep To FinalRow Step RowStep
        Set rFormula = Union(rFormula, Intersect(ws.Columns("E:W"), ws.Rows(i)))
    Next i

    'Do something with your created range
    rFormula.Formula = "=""MyFormulaHere"""

End Sub
0 голосов
/ 20 июня 2019

Просто чтобы быть как можно ближе к исходному сообщению: как насчет объединения диапазонов

Union(Range("E12:W12,E14:W14,E16:W16,E18:W18,E20:W20,E22:W22,E24:W24,E26:W26,E28:W28," & _
    "E30:W30,E32:W32,E34:W34,E36:W36,E38:W38,E40:W40," & _
    "E42:W42,E44:W44,E46:W46,E48:W48,E50:W50,E52:W52,E54:W54,E54:W54,E56:W56,E58:W58"), _
    Range("E60:W60,E62:W62,E64:W64,E66:W66,E68:W68,E70:W70,E72:W72,E74:W74,E76:W76,E78:W78," & _
    "E80:W80,E82:W82,E84:W84,E86:W86,E88:W88,E90:W90,E92:W92")).Select

Примечания:

Ваша версия в OP заканчивается на", пунктирные линии должны отражать хотя бы полные части строки, которые должны быть соединены &, и вы должны обратить внимание на упомянутое ограничение в 255 символов @BigBen.Другим методом было бы ввести части диапазона в несколько ячеек и соединить их.

Следует избегать .Select, так как в большинстве случаев это не требуется и может быть адресовано напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...