我有一个相当大的Excel电子表格,大约有4500行,有35列。
我们的VBA代码按字母引用列(又名 A1 , A2 , A3 ... A4500 )修改字段值时......这是一个限制,因为我们无法在工作表中移动列,而无需将所有代码更新到该列移动到的位置。
是否可以为列提供变量名称?
如果列A当前包含First Name
,是否可以将此列命名为First_Name
,以便无论此列移动的位置如何,它都会保留First_Name
引用?
然后在我们的VBA代码中,我们可以说First Name
而不是A1
?
谢谢!
答案 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中更改此名称,或者如果以编程方式创建它,则为其指定唯一名称。