如何将 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" 初学者的代码。 :)
专家警告:我是 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" 初学者的代码。 :)