在列中动态读取

时间:2013-04-23 05:48:47

标签: excel excel-vba vba

我有问题。我花了几个小时设计一个表格,它可以很好地满足您的所有反馈。今天,一切都出了问题。这样做的原因是简单的。添加了一些新列,显然,我的表单正在读取的数据现在是错误的。

因此,我正在考虑尝试以下内容......

而不是使用下面的列号

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

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

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

我的想法是,在打开表格时,读入所有标题,挑选出我需要的标题并将它们分配给变量。然后我使用我的普通代码并将变量替换为列部分。

这听起来很容易,但我不知道该怎么做。

4 个答案:

答案 0 :(得分:4)

使用多功能Find为您提供一种快速检测标题位置的方法 - 或者是否缺少

Find details here

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

  • 完全匹配(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

如您所见,使用情况更简单。虽然这又是“某种”硬编码,但在一个地方进行所有定义会大大减少维护。