#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)