如何将 return 值添加到命名范围而不是使用范围的 Offset()

How to return values to a named range instead of using a range's Offset()

专家警告:我是 vba...

的“初学者”

我有一个工作簿,用于根据产品名称查找产品的属性。例如。命名范围“Album_Name”中值为“John Coltrane 的我最喜欢的东西”的单元格应 return 命名范围“Musician”中的值“John Coltrane”,命名范围中的值“Jazz” “Music_genre”(从命名范围“Album_Name偏移 78 列),等等

我目前正在使用这个:

Sub UpdateAttributes()

    Dim c As Range
    Dim i As Integer
    Dim vezesQueEncontrouNumero As Integer
    Dim posicaoSegundoNumero As Integer

    For Each c In Range("Album_Name", Range("Album_Name ").End(xlDown))

    vezesQueEncontrouNumero = 0
    posicaoSegundoNumero = -1

    For i = 1 To Len(c)

        If IsNumeric(Mid(c, i + 1, 1)) Then
            vezesQueEncontrouNumero = vezesQueEncontrouNumero + 1
            If (vezesQueEncontrouNumero) = 2 Then
                posicaoSegundoNumero = i
            End If
        End If
    Next
**If InStr(UCase(c.Value), UCase("John Coltrane")) > 0 Then c.Offset(0, 78).Value = "Jazz"**

我的问题: 随着属性数量的增加,通过正确的列数“c.Offset”变得越来越困难。有时我必须在两者之间添加列,这真的行不通!有没有办法将 c.Value 放在命名范围内而不是使用 Offset

谢谢。


更新

在@Luuklag、@walleye、@JvdV 和 - 特别是 - @nwhaught 的帮助下,我重写了我的 vba 但仍然无济于事。我仍然缺少一些东西。 vba 更改同一列 ("name") 中单元格的值,而不是 "Genre" 或 "Artist" 列中的单元格值。 (我确实把 "name" 放在了 A1,"Genre" 放在了 B1,"Artist" 放在了 C1)。 "colNum" 的 "attribution" 不知何故无法正常工作。

    Sub UpdateProductAttributes()

    Dim colNum As Integer
    For colNum = 1 To 100 'or however many populated columns you end up having...
        Select Case Sheet1.Cells(1, colNum) 'Look at the column header
            Case "Genre" 'If you've found the "Genre" column
                genreColumn=colNum 'Give the genreColumn variable the correct value
            Case "Artist"
                artistColumn=colNum
        End Select
    Next

   Dim c As Range
    Dim i As Integer
    Dim vezesQueEncontrouNumero As Integer
    Dim posicaoSegundoNumero As Integer

    For Each c In Range("name", Range("name").End(xlDown))
    vezesQueEncontrouNumero = 0
    posicaoSegundoNumero = -1
        For i = 1 To Len(c)

            If IsNumeric(Mid(c, i + 1, 1)) Then
            vezesQueEncontrouNumero = vezesQueEncontrouNumero + 1

            If (vezesQueEncontrouNumero) = 2 Then
            posicaoSegundoNumero = i

            End If
            End If

    Next i

        If InStr(UCase(c.Value), UCase("Coltrane")) > 0 Then
            c.Offset(0, genreColumn).Value = "Jazz"

            ElseIf InStr(UCase(c.Value), UCase("Brad Spreadsheet")) > 0 Then
            c.Offset(0, genreColumn).Value = "Indie Folk Grunge"

        End If
        Next c
End Sub

有什么问题吗?

扩展一些评论: 索引匹配是一种模式,通常在 in-cell 公式中用作 VLOOKUP 的 more-flexible 伴侣。

它是这样工作的:=INDEX(YourTotalRangeOfData,MATCH("YourSearchKey",TheColumnRangeOfYourSearchKey,0),TheNumberOfTheColumnInYourTotalRangeThatYouWantToReturn)

实际上,它看起来像这样:=INDEX(C3:E11,MATCH("Frantz",B3:B11,0),2)

在单元格中,Excel 将为您跟踪更改。在代码中,您将继续 运行 解决更改列引用编号的问题。

walleye 关于设置列变量的评论很好,您可以这样做:

Dim genreColumn as Integer
genreColumn = 78

**If InStr(UCase(c.Value), UCase("John Coltrane")) > 0 Then c.Offset(0, genreColumn).Value = "Jazz"**

在我看来,更好的做法是在代码的开头有一个 "setup" 部分 运行。设置部分的目的是为您设置所有列变量。类似于:

Dim colNum as Integer
For colNum = 1 to 100 'or however many populated columns you end up having...
    Select Case Sheet1.Cells(1, colNum) 'Look at the column header
        Case "Genre" 'If you've found the "Genre" column
            genreColumn = colNum 'Give the genreColumn variable the correct value
        Case "Artist"
            artistColumn = colNum
    End Select
Next

运行 在您的代码的开头,您将永远不必再担心更改列位置。只要您的列标题正确(更容易检查),您就会得到正确的数字。

另外,为了回应其他人所说的,你做得很好。这看起来不像 "pre" 初学者的代码。 :)