Как вернуть значения в именованный диапазон вместо использования Offset () диапазона - PullRequest
0 голосов
/ 31 января 2019

Предупреждение для экспертов: я «начинающий» в vba ...

У меня есть рабочая книга, которую я использую, чтобы найти атрибуты продукта на основе его названия.Например, ячейка в именованном диапазоне «Album_Name» со значением «My Favorite Things by John Coltrane» должна возвращать значение «John Coltrane» в именованном диапазоне «Musician», значение «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, @wallyeye, @JvdV и - особенно - @nwhaught IПереписал мой VBA, но до сих пор безрезультатно.Я все еще что-то упускаю.VBA изменяет значение ячейки в том же столбце («имя»), а не в столбце «Жанр» или «Исполнитель».(Я поставил «имя» в A1, «Жанр» в B1 и «Artist» в C1).Каким-то образом «атрибуция» colNum не работает.

    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

Что может быть не так?

1 Ответ

0 голосов
/ 31 января 2019

Чтобы подробнее остановиться на некоторых комментариях: индекс соответствия - это шаблон, который обычно используется в формулах внутри ячейки в качестве более гибкого дополнения к VLOOKUP.

Это работает так: =INDEX(YourTotalRangeOfData,MATCH("YourSearchKey",TheColumnRangeOfYourSearchKey,0),TheNumberOfTheColumnInYourTotalRangeThatYouWantToReturn)

На практике это выглядит так: =INDEX(C3:E11,MATCH("Frantz",B3:B11,0),2)

В ячейках Excel будет отслеживать изменения за вас.В коде вы продолжите сталкиваться с проблемами при изменении номеров ссылок на столбцы.

Комментарий wallyeye о настройке переменных столбца хорош, и вы могли бы сделать это так:

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

Запустите его в начале кода, и вам больше никогда не придется беспокоиться об изменении позиции столбца.Если у вас правильный заголовок столбца (который намного проще проверить), у вас будет правильный номер.

Кроме того, чтобы повторить то, что сказали другие, у вас все отлично.Это не похоже на код «предварительного» новичка.:)

...