在列中dynamic读取

我有个问题。 我花了好几个小时来devise一个表单,这个表单在你所有的反馈中都很有用 今天,一切都出错了。 这样做的原因是简单的。 一些新的列被添加,显然,我的表单正在阅读的数据现在是错误的。

因此,我正在考虑尝试以下…

而不是像下面那样使用列号

TK = Cells(ActiveCell.Row, "S").Value 'everything in the form refers to the active row 

我可以使用第1行的列标题。

那可能吗 ? 通过这种方式,电子表格可以将列添加到用户想要的数量,并且表单将dynamic扫描正确的标题并以此方式获取列号。

我的想法是,在打开表格时,阅读所有标题,挑选出我需要的标题,并将它们分配给一个variables。 然后我使用我的普通代码并将该variablesreplace为列部分。

这听起来很容易,但我不知道如何做到这一点。

使用多functionFind可以快速检测标题的位置,或者是否丢失

在这里查找细节

在下面的代码中,我已指定search必须返回

  • 完全匹配( xlWhole
  • 区分大小写( False

比赛可以是一个部分匹配( xlPart ),如果你想匹配说游戏X游戏

 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 

为什么使用循环? 没有必要

 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 

为此,我通常使用一个函数,它贯穿头部(位于表格的第一行),并返回包含我search的值的列的编号。

 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 

例如 :如果名为“Timeline”的工作表的第一行包含诸如“Date”(A1),“Time”(B1),“Value”(C1),然后调用FindColumn("Time", "Timeline") 2,因为“时间”是表单“时间线”中的第二列,

希望这可以帮助你一点。

你的想法是好的。 读取列标题来计算地址是避免硬编码的一种方式 – 例如

 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 

正如你所看到的,使用更简单。 所有这一切都是硬编码的“某种”,将所有定义放在一个地方,大大减less了维护。