1

Я начинаю новую должность через 8 дней, и я довольно плохо знаком с Visual Basic. Мне удалось отследить работу текущего сотрудника, и в одном из отчетов человек просеивал около 100 столбцов, выбирая 8 или около того для отчета, копируя и вставляя в новый лист.

То, что я хотел бы сделать, это следующее:

Создайте макрос, который просматривает лист 2, в котором у меня будет 8 заголовков столбцов для отчета, просматривает лист 1 (основной лист), находит 8 столбцов и перемещает данные (не заголовки) на лист 2. Это помогло бы ускорить отчет, есть и другие вещи, которые я хотел бы сделать, но это послужило бы отличной отправной точкой.

IE: лист 2 будет иметь: имя подрядчика, имя менеджера, описание проекта и т.д.

1 ответ1

0

Как можно более простой.

1 |Sub copycolumns()
2 |Dim i As Integer, searchedcolumn As Integer, searchheader As Object
3 |
4 |For i = 1 To 8
5 |
6 |   set searchheader = Sheets(2).Cells(1, i)
7 |
8 |   searchedcolumn = 0
9 |   On Error Resume Next
10|   searchedcolumn = Sheets(1).Rows(1).Find(what:=searchheader.value, lookat:=xlWhole).Column
11|   On Error GoTo 0
12|
13|   If searchedcolumn <> 0 Then
14|      Sheets(1).Columns(searchedcolumn).Copy Destination:=searchheader
15|   End If
16|    
17|Next i
18|
19|End Sub
  • Строка 4: использует цикл FOR, который перемещает переменную от 1 до 8.
    Переменная i обозначает текущий столбец на листе 2

  • Строка 6: Здесь мы сохраняем текущий заголовок (одну ячейку) как объект. Этот объект будет повторно использован в строках 10 и 14

  • Строка 8: перед новым поиском необходимо сбросить поисковую searchedcolumn для поиска. Если вы этого не сделаете, и поиск не удастся (не представлен на листе 1), переменная все еще содержит старое значение.

  • Строка 10: метод find является ключевой частью всего макроса. Он взял строку вашего текущего столбца из листа 2 и ищет ее в первой строке листа 1. Если есть положительный поиск хит, соответствующий номер столбца хранится в переменной searchedcolumn

  • Строки 9 и 11: это запускает и останавливает обработчик ошибок. Таким образом, если в строке 10 происходит ошибка, вы не получите внутреннего сообщения об ошибке VBA. Вместо этого код будет продолжаться.

  • Строка 13: проверить, нашел ли метод find что-то и изменилось ли значение с нуля на действительный номер столбца.

  • Строка 14: если да, скопируйте весь столбец с листа 1 в соответствующий столбец на листе 2


Примечание: код может быть сокращен еще больше. Но чем было бы сложнее все объяснить.

Конечно, вы должны вручную удалить номер индекса в начале каждой строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .