excel vba: получение ячейки перед выделением

#excel #get #selection #cell

#excel #получить #выделение #ячейка

Вопрос:

У меня следующая проблема в таблице 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
  

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

лучше всего, НАМ

Ответ №1:

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

 Sub LineFormatSynch()

  Dim RowNumber As Integer

  RowNumber = Selection.Row
  OriginAddress = "D" amp; 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
  

Комментарии:

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

Ответ №2:

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

 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
  

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

Комментарии:

1. Приведенный выше код предполагает, что под «таблицей Excel» вы подразумевали определенную таблицу Excel, см. Здесь . Если вы имели в виду, что у вас табличный макет, тогда код не будет вносить никаких изменений

2. ДА. Это было недоразумение. Извините за это. Я имел в виду лист Excel в файле.