3

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

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

而不是使用下面的列号

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

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

那可能吗 ?这样,电子表格可以根据用户的需要添加任意多的列,并且表单将动态扫描正确的标题并以这种方式获取列号。

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

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

4

4 回答 4

4

使用多功能Find为您提供一种快速的方法来检测您的标题在哪里 - 或者它是否丢失

在此处查找详细信息

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

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

xlPart如果您要匹配Game out of Game 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
于 2013-04-23T12:26:59.653 回答
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
于 2013-04-23T10:43:08.803 回答
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

示例:如果名为“时间轴”的工作表的第一行包含诸如“日期”(A1)、“时间”(B1)、“值”(C1) 等标题,则调用FindColumn("Time", "Timeline")返回 2,因为“时间”是第二列在工作表“时间轴”中

希望这可以帮助你一点。

于 2013-04-23T06:56:15.100 回答
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在单独的“定义”模块中为我的所有表定义 's,例如

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

如您所见,用法更简单。尽管这又是“某种”硬编码,但将所有定义集中在一个地方会显着减少维护。

于 2013-04-23T07:12:11.010 回答