Использование переменной в качестве ссылки на столбец для автоматического суммирования указанного столбца VBA - PullRequest
2 голосов
/ 08 января 2020

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

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

Этот код работает специально для столбца Y, но я пытаюсь выяснить, как заставить его использовать переменная для столбца. Например, я использую отдельный макрос под названием «FindInvoiceColumn», чтобы выбрать первую ячейку в столбце, содержащем строку «invoice_amount», а затем я хотел бы использовать что-то вроде того, что я написал ниже, чтобы установить «ColumnAddress» в качестве столбца значение этой ячейки. Насколько я знаю, .Column возвращает номер столбца, что нормально, но я предполагаю, что мне придется использовать Cells () вместо Range (), я просто не знаю, как сюда добраться.

(Часть кода также показывает добавление слова «Итого» слева от ячейки, содержащей значение автосуммы, и выделение обоих жирным шрифтом).

Вот что у меня есть:

Dim Rng As Range
   Dim c As Range

   Set Rng = Range("Y" & rows.Count).End(xlUp).Offset(1, 0)
   Set c = Range("Y1").End(xlDown).Offset(1, 0)
   c.Formula = "=SUM(" & Rng.Address(False, False) & ")"

   'Selects next empty row of column X to add "Total" label for sum of column Y'
    Range("X" & Cells.rows.Count).End(xlUp).Offset(1, 0).Select
   ActiveCell.FormulaR1C1 = "Total"

   'Bolds Total and the Sum of invoices'
   Range("X" & Cells.rows.Count).End(xlUp).Select
   Selection.Font.Bold = True
   Range("Y" & Cells.rows.Count).End(xlUp).Select
   Selection.Font.Bold = True```




'The below is what I'd like to use to find the dynamic value of the column.'

'Finds cell in row 1 that contains column header "invoice_amount" and selects it'
 Call FindInvoiceColumn

'Dim ColumnAddress As Integer
 ColumnAddress = ActiveCell.Column

Ответы [ 2 ]

1 голос
/ 08 января 2020

Я использовал этот код для установки номера столбца, если ваш заголовок находится в переменной позиции

Dim F As Object
ColumnAddress = 0
With ActiveSheet.Rows(1)
        Set F = .Find(What:="invoice_amount", LookAt:=xlWhole)
        If F Is Nothing Then
            MsgBox "This is not a proper file"
            ' other code
        Else 
            ColumnAddress = F.Column
        End If
End With

Затем вы должны использовать Cells () вместо диапазона, чтобы выполнить дальнейшую работу с результатом ColumnAddress. Кроме того, ColumnAddress должен быть тусклым, если быть точным.

1 голос
/ 08 января 2020

Вы можете использовать .Address, чтобы получить ссылку на столбец, например:

Sub test()
    Dim varCol As String
    varCol = Columns(ActiveCell.Column).Address
    Debug.Print varCol 'OUTPUTS $A:$A when I had cells(1,1) selected
End Sub

В приведенном выше примере я выбрал одну ячейку для A) найти ссылку на столбец через .Column, и B) нашел .address указанного столбца.


Вы также можете выполнить сумму в определенном диапазоне, используя нотацию .cells(), а не нотацию .range().

Sub test2()
    Dim rng As Range
    Set rng = Range(Cells(1, 1), Cells(2, 1))
    Cells(3, 1).Formula = "=sum(" & rng.Address & ")"
End Sub

Вышеприведенный код выводит: enter image description here


Спецификация c. Используя нотацию .cells(), вы можете сделать ссылку на свой столбец переменной, например:

dim r as long, c as long
r = 1
c = 4
debug.print cells(r,c).address `should output $D$1 (untested)

Вы можете выбрать r или c в соответствии с вашими потребностями.


И как всегда ... избегать выбора / активации, где это возможно !!!



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

Добавление использования последней строки с помощью кода, поскольку комментарии ужасны:

dim col as long
col = 25 'Y
With sheets("name")
    dim lastRow as long
    lastRow = .cells(.rows.count,col).end(xlup).row
    Dim rng As Range
    Set rng = .Range(.Cells(1, 1), .Cells(lastRow, col))    
end with

Это Именно поэтому я упомянул особенности об обозначениях после этого раздела (использование r и c в качестве переменных).

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