我有问题。我花了几个小时设计一个表格,它可以很好地满足您的所有反馈。今天,一切都出了问题。这样做的原因是简单的。添加了一些新列,显然,我的表单正在读取的数据现在是错误的。
因此,我正在考虑尝试以下内容......
而不是使用下面的列号
TK = Cells(ActiveCell.Row, "S").Value 'everything in the form refers to the active row
我可以使用第1行中的列标题。
这可能吗?通过这种方式,电子表格可以将列添加到用户想要的数量,并且表单将动态扫描正确的标题并以此方式获取列号。
我的想法是,在打开表格时,读入所有标题,挑选出我需要的标题并将它们分配给变量。然后我使用我的普通代码并将变量替换为列部分。
这听起来很容易,但我不知道该怎么做。
答案 0 :(得分:4)
使用多功能Find
为您提供一种快速检测标题位置的方法 - 或者是否缺少
在下面的代码中,我已指定搜索必须返回
xlWhole
)False
)匹配可以是部分匹配(xlPart
),如果您希望匹配游戏中的游戏
<强>码强>
Const strFind = "Game"
Sub GetEm()
Dim rng1 As Range
Set rng1 = ActiveSheet.Rows(1).Find(strFind, , xlValues, xlWhole, , , False)
If Not rng1 Is Nothing Then
MsgBox "Your column is " & rng1.Column
Else
MsgBox strFind & " not found", vbCritical
End If
End Sub
答案 1 :(得分:3)
为什么要使用循环?没有必要。
Dim col as variant
Col = application.match("my header", rows(1), 0)
If iserror(col) then
'not found
Else
TK = cells(activecell.row, col)
End if
答案 2 :(得分:1)
为此,我通常使用一个贯穿标题的函数(在工作表的第一行),并返回包含我搜索过的值的列号。
Public Function FindColumn(HeaderName As String, Sht As String) As Long
Dim ColFound As Boolean
Dim StartingPoint As Range
ColFound = False
Set StartingPoint = Sheets(Sht).Range("A1")
Do While StartingPoint.Value <> ""
If UCase(Trim(StartingPoint.Value)) = UCase(Trim(HeaderName)) Then
FindColumn = StartingPoint.Column
ColFound = True
Exit Do
Else
Set StartingPoint = StartingPoint.Offset(0, 1)
End If
Loop
If Not ColFound Then FindColumn = 0
End Function
实施例:
如果您的工作表的第一行命名为&#34;时间轴&#34;包含标题,例如&#34;日期&#34; (A1),&#34;时间&#34; (B1),&#34;价值&#34; (C1)然后调用FindColumn("Time", "Timeline")
返回2,因为&#34;时间&#34;是表格中的第二列&#34;时间轴&#34;
希望这对你有所帮助。
答案 3 :(得分:1)
你的想法很好。读取列标题以计算地址是避免硬编码的一种方法 - 例如
Sub Test()
Dim R As Range
Set R = ActiveSheet.[A1]
Debug.Print ColNo(R, "Col1Hdr")
End Sub
Function ColNo(HdrRange As Range, ColName As String) As Integer
' 1st column with empty header is returned if string not found
ColNo = 1
Do While HdrRange(1, ColNo) <> ""
If HdrRange(1, ColNo) = ColName Then Exit Do
ColNo = ColNo + 1
Loop
End Function
我经常使用的另一种方式 - 我必须承认我更喜欢上述方法,就是在一个单独的“定义”模块中为我的所有表定义Enum
,例如。
Public Enum T_VPN ' sheet VPN
NofHRows = 3 ' number of header rows
NofCols = 35 ' number of columns
MaxData = 203 ' last row validated
GroupNo = 1
CtyCode = 2
Country = 3
MRegion = 4
PRegion = 5
City = 6
SiteType = 7
' ....
End Enum
并像
一样使用它Sub Test1()
Debug.Print ActiveSheet(T_VPN.NofHRows, T_VPN.Country)
End Sub
如您所见,使用情况更简单。虽然这又是“某种”硬编码,但在一个地方进行所有定义会大大减少维护。