Разделение столбцов макроса Excel

#excel #vba

#excel #vba

Вопрос:

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

Я прикрепил картинку, чтобы изобразить это. Все фрагменты данных будут разделены, определенные первым столбцом, 1 или 2 на рисунке. Я просто хочу переместить фрагмент два вверх и рядом с 1. Единственная проблема, с которой я столкнулся, заключается в том, что для каждого фрагмента количество столбцов является переменным.

Редактировать: ссылка на изображение, если встроенная не отображается: введите описание ссылки здесь

введите описание изображения здесь

Будет ли это относительно близко?

 Sub macro() 
Dim wav_name As String 

Range("A1").Select 

Do While ActiveCell.Value <> "" 
ActiveCell.Offset(0, 2).Select 
wav_name = ActiveCell.Value 
ActiveCell.Offset(1, 0).Select 

Do 
    If ActiveCell.Value = wav_name Then 
        ActiveCell.Offset(1, 0).Select 
    Else 
        Exit Do 
    End If 
Loop 

Range(ActiveCell.Offset(0, -2), ActiveCell.End(xlDown)).Select 
Selection.Cut 
ActiveCell.End(xlUp).Offset(0, 3).Select 
ActiveSheet.Paste 

Loop 

Range("A1").Select 
End Sub
 

Комментарии:

1. По какой-то причине ваше изображение не отображается для меня, поэтому я не уверен, что следую логике, но стоит отметить, что вам не нужно выделять ячейки для работы с ними.

2. Должна быть какая-то спецификация относительно того, когда и где будут находиться данные 1 и 2, которые сейчас кажутся в основном случайными. Могут ли некоторые случайные вещи быть также 1 и 2?

3. 1 и 2 будут в первом столбце. Все остальные столбцы данных будут произвольными данными, мы просто хотим разделить их при изменении этого первого столбца и переместить этот фрагмент вверх и рядом с его предшественником.

4. У вас есть только два блока для изменения порядка или несколько блоков для перемещения на одном листе?

5. Несколько, на самом деле я должен сказать МНОГО. Это данные исследования. Я просто попытался поработать с тем, что я установил в качестве ответа ниже, но это работает не совсем правильно. Это просто перенос всего, что нужно, в столбец like, XEW..

Ответ №1:

То, что у вас есть, довольно выполнимо с одним ключевым исключением.

Выделенный фрагмент захватывает только первую строку данных. Вам нужно будет изменить его на

 Range(ActiveCell).Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
 

Чтобы обрабатывать переменное количество столбцов, вы можете захватить последний столбец в первом разделе, добавив переменную (например, LastCol) и поместив следующий код в цикл Do

 LastCol = Activecell.End(xlToRight).Column
 

Затем замените 3 в вашем последнем операторе смещения на вашу переменную

Обратите внимание, что вы можете провести рефакторинг кода, чтобы удалить многие операторы select (включая те, которые я упомянул выше), если вам нужно улучшить производительность вашего кода, но то, что вы написали, будет работать на вас.

РЕДАКТИРОВАТЬ: Вот как будет выглядеть ваш конечный код

 Sub macro() 
Dim wav_name As String 
Dim LastCol as Long

Range("A1").Select 

Do While ActiveCell.Value <> "" 
ActiveCell.Offset(0, 2).Select 
wav_name = ActiveCell.Value 
ActiveCell.Offset(1, 0).Select 
LastCol = Activecell.End(xlToRight).Column

Do 
    If ActiveCell.Value = wav_name Then 
        ActiveCell.Offset(1, 0).Select 
    Else 
        Exit Do 
    End If 
Loop 

Range(ActiveCell.Offset(0, -2), ActiveCell.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select

Selection.Cut 
ActiveCell.End(xlUp).Offset(0, LastCol  1).Select 
ActiveSheet.Paste 

Loop 

Range("A1").Select 
End Sub
 

Я не тестировал это, так что вам, возможно, придется провести некоторую отладку… но теперь это логически правильно.

Комментарии:

1. Производительность не является проблемой. Однако я не уверен на 100%, что вы придерживаетесь и заменяете код на приведенный выше, не могли бы вы проиллюстрировать?

2. Эй, Пиннер, думаешь, мы могли бы поработать над этим? В нынешнем виде он работает некорректно. Прямо сейчас он просто сдвигает все вправо, в столбец XEW. Это вообще не разделение данных на основе столбца A. Кроме того, он выдает ошибку «ActiveCell.End (xlUp). Смещение (0, LastCol 1). Выберите «указать ошибку, определяемую приложением или объектом (ошибка 1004)