У меня есть рабочий лист с заголовками, перечисленными в верхней строке. У меня также есть данные, перечисленные в строках ниже. Эти данные должны оставаться сгруппированными как ряд, и не могут изменять положение относительно друг друга. Тем не менее, весь ряд может двигаться свободно. Каждый заголовок описывает тип данных строки ниже.
Я хочу иметь возможность:
- Сообщите макросу, в каком столбце искать строки группы. Для простоты мы назовем это Col D
- Просмотр всей таблицы.
- Переместить похожие строки, чтобы они были сгруппированы вместе. ***
- Добавить группу к выбору
* Примечание. Я также буду отмечать группы целым числом в столбце Z, чтобы показать, что группа является группой
Проблема, с которой я столкнулся, связана со следующей строкой в моей подпрограмме FindRow:
ActiveSheet.Range(curRange).Resize (resizeRng)
Dubug говорит curRange = "Elevator", который является значением ячейки, но не диапазоном, но я определяю его выше:
inRange = "A" & rngStart & ":" & Mid(alphabet, totHdrLngth, 1) & belowRowCount
Set curRange = ActiveSheet.Range(inRange)
Для справки я объясню общий код ниже:
CreateGroup - проверяет, имеют ли следующие строки одинаковое значение в Col D . Если это так, он помечает эту группу как уникальное целое число и увеличивает выбор. Если не вызывается FindRow.
FindRow - поиск во всей рабочей таблице строки (строка1) , имеющей то же значение в Col D . Если найдено, вызывает rowSwapper для замены найденной строки (row2) на строку ниже row1 .
RowSwapper - функция принимает два числа строк и заменяет их.
Вот подраздел CreateGroup :
Public Sub CreatGroup()
Dim letterCount As Integer
Dim letString, label, inRange As String
Dim rowSelect, marker, rowStart, rowCount, rngStart, count As Long
'Predefine necessary variables
marker = 1
rowCount = 2 'Start at row 2, excluding header
rowStart = 2 'For range reference to create group
belowRowCount = 3 'start below rowCount
isGroup = False
count = 1
'Loop through each cell in column D to determine if consecutive metrics have the same value
'If true, while loop sorts each series of consecutive metrics individually
Do
curCellVal = ActiveSheet.Range("D" & rowCount).Value 'Returns value rowCount(th) row of "Metric" column
nextCellVal = ActiveSheet.Range("D" & belowRowCount).Value 'Returns the value of the row under rowCount
marker = 1
resizeRng = 0
'Makes a cell selection while cell values in column 4 are equal
If curCellVal = nextCellVal Then '<<<NECESSARY?
isGroup = True 'Designates group has been found
If resizeRng = 0 Then
rngStart = rowCount
End If
'rowStart = ActiveSheet.Row
'Resize selection to include cell with same metric name
inRange = "A" & rngStart & ":" & Mid(alphabet, totHdrLngth, 1) & belowRowCount
Set curRange = ActiveSheet.Range(inRange)
'Establish place holder in col "Z" (empty) to track groups
ActiveSheet.Range("Z" & rowCount).Value = marker
ActiveSheet.Range("Z" & belowRowCount).Value = marker
resizeRng = resizeRng + 1
rowCount = rowCount + resizeRng
belowRowCount = rowCount + 1
ElseIf curCellVal <> nextCellVal Then 'And isGroup = True Then
FindRow rowCount
'Re-establish rowCount to account for cells that may have been added to group
rowCount = rowCount + resizeRng
belowRowCount = rowCount + 1
Else
rowCount = rowCount + 1
belowRowCount = rowCount + 1
End If
'to prevent subsequent groups of metrics from being labeled together
marker = marker + 1
isGroup = False
Loop While rowCount <= totCount
End Sub
Кроме того, для дополнительной информации эти подводные лодки являются частью более крупной программы, описанной здесь:
Сортировка групп строк Excel VBA Macro
Дайте мне знать ваши мысли ...