Поиск в рабочей таблице похожих строк для группирования Excel VBA - PullRequest
2 голосов
/ 12 августа 2011

У меня есть рабочий лист с заголовками, перечисленными в верхней строке. У меня также есть данные, перечисленные в строках ниже. Эти данные должны оставаться сгруппированными как ряд, и не могут изменять положение относительно друг друга. Тем не менее, весь ряд может двигаться свободно. Каждый заголовок описывает тип данных строки ниже.

Я хочу иметь возможность:

  1. Сообщите макросу, в каком столбце искать строки группы. Для простоты мы назовем это Col D
  2. Просмотр всей таблицы.
  3. Переместить похожие строки, чтобы они были сгруппированы вместе. ***
  4. Добавить группу к выбору

* Примечание. Я также буду отмечать группы целым числом в столбце 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

Дайте мне знать ваши мысли ...

1 Ответ

0 голосов
/ 12 августа 2011

Если вы хотите получить адрес диапазона ячеек, вам просто нужно сказать rng.Address. Просто указать, что вы хотите, чтобы rng - это то же самое (по сути), что и сказать rng.Value

Что касается строки:

ActiveSheet.Range(curRange).Resize (resizeRng)

Вы можете попробовать

ActiveSheet.Range(curRange).Cells.Resize (resizeRng)

Прошлой ночью я немного поигрался с небольшим собственным проектом и столкнулся с похожей ошибкой.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...