VBA для перемещения строк инвентаря вверх при удалении предметов? - PullRequest
0 голосов
/ 08 мая 2020

Прошлым летом я сделал довольно базовый c VBA для инвентарного листа. В столбце A указано имя элемента, а в столбце B, C и D - дополнительная информация для каждого элемента в списке. Инвентарь двухколонный (A2: D28 и G2: J28). VBA, который я сделал, делает так, что если я удалю запись элемента в ячейке A4, информация в ячейках B4: D4 автоматически очищается вместе с ним.

Вопрос в том, что я изо всех сил пытался найти способ заставьте ячейки сдвигаться на строку вверх, когда строка над ней очищается, чтобы в списке не накапливались пустые строки при удалении элементов инвентаря. Большинство примеров, которые я нашел в Интернете, были для удаления этих пустых ячеек, тогда как я бы предпочел просто очистить их и сохранить свое форматирование без изменений.

Есть ли способ сдвинуть указанные c ячейки вверх как это? И было бы прекрасно, если бы существовал способ перемещать элементы из верхней части второй таблицы (G2: J2) вниз и в нижнюю часть первой таблицы в A28: D28.

Любая помощь будет очень признателен, или даже большой палец к соответствующему руководству. Спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Этот код немного сложен из-за двух столбцов на экране. Мой код ниже считывает два столбца в один, сортирует пустые строки в конец, а затем разделяет полученный единственный столбец на два. Все это делается, не касаясь самих ячеек. Поэтому форматирование остается на месте.

Option Explicit

Enum Nsp                        ' Table specs
    ' 023
    ' These enumerations define your table. Modify to suit
    NspAnchorClm = 1            ' 1 = column A
    NspTblClmCount = 4          ' number of Table Columns
    NpsSpaceClmCount = 2        ' number of blank sheet columns between List Columns
    NspListClmCount = 2         ' number of List Columns
    NspFirstRow = 2
    NspNumRows = 10             ' number of rows per List Column
End Enum


Sub ResetList()
    ' 023

    Dim Clm()       As Variant          ' First sheet column of each list column
    Dim ArrIn       As Variant          ' Input data array
    Dim Cin         As Long             ' input column counter
    Dim Rin         As Long             ' input row counter
    Dim ArrOut      As Variant          ' Output data array
    Dim Rout        As Long             ' output row counter
    Dim Rng         As Range            ' the sheet range of varying dimension
    Dim Tmp         As Variant          ' intermediate memory
    Dim L           As Integer          ' List column counter
    Dim C           As Long             ' column counter
    Dim R           As Long             ' row counter

    Clm = Array(NspAnchorClm, NspAnchorClm + NspTblClmCount + NpsSpaceClmCount)
    Tmp = (NspTblClmCount * NspListClmCount) + (NpsSpaceClmCount * (NpsSpaceClmCount - 1))
    Set Rng = Range(Cells(NspFirstRow, Clm(0)), _
                          Cells(NspFirstRow + NspNumRows - 1, Tmp))
    ' read all of the list into an array
    ArrIn = Rng.Value

    ' define a single list column array
    ReDim ArrOut(1 To NspNumRows * NspListClmCount, 1 To NspTblClmCount)

    ' transfer the data to a single list column
    For L = 1 To NspListClmCount
        For R = 1 To NspNumRows
            Rout = (L - 1) * NspNumRows + R
            For C = 1 To NspTblClmCount
                Cin = Clm(L - 1) + C - 1
                ArrOut(Rout, C) = ArrIn(R, Cin)
            Next C
        Next R
    Next L

    ' ArrIn is cleared and re-purposed to take data from ArrOut
    ReDim ArrIn(1 To UBound(ArrOut), 1 To UBound(ArrOut, 2))
    Rin = 0
    For Rout = 1 To UBound(ArrOut)
        ' skip rows where the first column is blank
        If Len(ArrOut(Rout, 1)) Then
            Rin = Rin + 1
            For C = 1 To UBound(ArrOut, 2)
                ArrIn(Rin, C) = ArrOut(Rout, C)
            Next C
        End If
    Next Rout

    ' assign NspNumRows high sections of ArrIn to ArrOut
    For L = 1 To NspListClmCount
        ReDim ArrOut(1 To NspNumRows, 1 To NspTblClmCount)
        For R = 1 To NspNumRows
            For C = 1 To NspTblClmCount
                ArrOut(R, C) = ArrIn(((L - 1) * NspNumRows) + R, C)
            Next C
        Next R
        Set Rng = Cells(NspFirstRow, Clm(L - 1)).Resize(NspNumRows, NspTblClmCount)
        Rng.Value = ArrOut
    Next L
End Sub

Я боюсь, что этот код сделает код, который у вас уже есть, устаревшим. Если первая ячейка в строке пуста, любое содержимое остальных будет опущено, как и ваш собственный код.

Обратите внимание на перечисление в верхней части кода. Он работает как коммутатор, где вы можете ввести все параметры. Вы можете изменить их как sh. Например, в моем коде NspNumRows = 10. На вашем листе 27 строк данных на столбец. Вам нужно будет изменить это число. Просто чтобы помочь вам сориентироваться: -

  1. «AnchorColumn» - это первый столбец в первом столбце списка. Отсчет всех остальных столбцов ведется оттуда. Это не обязательно должен быть столбец A. Вы можете оставить столбец A пустым и привязать свой список к столбцу B (= 2).
  2. «TableColumns» - это столбцы, которые повторяются в каждом «ListColumn». У вас может быть больше 4 или меньше.
  3. «ListColumn» состоит из нескольких «TableColumns». Вы можете иметь более 2.
  4. «SpaceColumns» - это пустые столбцы листа, вставленные между «ListColumns».
  5. NspFirstRow указывает первую строку данных. Над ним находятся подписи или другие данные, которых эта программа не затрагивает. Вы можете зарезервировать первые 10 строк для чего-то еще и начать свой список со строки 11.

Установив эти 6 перечислений, вы можете создавать списки из 2 или более столбцов списка в любом месте листа с любыми количество строк данных. Не все это прошло исчерпывающую проверку. Когда вы удаляете строку в любом месте (фактически только первую ячейку этой строки), список переписывается, чтобы переместить пустую строку в конец последнего столбца списка.

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