VBA Excel: попытка присвоить динамическим диапазонам имена, организованные в строки

#excel #vba

#excel #vba

Вопрос:

У меня есть данные, организованные в строки, а в столбце B у меня есть заголовки данных. Я хочу выбрать данные после заголовков, а затем присвоить им имена диапазонов на основе этого заголовка. Я смог закодировать решение, которое могло бы динамически называть диапазоны столбцов таким образом, но при изменении его для присвоения имен строкам данных я столкнулся с ошибкой 1004, особенно в точке rng.CreateNames .

 Sub RowNames()                                                                                     
Dim ws As Worksheet, firstCol As Long, lastCol As Long, rowNum As Long, r As Integer, n As Integer, rng As Range, rngName As Range
Set ws = ThisWorkbook.Sheets("MonthlySales")
Set rng = ws.Range("B2:N41")
    For n = 1 To rng.Rows.Count
        For r = rng.Columns.Count To 1 Step -1
            rowNum = rng.Rows(n).Row
            firstCol = rng.Columns(1).Column
            lastCol = rng.Columns(r).Column
                If Cells(firstCol, rowNum).Value <> "" Then
                    Set rngName = Range(Cells(firstCol, rowNum), Cells(lastCol, rowNum))
                        rngName.CreateNames Left:=True
                        Exit For
                End If
        Next r
    Next n                                                                                         
  

End Sub

Ответ №1:

Присвоение имен диапазонам строк

Диапазон.Метод CreateNames

  • Честно говоря, никогда не слышал об этом. По сути, в этом случае вы берете диапазон и пишете разные имена в его первом столбце, и когда вы перебираете строки, для каждой строки вы пишете что-то вроде Range("A1:D1").CreateNames Left:=True создания именованного диапазона, имя которого является значением, A1 и оно будет ссылаться на диапазон B1:D1 .
  • Чтобы все перепутать, в этом примере (я думаю, также OP) предполагается, что в первом столбце могут быть пустые ячейки, и количество ячеек в каждом диапазоне строк может различаться. Каждый диапазон строк будет проверяться в обратном порядке на наличие значения, которое будет определять его размер.

Код

 Option Explicit

Sub RowNames()
    
    ' Define worksheet.
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("MonthlySales")
    ' Define Source Range.
    Dim rng As Range
    Set rng = ws.Range("B2:N41")
    ' Define Columns Count.
    Dim ColumnsCount As Long
    ColumnsCount = rng.Columns.Count
    
    Dim RowRange As Range ' Current Row Range
    Dim r As Long         ' Source Range Rows Counter
    Dim c As Long         ' Source Range / Current Row Range Columns Counter
    
    ' Loop through rows of Source Range.
    For r = 1 To rng.Rows.Count
        ' Create a reference to the current Row Range.
        Set RowRange = rng.Rows(r)
        ' Check if first cell of current Row Range contains a value,
        ' making it a possible candidate for a defined name.
        If RowRange.Cells(1).Value <> "" Then
            ' Loop through cells (columns) of current Row Range backwards.
            For c = ColumnsCount To 2 Step -1
                ' Check if current cell in current Row Range contains a value.
                If RowRange.Cells(c) <> "" Then
                    ' Create a named range from value in first cell. The range
                    ' is defined from the second cell to to current cell
                    ' in current Row Range.
                    RowRange.Cells(1).Resize(, c).CreateNames Left:=True
                    ' Exit loop, we got what we came for (the named range).
                    Exit For
                End If
            Next c
        End If
    Next r

End Sub
  

Комментарии:

1. Спасибо! Мой первоначальный код был для столбцов, и я попытался заставить его работать для строк без особого успеха. Я думаю, что этот способ позволил бы мне объединить их в одну подпрограмму тоже!