Относительные ссылки VBA - PullRequest
0 голосов
/ 17 апреля 2020

Новичок в VBA и только учится использовать относительные ссылки. У меня есть лист Excel, который будет содержать примерно 27 таблиц, и мне нужно будет создать 5 версий этого листа. Вывод инструмента, который я использую, не соответствует нужному формату. Ниже приведен скриншот вывода:

enter image description here

Это пример того, чего я пытаюсь достичь:

enter image description here

Каждая из таблиц в рабочей таблице будет иметь различное количество строк . Мне удалось получить код, который выделяет вопрос, центрирует столбцы (от «Всего» до «Нет») и выделяет различные разделы ... но я не могу получить код, который выделяет метки строк и проценты, или строка с названием «имя столбца».

Вот мой код для первой части:

 Format Macro
'
' Keyboard Shortcut: Ctrl+Shift+F
'
    ActiveCell.Select
    Selection.Font.Bold = True
    ActiveCell.Offset(2, 1).Range("A1:B1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    ActiveCell.Offset(-1, 3).Range("A1:E1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    ActiveCell.Offset(2, 0).Range("A1:E1").Select
    Range(Selection, Selection.End(xlDown)).Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    ActiveCell.Offset(-2, 8).Range("A1:B1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    ActiveCell.Offset(2, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    ActiveCell.Offset(0, -11).Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With

End Sub

Вот моя попытка написать код для жирного шрифта:

' Bold Macro
'
' Keyboard Shortcut: Ctrl+b
'
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = False
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = False
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
    ActiveCell.Offset(3, 0).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Font.Bold = True
End Sub

Я включил ссылка на образец файла для справки.

1 Ответ

1 голос
/ 17 апреля 2020

Дело не в «относительных ссылках», где ваши проблемы ie, а в ссылках. Возьмите этот код.

Dim Ws As WorkSheet
Dim Rng As Range

Set Ws = Worksheets("Sheet1")
Set Rng = Ws.Cells(1, "A").Resize(2, 10)

Код сначала объявляет два объекта, то есть имена даются. Эта простая настройка позволяет вам избежать всех операторов «Выбор» или «Активировать» и устраняет все ссылки на объект ActiveSheet или Selection. Это примерно половина вашего кода.

Определив лист и присвоив ему имя, вы можете обратиться к любой ячейке в нем, например, Ws.Cells(13, "C").Font.Bold = True. Обратите внимание, что Клетки (13, "C") также (лучше) можно рассматривать как Клетки (13, 3). Вы можете изменить имя этого листа, например Ws.Name = "My New Name", и при этом ссылаться на него в своем коде как Ws. В нем можно указать диапазоны, как показано выше, либо указав смещение (как метод Resize), либо просто указав первую и последнюю ячейку.

Set Rng = Ws.Range("A1:C37")
or 
Set Rng = Ws.Range(Ws.Cells(1, 1), Ws.Cells(37, "A"))
which would usually be written like this:-
With Ws
    Set Rng = .Range(.Cells(1, 1), .Cells(37, 1))
End With

Вы также можете использовать объект рабочего листа для идентифицируйте таблицы на листе.

Dim Tbl As ListObject
Set Tbl = Ws.ListObjects(1)
or
Set Tbl = Ws.ListObjects("Table1")

Этот новый объект дает вам доступ ко всем видам ячеек.

Set Rng = Tbl.DataBodyRange    ' all the data below the header row
Set Rng = Tbl.HeaderRowRange   ' the row with captions
Set Rng = Tbl.Range            ' all of the table

Внутри каждого диапазона ячейки доступны по их строке и столбцу или по их индекс. Tbl.Range.Cells(1) совпадает с Tbl.Range.Cells(1, 1) или Tbl.HeaderRowRange.Cells(1). Каждая из этих ячеек имеет объект Font, который имеет свойство Bold, которое вы можете установить, даже не выбирая ничего. И вы все равно можете ссылаться на них по координатам их листа.

Достаточно. Пожалуйста, возьми это отсюда.

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