#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:
Присвоение имен диапазонам строк
- Честно говоря, никогда не слышал об этом. По сути, в этом случае вы берете диапазон и пишете разные имена в его первом столбце, и когда вы перебираете строки, для каждой строки вы пишете что-то вроде
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. Спасибо! Мой первоначальный код был для столбцов, и я попытался заставить его работать для строк без особого успеха. Я думаю, что этот способ позволил бы мне объединить их в одну подпрограмму тоже!