Форум по VBA, Excel и Word

VBA, Excel => VBA, макросы в Excel => Тема начата: Screen от 08 октября 2022, 14:36

Название: Вставить из листа
Отправлено: Screen от 08 октября 2022, 14:36
Добрый день! Не могу нигде найти информацию. Есть типовые листы (заявки) из них надо определенные ячейки перенести на отдельный лист. Можно ли сделать так, чтобы не писать код под каждую ячейку и лист, а просто выбрать активный лист, нажать на макрос и всё сразу загружалось? Я примерно представляю как это сделать, но не выходит. И чтобы каждый лист начинался с новой строки в таблице. Так же в исходных листах есть объединённые ячейки. Спасибо большое!
Вот то что я смогла сделать:
Worksheets("Лист 2").Range("F11:H11").Copy Worksheets("Отчёт").Range("N3")

   For Each rCell In Worksheets("Отчёт").Range("N3")
       rCell.UnMerge
   Next
   
Worksheets("Лист 2").Range("C12").Copy Worksheets("Отчёт").Range("O3")

   For Each rCell In Worksheets("Отчёт").Range("O3")
       rCell.UnMerge
   Next
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 14:46
Написал вам два письма на почту с заголовком "Письмо с Форума по VBA, Excel и Word". Написал именно на почту, а не на форум.

Вместо Worksheets("Лист 2") пишите ActiveSheet:
ActiveSheet.Range("F11:H11").Copy Worksheets("Отчёт").Range("N3")
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 15:24
Я пыталась так сделать, но он не копирует ничего. Выделяет этот код желтым. Я только учусь, не понимаю что не так...
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 15:33
Всё получилось, разобралась. спасибо большое!
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 16:00
Как сделать, чтобы вставлялось в пустую ячейку этого столбца? вместо Worksheets("Отчёт").Range("N3")
Нашла вот это, но как использовать не понимаю:
Dim iLastRow As Long 
iLastRow = Cells(Rows.Count,2).End(xlUp).Row 
cells(iLastRow+1,2).Select
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 16:05
End не ищет в скрытых строках.
Activesheet можно не указывать, можно сразу писать Range.

Sub Макрос()
   
    Dim r As Long
   
    r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "N").End(xlUp).Row + 1
    Range("F11:H11").Copy Worksheets("Отчёт").Cells(r, "N")

End Sub
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 17:04
Снова ваша помощь нужна...
Ячейки, из которых я копирую, объединенные. А вставить нужно в 1 ячейку без объединения.
Пыталась разными способами, вот последние:
1)Range("A3:D8").MergeCells = False
2)Dim rCell As Range
   For Each rCell In Worksheets("Отчёт").Range("D3")
   rCell.UnMerge
Но проблема в том, что я не знаю в какую строку будет вставляться, тк будет заполняться следующая пустая.
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 17:07
Если форматы (заливку ячеек, размер шрифта и тому подобное) копировать не надо, то можно не использовать метод Copy:
Sub Макрос()
   
    Dim r As Long
   
    r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "N").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "N").Value = Range("F11").Value

