Excel 使用变量作为列引用对所述列VBA进行自动求和

Excel 使用变量作为列引用对所述列VBA进行自动求和,excel,vba,Excel,Vba,我对VBA非常陌生,一直在一节一节地编写一些代码来格式化工作表(我一直在一节一节地编写,以便了解每个工作表的工作原理,并使用最后一个宏将所有宏调用到一个长过程中) 问题是,有时我处理的工作表并没有按相同的顺序逐月导出(我无法控制),因此要自动计算某一列,我必须找到列标题,然后自动计算该列,但这会使列字母(或数字)完全可变。我知道如何将行作为变量使用,但我被列卡住了。我一直在搜索论坛,试图找到一个简洁的解释,但还是没有用 这段代码确实适用于Y列,但我正试图找出如何让它为该列使用变量。 例如,我使用

我对VBA非常陌生,一直在一节一节地编写一些代码来格式化工作表(我一直在一节一节地编写,以便了解每个工作表的工作原理,并使用最后一个宏将所有宏调用到一个长过程中)

问题是,有时我处理的工作表并没有按相同的顺序逐月导出(我无法控制),因此要自动计算某一列,我必须找到列标题,然后自动计算该列,但这会使列字母(或数字)完全可变。我知道如何将行作为变量使用,但我被列卡住了。我一直在搜索论坛,试图找到一个简洁的解释,但还是没有用

这段代码确实适用于Y列,但我正试图找出如何让它为该列使用变量。 例如,我使用一个名为“FindInvoiceColumn”的单独宏来选择列中包含字符串“invoice_amount”的第一个单元格,然后我想使用下面写的内容将“ColumnAddress”设置为该单元格的列值。据我所知,Column返回列号,这很好,但我假设我必须使用Cells()而不是Range(),我只是不知道如何得到这里

(部分代码还显示在包含自动求和值的单元格左侧添加单词“Total”,并将两者都设置为粗体)

以下是我目前掌握的情况:

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

您可以使用
.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
上述代码输出:


特定于使用
.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
作为变量)。

如果标题处于可变位置,我使用此代码设置列号

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()代替range来进一步处理ColumnAddress的结果。此外,为了准确起见,ColumnAddress应该尽可能长

谢谢你的这段代码!但是,每当我看到代码的这一部分时,我是否需要将Rng更改为Range以外的值才能使用Cells()?(意思是现在变量Dim Rng as Range-应该是其他的吗?)否则,我会在设置Rng=列的第一个空行的行上不断得到“运行时错误'1004':应用程序定义的或对象定义的错误”<代码>设置Rng=Range(“Y”和rows.Count).结束(xlUp).偏移量(1,0)设置c=Range(“Y1”).结束(xlDown).偏移量(1,0)c.公式=“=SUM”(&Rng.Address(False,False)&”)”设置Rng=Cells(rows.Count,ColumnAddress).结束(xlUp).偏移量(1,0)设置c=Cells(1,ColumnAddress).结束(xlDown).偏移量(1,0)您希望引用X的任何位置(即,左边的一列)都是单元格(行,列地址-1)。。。但是按照编码,Rng和c不返回相同的东西吗?你是不是想让c变成一系列的单元格,比如Y2:Y9999之类的,因为你需要进一步的编辑。谢谢。我不能使用第二种方法,因为不同工作表的行数也不同。由于varCol作为字符串是暗淡的,这将返回列地址的字母形式?如果是这样,我将如何实现到
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)&”)”
@Kaz我认为您可以对单元格使用第二种方法。对于每个表/列/等,您将确定最后一行(
lastRow
lastRow=.Cells(.Rows.Count,col).End(xlUp).Row
其中
col
是变量列。然后,您可以使用
单元格(lastRow,c)
作为范围的结尾,如示例2所示。啊,好的!谢谢你的澄清。对不起,新的在VBA和任何类型的代码一般。我只是一个试图让自己的生活更轻松的EA!我们都从某个地方开始,@Kaz。如果这解决了您的问题,请告知我们(在帖子左侧用绿色复选标记作为答案);否则,让我们知道还有什么问题没有解决!谢谢你的知识!