Excel VBA: получить ячейку перед выбором - PullRequest
0 голосов
/ 04 октября 2011

У меня есть следующая проблема в таблице Excel. Я хочу иметь одинаковое форматирование в строке в зависимости от первой ячейки. Вот что я придумала до сих пор:

Sub LineFormatSynch()

  FSize = Selection.Offset(0, -1).Font.Size
  FName = Selection.Offset(0, -1).Font.Name
  FColor = Selection.Offset(0, -1).Font.Color
  FHAlign = Selection.Offset(0, -1).HorizontalAlignment
  FVAlign = Selection.Offset(0, -1).VerticalAlignment

  For Each c In Range("E196:BR196")

    c.Font.Size = FSize
    c.Font.Name = FName
    c.Font.Color = FColor
    c.HorizontalAlignment = FHAlign
    c.VerticalAlignment = FVAlign

  Next

End Sub

Но это недостаточно гибко. В основном я хочу выбрать строку и нажать кнопку выполнить макрос, и выбранные ячейки должны быть отформатированы так же, как и первая ячейка. Но я не могу понять, как извлечь адрес для первой ячейки из моего выбора. У меня есть номер строки в моем selection.address, как "$ E $ 197: $ BR $ 197". Ячейка, из которой я хочу выполнить форматирование, всегда находится в столбце «D». Как я могу извлечь "197" из моего selection.address? С регулярным выражением или есть лучший способ?

лучший, США

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Я нашел более простое решение, я думаю, но спасибо.Вот оно:

Sub LineFormatSynch()

  Dim RowNumber As Integer

  RowNumber = Selection.Row
  OriginAddress = "D" & CStr(RowNumber)

  FSize = Range(OriginAddress).Font.Size
  FName = Range(OriginAddress).Font.Name
  FColor = Range(OriginAddress).Font.Color
  FHAlign = Range(OriginAddress).HorizontalAlignment
  FVAlign = Range(OriginAddress).VerticalAlignment

  For Each c In Selection

    c.Font.Size = FSize
    c.Font.Name = FName
    c.Font.Color = FColor
    c.HorizontalAlignment = FHAlign
    c.VerticalAlignment = FVAlign

  Next

End Sub
0 голосов
/ 04 октября 2011

Вот пример способа ссылки на таблицу

Sub LineFormatSynch()
    Dim cl As Range
    Dim lst As ListObject
    Dim rw As Range

    Set cl = ActiveCell
    Set lst = cl.ListObject
    If Not lst Is Nothing Then ' in case ActiveCell is not in a table
        Set rw = lst.DataBodyRange.Rows(cl.Row - lst.DataBodyRange.Row + 1)

        With rw
            .Font.Size = cl.Font.Size
            .Font.Name = cl.Font.Name
            .Font.Color = cl.Font.Color
            .HorizontalAlignment = cl.HorizontalAlignment
            .VerticalAlignment = cl.VerticalAlignment
        End With
    End If
End Sub

Редактировать:

Чтобы использовать, выберите ячейку, которую вы хотите использовать в качестве формата шаблонадля строки, затем запустите макрос.Он будет:

  1. Определить, находится ли активная ячейка в таблице.
  2. Установить ссылку на строку, в которой находится выбранная ячейка
  3. Применить форматОтобранная ячейка для всех ячеек в одной строке таблицы

Set lst = cl.ListObject предоставляет ссылку на таблицу
Если cl отсутствует в таблице, lst будет установлен вNothing
lst.DataBodyRange предоставляет ссылку на данные таблицы (исключая строку заголовка)
Set rw = ... устанавливает ссылку на строку таблицы, содержащую активную ячейку
Пять строк внутри WithСкопируйте свойства из cl во все ячейки в rw

Кстати, это проверено в Excel 2010, если ваша версия отличается, могут быть некоторые различия, дайте мне знать

Редактировать 2:

Для общего диапазона листа, который просто выглядит как таблица, рассмотрим:

Sub LineFormatSynch()
    Dim cl As Range
    Dim lst As Range
    Dim rw As Range

    Set cl = ActiveCell
    Set lst = cl.CurrentRegion
    If Not lst Is Nothing Then
        Set rw = lst.Rows(cl.Row - lst.Row + 1)

        With rw
            .Font.Size = cl.Font.Size
            .Font.Name = cl.Font.Name
            .Font.Color = cl.Font.Color

            .HorizontalAlignment = cl.HorizontalAlignment
            .VerticalAlignment = cl.VerticalAlignment
        End With
    End If
End Sub

Текущий регион являетсядиапазон, ограниченный любой комбинацией пустых строк и пустых столбцов

...