你能给Excel中的列一个变量名吗?

时间:2013-12-17 20:39:18

标签: excel vba excel-vba

我有一个相当大的Excel电子表格,大约有4500行,有35列。

我们的VBA代码按字母引用列(又名 A1 A2 A3 ... A4500 )修改字段值时......这是一个限制,因为我们无法在工作表中移动列,而无需将所有代码更新到该列移动到的位置。

是否可以为列提供变量名称?

如果列A当前包含First Name,是否可以将此列命名为First_Name,以便无论此列移动的位置如何,它都会保留First_Name引用?

然后在我们的VBA代码中,我们可以说First Name而不是A1

谢谢!

3 个答案:

答案 0 :(得分:8)

最简单的方法是标注(35)与列号或列号对应的变量或枚举。

Option Explicit

Public Const Name As String = "A"
Public Const Age As String = "C"
Public Const ID As String = "F"
...

然后在引用列时使用定义的名称,即。 Range(Name & 13).

这样,您只需要在列的顺序发生变化时修改public const蚂蚁。

如果您按数字引用列,请考虑使用Enum

Public Enum Col
    Name = 1
    ID = 2
    Age = 3
End Enum


Sub Main()
    Cells(1, Col.ID) = "ID HEADER"
End Sub

答案 1 :(得分:0)

这是一个动态查找列的版本:

Sub test()
    Do While True ' Ctrl-Break to stop
        MsgBox ColByName(InputBox("Name:"))
    Loop
End Sub

Function ColByName(colName As String) As Long
    Dim iCol As Long
    For iCol = 1 To UsedRange.Columns.Count ' need better upper range for code off of a sheet
        If Cells(1, iCol) = colName Then
            ColByName = iCol
            Exit Function
        End If
    Next iCol
    ColByName = -1
End Function

我更喜欢ENum路线,但有时它不实用,可能会引入维护问题。

另一种方法是按名称索引的集合 - 在移动列时重建集合等。请注意,测试显示默认比较区分大小写。

答案 2 :(得分:0)

我经常使用的一种技术是利用Excel table。使用此命令将在工作表中创建一个特殊对象,然后您可以在VBA代码中引用该对象。 (当然,如果您愿意,可以使用VBA以编程方式添加新的Excel表。)

例如,如果工作表中有数据,如:

+--------------+-------------+
|  First_Name  |  Last_Name  |
+--------------+-------------+
|  John        |  Smith      |
|  Sally       |  Jones      |
+--------------+-------------+

将其转换为Excel表后,您将能够使用以下代码引用它:

Option Explicit

Public Sub SampleCode()
    '
    '  selects Last_Name column
    '
    Range("Table1[Last_Name]").Select


    '
    '  prints "Jones"
    '
    Debug.Print Cells(3, Range("Table1[Last_Name]").Column).Value
End Sub

Excel将为您以Table1开头创建一个连续的表名。您可以在Excel中更改此名称,或者如果以编程方式创建它,则为其指定唯一名称。