Этот код немного сложен из-за двух столбцов на экране. Мой код ниже считывает два столбца в один, сортирует пустые строки в конец, а затем разделяет полученный единственный столбец на два. Все это делается, не касаясь самих ячеек. Поэтому форматирование остается на месте.
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 строк данных на столбец. Вам нужно будет изменить это число. Просто чтобы помочь вам сориентироваться: -
- «AnchorColumn» - это первый столбец в первом столбце списка. Отсчет всех остальных столбцов ведется оттуда. Это не обязательно должен быть столбец A. Вы можете оставить столбец A пустым и привязать свой список к столбцу B (= 2).
- «TableColumns» - это столбцы, которые повторяются в каждом «ListColumn». У вас может быть больше 4 или меньше.
- «ListColumn» состоит из нескольких «TableColumns». Вы можете иметь более 2.
- «SpaceColumns» - это пустые столбцы листа, вставленные между «ListColumns».
NspFirstRow
указывает первую строку данных. Над ним находятся подписи или другие данные, которых эта программа не затрагивает. Вы можете зарезервировать первые 10 строк для чего-то еще и начать свой список со строки 11.
Установив эти 6 перечислений, вы можете создавать списки из 2 или более столбцов списка в любом месте листа с любыми количество строк данных. Не все это прошло исчерпывающую проверку. Когда вы удаляете строку в любом месте (фактически только первую ячейку этой строки), список переписывается, чтобы переместить пустую строку в конец последнего столбца списка.