#excel #vba #worksheet
Вопрос:
Вертолет всем,
я хотел бы перенести столбец A-K в другую таблицу, начиная с шестой строки.
он должен перенести столбцы, если я нажму кнопку. Форма пользователя откроется и спросит у меня номер ссылки, который зарегистрирован в Coumn A. Все строки, содержащие выбранный номер ссылки, должны быть перенесены в другую таблицу.
Мой код не работает, потому что он занимает весь столбец. И это не удаляет строки из области копирования.
Область назначения должна быть архивом.
Большое спасибо!
Sub Archiv() Dim Zeile As Long Dim ZeileMax As Long Dim Bereich As Range With Sheets("Protokoll") 'Set Bereich = .Rows(3) ZeileMax = .Cells(.Rows.Count, 1).End(xlUp).Row For Zeile = 6 To ZeileMax If .Cells(Zeile, 1).Value = Userform_boxnumber.Value Then 'Set Bereich = Union(Bereich, .Rows(Zeile)) 'Range(Cells(ilastRow, 1), Cells(ilastRow, 11)).Select End If Next Zeile Bereich.Copy Destination:=Sheets("Archiv").Range("A3") End With End Sub
Ответ №1:
Использование Union
для сбора совпадающих строк-хорошая идея. Одна из проблем Union
заключается в том, что ни один из диапазонов не разрешен Nothing
, или это вызывает ошибку. Таким образом, первая строка, добавленная в диапазон, должна быть сделана без использования Union
. Вот почему я использую If Else
оператор для обработки первой совпадающей строки.
Я использую .Resize
для обрезки диапазонов от полной строки до столбцов A-K.
Наконец, я использую .Delete
для очистки области копирования перед размещением новых данных в «Архив». Вы также можете использовать .ClearContents
или = ""
, все они достигают одной и той же общей цели.
Sub Archiv() Dim Zeile As Long Dim ZeileMax As Long Dim Bereich As Range With Sheets("Protokoll") ZeileMax = .Cells(.Rows.Count, 1).End(xlUp).Row For Zeile = 6 To ZeileMax If .Cells(Zeile, 1).Value = Userform_boxnumber.Value Then If Bereich Is Nothing Then Set Bereich = .Rows(Zeile).Resize(1, 11) Else Set Bereich = Union(Bereich, .Rows(Zeile).Resize(1, 11)) End If End If Next End With With Sheets("Archiv") 'Clearing the Archiv Copy area ZeileMax = .Cells(.Rows.Count, 1).End(xlUp).Row If ZeileMax gt; 6 Then .Range(.Cells(6, 1), .Cells(ZeileMax, 11)).Delete Shift:=xlShiftUp If Not Bereich Is Nothing Then Bereich.Copy Destination:=.Range("A6") End With End Sub
Комментарии:
1. Спасибо! Если я использую код, я получаю сообщение об ошибке «Объект или проблемы с блоком
2. @Зеленая Какая строка вызывает ошибку?
3. @Green В ходе моего тестирования я обнаружил, что возможным источником ошибок может быть то, что
.Cells(Zeile, 1).Value = Userform_boxnumber.Value
никогда не является правдой и, следовательноBereich
, выполняетсяNothing
и не может выполняться.Copy
в последней строке. Убедитесь, что при оценке оператора If оба значения имеют один и тот же тип (String amp; String или Double amp; Double), это, по крайней мере, гарантирует, что вы не пропустите допустимые совпадения из-за неправильного ввода.