End Sub
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 18:34
извините, не вставляется ничего, пустые ячейки
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 18:41
Именно ваш код вставляет, но когда меняю на другие ячейки-ничего не работает
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 18:52
Выложите код, который не вставляет.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 18:55
Первые 4 кода работает, остальные нет
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "N").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "N").Value = Range("F11").Value
   
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "M").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "M").Value = Range("E11").Value
   
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "L").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "L").Value = Range("D11").Value
   
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "K").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "K").Value = Range("C11").Value
   
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "J").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "J").Value = Range("G8").Value
   
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "I").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "I").Value = Range("C8").Value
   
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 18:57
Этот код не вставляет:?
r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "J").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "J").Value = Range("G8").Value
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 18:57
да, верно код ниже тоже не вставляет
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 18:59
Range("G8") объединённая ячейка?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 19:01
Как я понимаю, дело в том, что заголовки объеденены
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 19:06
Спереди может быть есть пробелы. В целевой ячейке видны только пробелы. Перейдите в целевую ячейку, затем зайдите в строку формул. В строке формул подвигайте курсор. Если двигается, значит что-то есть в ячейке.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 19:12
Нет, пробелов нет
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 19:16
С какой ячейки начинается строка, которую вы показали в ответе #15?
На скриншоте начало строки не видно, поэтому не известно, что там у вас происходит.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 20:37
Первый столбец свободный. Когда убираю объединение заголовков, то всё работает. Но если так сделаю, то будет неудобно
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 20:42
В ответе #15 есть скриншот.
Сделайте такой же скриншот, но чтобы было видно начало.
В ответе #19 у вас что-то совсем другое.
Перед тем, как будете делать скрин-шот, не объединяйте, покажите, как у вас есть.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 20:44
Это начало, просто тут не вставляется ничего
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:08
В ответе #15 скриншот начинается со столбца L. Покажите эту же строку в таком же виде, но с начала.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:12
Я могу файлы скинуть, если нужно
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:14
В ответе #15 вы выделили объединённую ячейку, с какого столбца начинается эта объединённая ячейка?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:21
Она не объединенная, просто выделила перед удалением
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:22
Про объединенные ячейки имела ввиду заголовки, которые объединены построчно. Те А1 и А2, В1 и В2
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:24
Я про Range G8 пытаюсь выяснить, а вы про заголовки стали писать. Я сразу не сообразил. Вы пишите про то, что вас спрашивают.
Range("G8") объединённая ячейка?
Вас спросили про G8, значит в следующем сообщении ваш ответ должен содержать какую-то информацию про G8. Это простая логика.
Что вы хотели показать ответом #15? Какая взаимосвязь между моим вопросом про G8 и скриншотом из ответа #15?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:27
Извините, я совсем запуталась... Да, она объединенная
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:29
С какого столбца начинается объединённая ячейка? Со столбца G?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:30
да, со столбца G.
Мне кажется, что не вставляется в другие ячейки, потому что заголовки объединены. Вставилось только там, где заголовки не объединены. Только не ругайтесь)
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:31
А что находится в G8, какой-то текст или ещё что?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:32
Да, текст, эл.почта
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:33
Щёлкните в ячейке G8 и посмотрите, что в адресной строке, какой там адрес?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:46
G8
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:46
Эта ячейка объединённая: Worksheets("Отчёт").Cells(r, "J")?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:49
Нет, в Отчёте нет объединенных ячеек (кроме заголовков)
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 21:54
Да, объединение заголовков может иметь значение.
Если строки таблицы ещё не заполнены, а на листе только заголовок и он объединённый, то последняя строка будет определена неправильно. Но у вас в ответе #15 на скриншоте не видно столбца J.
Макрос получается вставляет значение в заголовок, в невидимую ячейку.
Значит последнюю строку ищите по тому столбцу, в котором всегда будут данные или в котором нет объединённых заголовков.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 21:58
Когда отменяла объединение заголовков, то всё работало. Просто так не очень удобно. Я вас поняла, буду переделывать заголовки. Спасибо большое за терпение!
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 22:03
А зачем вы ищите в отчёте последнюю строку для каждого столбца?
Почему бы не найти её один раз?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 22:09
Я думала каждый раз нужно. Если планируется большое кол-во новых заявок, чтобы автоматом они подгружались. Я вот разобралась с этим. Единственное, некоторые поля не заполнены в заявке и поэтому ищу как вместо пустой ячейки писать тире. Если вам не сложно показать, буду рада)
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 22:11
Теперь вы будете искать последнюю строку в отчёте один раз? В этом случае тогда вы можете искать последнюю строку по тому столбцу, в котором нет объединённых ячеек в заголовке, и вам не надо менять внешний вид заголовков.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 22:15
Ого, спасибо))))
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 22:17
Вот так должно получиться:

Макрос
Sub Макрос()
   
    Dim r As Long
   
    r = Worksheets("Отчёт").Cells(Worksheets("Отчёт").Rows.Count, "N").End(xlUp).Row + 1
    Worksheets("Отчёт").Cells(r, "N").Value = Range("F11").Value
    Worksheets("Отчёт").Cells(r, "M").Value = Range("E11").Value
    Worksheets("Отчёт").Cells(r, "L").Value = Range("D11").Value
    Worksheets("Отчёт").Cells(r, "K").Value = Range("C11").Value
    Worksheets("Отчёт").Cells(r, "J").Value = Range("G8").Value
    Worksheets("Отчёт").Cells(r, "I").Value = Range("C8").Value
   
End Sub
[свернуть]
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 22:28
Работает то, что я предложил? Вместо столбца N можете выбрать другой столбец для поиска последней строки.
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 22:42
Да, всё работает! Спасибо огромное! Вы что-то типа курсов проводите?
Название: Re: Вставить из листа
Отправлено: Администратор от 08 октября 2022, 22:43
нет, курсы не провожу
у вас ещё был вопрос или вы уже нашли решение?
Название: Re: Вставить из листа
Отправлено: Screen от 08 октября 2022, 22:52
Последний вопрос, как сделать чтобы автоматически размер ячеек подтекст подстраивался?
Название: Re: Вставить из листа
Отправлено: Администратор от 09 октября 2022, 07:16
Есть такие варианты:
1. ширину столбцов можно взять из листа-источника;
2. можно использовать метод Range.AutoFit. В Экселе это когда пользователь щёлкает два раза левой кнопкой мыши по правой границе в строке, в которой адреса (номера) столбцов. После вставки данных, примените этот способ вручную и посмотрите, получается ли нужный результат.