powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Плиз хелп
21 сообщений из 21, страница 1 из 1
Плиз хелп
    #34730258
ency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая проблема:

Несколько пользователей заполняют лист в книге назовем его "Отчет" форма его одинаковая для всех и сдают помесячно (в этой книге есть и другие листы)

Также существует итоговая книга

Как создать макрос чтобы данные из выбранных книг только с листа "Отчет" копировались в мастер-книгу на лист "Отчет" друг за другом без шапки...

Форум листал долго но не могу подогнать примеры под себя точнее интересует как сделать чтобы друг за другом добавлялись и не трогали предыдущие
...
Рейтинг: 0 / 0
Плиз хелп
    #34730372
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Неверное название топика, думаю многие даже заходить не будут.
2) Информации на форуме действительно много

Например так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Option Explicit

Dim NewLine As Integer, Col As Integer, ToSheet As Worksheet

' Фукция для нахождения последней строки
Public Function LastRow(Optional ws As Worksheet, Optional FindRange As String) As Long
  If ws Is Nothing Then Set ws = ActiveSheet
  If FindRange = "" Then FindRange = Cells.Address
  LastRow = ws.Range(FindRange).Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
End Function

Sub RegularCopy(FName As String)
  Dim openwb As Workbook, FromSheet As Worksheet, FromRangeName As String, Lrow As Long, Frow As Long
  'Открытие исходной книги предполагается что файлы находятся в том же каталоге в папке исходные файлы
  'Для того чтобы макрос работал необходимо эту книгу запускать через меню ФАЙЛ - Открыть книгу!
  Workbooks.Open Filename:="Исходные данные\" & FName & ".XLS", UpdateLinks:=False
   Set openwb = ActiveWorkbook
   'наименование листа с которого будут копироваться данные, предполагается, что во всех книгах одинаковый
   Set FromSheet = openwb.Sheets("Отчёт")
   'Имя Диапазона, в котором искать последнюю строку
   FromRangeName = Range(Cells( 1 ,  1 ).Address, Cells(Rows.Count, Col).Address).Address
   
   'первая строка в диапазоне, которую нужно копировать
   Frow =  3 
   'нахождение последней строки в диапазоне
   Lrow = LastRow(FromSheet, FromRangeName)
   
   'Копирование значений диапазона
   ToSheet.Range(Cells(NewLine,  1 ).Address, Cells(NewLine - Frow + Lrow, Col).Address).Value = _
   FromSheet.Range(Cells(Frow,  1 ).Address, Cells(Lrow, Col).Address).Value
   
   NewLine = NewLine - Frow + Lrow +  1 
   
  'закрытие книги
  openwb.Close False
End Sub
Sub Выбрать_данные()
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
   
   '№ Последнего столбца для консолидации, первый считается "A".
   'Дейсвует как для исходных данных, так и для итоговых
   Col =  20 
   'Первая строка в которую заполняются значения
   NewLine =  3 
   'Лист на который будем копировать
   Set ToSheet = ThisWorkbook.Sheets("Отчёт")
   'Открытие листа куда заполняются данные
   ToSheet.Select
   'Очистка предыдущих данных
   Range(Cells(NewLine,  1 ), Cells(Rows.Count, Col)).Clear
   
   'Запуск процедуры копирования по каждому файлу, сколько угодно раз.
   'В кавычках имя файла без расширения
   RegularCopy ("Файл1")
   RegularCopy ("Файл2")
   RegularCopy ("Файл3")

 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub
...
Рейтинг: 0 / 0
Плиз хелп
    #34732784
ency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я этот я зык еще плохо знаю можно как нить попроще для чайников
...
Рейтинг: 0 / 0
Плиз хелп
    #34732842
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad Добрый день
скажи, каким всё-таки способом надо, или лучше, определять последнюю строку
методом Find(What:="*", как в твоей функции LastRow
или так
Код: plaintext
1.
2.
        With ThisWorkbook.Worksheets("Лист1").UsedRange
             RowMax = .Rows.Count + .Row -  1 
        End With
Спасибо
...
Рейтинг: 0 / 0
Плиз хелп
    #34732912
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_Deggasad Добрый день
скажи, каким всё-таки способом надо, или лучше, определять последнюю строку
методом Find(What:="*", как в твоей функции LastRow
или так
Код: plaintext
1.
2.
        With ThisWorkbook.Worksheets("Лист1").UsedRange
             RowMax = .Rows.Count + .Row -  1 
        End With
Спасибо

В отсутствие Deggasad, если позволишь... :-)
Думаю, что не существует реально надежного/универсального метода определения последней строки, у всех есть слабые стороны:

1) UsedRange
- включает как заполненные ячейки, так и пустые, но с форматированием
- не всегда автоматически обновляется после удаления строк

2) SpecialCells(xlCellTypeLastCell)
- включает как заполненные ячейки, так и пустые, но с форматированием
- не всегда автоматически обновляется после удаления строк

3) Find(What:="*"...
- дает неверный результат в случае со слитыми ячейками в конце диапазона

4) End(xlDown)
- действует только в одном столбце
- дает последнюю строку только в непрерывном списке

5) End(xlUp)
- действует только в одном столбце

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Плиз хелп
    #34732930
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо
...
Рейтинг: 0 / 0
Плиз хелп
    #34732972
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_Deggasad Добрый день
скажи, каким всё-таки способом надо, или лучше, определять последнюю строку
методом Find(What:="*", как в твоей функции LastRow
или так
Код: plaintext
1.
2.
        With ThisWorkbook.Worksheets("Лист1").UsedRange
             RowMax = .Rows.Count + .Row -  1 
        End With
Спасибо


Я не спец, учился в основном на этом форуме и на практических задачах, и книжек особо не читал (да простят меня форумяне), это я к тому что я судить не могу про то что лучше.
Но по простому попытаться подумать:
С UsedRange
- нужно найти этот UsedRange
- посчитать в нём количество строк
- потом определится с первой строкой
- и вычислить

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

В свою очередь метод Find с параметром SearchDirection:=xlPrevious делает следующее
начинает смотреть в указанном диапазоне в обратном порядке, т.е. с первой ячейки и назад на последнюю - прямиком к цели (не проверял, но по-моему быстрее должно быть) А уж насколько более широкие возможности у Find я уже вроде рассказывал - можно в определённом диапазоне, можно в ячейке искать, можно Range сразу возвращать, что очень удобно для дальнейшего использования в коде.
Есть ещё один способ быстро найти последнюю заполненную строку, которым удобно пользоваться для одного столбца:
Например для столбца B
Код: plaintext
ActiveSheet.Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
...
Рейтинг: 0 / 0
Плиз хелп
    #34732978
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не тормоз, меня просто без конца дёргают!
...
Рейтинг: 0 / 0
Плиз хелп
    #34732994
ency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а мне то что делать?
...
Рейтинг: 0 / 0
Плиз хелп
    #34733010
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большущее всем спасибо и Deggasad и KL (XL)
я учусь в основном на этом форуме
С уважением Игорь
...
Рейтинг: 0 / 0
Плиз хелп
    #34733039
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)

1) UsedRange
- включает как заполненные ячейки, так и пустые, но с форматированием
- не всегда автоматически обновляется после удаления строк

2) SpecialCells(xlCellTypeLastCell)
- включает как заполненные ячейки, так и пустые, но с форматированием
- не всегда автоматически обновляется после удаления строк

3) Find(What:="*"...
- дает неверный результат в случае со слитыми ячейками в конце диапазона

4) End(xlDown)
- действует только в одном столбце
- дает последнюю строку только в непрерывном списке

5) End(xlUp)
- действует только в одном столбце

KL
[MVP - Microsoft Excel]

1),2) Абсолютно согласен

3) - Ну это если только слитые ячейки не все попадают в выделенных диапазон, насколько я понимаю? Если так то: во превых, это никак не влияет если мы ищем на всём листе, как в случае с UsedRange (для сравнения); Во вторых ты сам говорил, что слияние ячеек вообще самая глюченая фигня и её впринципе не нужно использовать, тем более не представлю себе чтобы внизу диапазона, или на крайний случай отменять перед выполненем макроса, чтобы глюков не было.
4) зачем если есть пункт 5)
5) Так это и используется в тех случаях, когда нужно для одного столбца. Я бы это назвал не недостатком, а скорее сферой применения.

З.ы. напоследок забавная история:
Давали мне одну програмулину, довольно приличная (по объёму), много труда вложено, много кода, много людей ею пользуются, так вот там последняя строка знаете как определялась.
Код: plaintext
1.
2.
3.
4.
For i =  1  to  65536 
 If cells(i, 1 ) <> "" Then
   n = n +  1 
 End if
next i
И так много, много раз - естественно можно себе представить насколько медленно + допущение что диапазон непрерывный.
...
Рейтинг: 0 / 0
Плиз хелп
    #34733108
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
encyя этот я зык еще плохо знаю можно как нить попроще для чайников

Знаешь я как раз попроще и сделал вроде, постарался ввести все переменные которые может потребоваться поменять, сделал краткие описания, не использовал сложных методов. Примерно с такого кода (2 модуля и 1 функция) и с такими же краткими объяснениями начиналось моё изучение VBA (товарищ помог сделать первую выборку из 60 книг, я честно говоря был шокирован, а прошло с того времени меньше года, щас сам многим помогаю, так что дерзайте). Правда этот пример я делал уже давно, сейчас бы наверное я по другому сделал.
...
Рейтинг: 0 / 0
Плиз хелп
    #34733154
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
encyа мне то что делать?изучи код, что Deggasad нарисовал, там коментариев полно
начни хотя бы посстрочно разбирать
С уважением Игорь
...
Рейтинг: 0 / 0
Плиз хелп
    #34762171
kyber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что, если ловить данные снизу?
Код: plaintext
Range("A65536").End(xlUp).Select
...
Рейтинг: 0 / 0
Плиз хелп
    #34762439
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты предыдущие посты читал???
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Плиз хелп
    #36073839
cbetji0ta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeggasadKL (XL)

1) UsedRange
- включает как заполненные ячейки, так и пустые, но с форматированием
- не всегда автоматически обновляется после удаления строк

2) SpecialCells(xlCellTypeLastCell)
- включает как заполненные ячейки, так и пустые, но с форматированием
- не всегда автоматически обновляется после удаления строк

3) Find(What:="*"...
- дает неверный результат в случае со слитыми ячейками в конце диапазона

4) End(xlDown)
- действует только в одном столбце
- дает последнюю строку только в непрерывном списке

5) End(xlUp)
- действует только в одном столбце

KL
[MVP - Microsoft Excel]

1),2) Абсолютно согласен

3) - Ну это если только слитые ячейки не все попадают в выделенных диапазон, насколько я понимаю? Если так то: во превых, это никак не влияет если мы ищем на всём листе, как в случае с UsedRange (для сравнения); Во вторых ты сам говорил, что слияние ячеек вообще самая глюченая фигня и её впринципе не нужно использовать, тем более не представлю себе чтобы внизу диапазона, или на крайний случай отменять перед выполненем макроса, чтобы глюков не было.
4) зачем если есть пункт 5)
5) Так это и используется в тех случаях, когда нужно для одного столбца. Я бы это назвал не недостатком, а скорее сферой применения.

З.ы. напоследок забавная история:
Давали мне одну програмулину, довольно приличная (по объёму), много труда вложено, много кода, много людей ею пользуются, так вот там последняя строка знаете как определялась.
Код: plaintext
1.
2.
3.
4.
For i =  1  to  65536 
 If cells(i, 1 ) <> "" Then
   n = n +  1 
 End if
next i
И так много, много раз - естественно можно себе представить насколько медленно + допущение что диапазон непрерывный.

Поправочка по поводу "забавной истории"
идет подсчет "не пустых" ячеек, а не нахождение последней строки. Если в комментариях было указано, что этот кусок находит последнюю строку, тогда забавно.
...
Рейтинг: 0 / 0
Плиз хелп
    #36074316
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cbetji0taDeggasad
З.ы. напоследок забавная история:
Давали мне одну програмулину, довольно приличная (по объёму), много труда вложено, много кода, много людей ею пользуются, так вот там последняя строка знаете как определялась.
Код: plaintext
1.
2.
3.
4.
For i =  1  to  65536 
 If cells(i, 1 ) <> "" Then
   n = n +  1 
 End if
next i
И так много, много раз - естественно можно себе представить насколько медленно + допущение что диапазон непрерывный.

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

1) А для того чтобы понять зачем это не обязательно писать комментарии :)
2) Подсчет непустых ячеек можно сделать 10 более быстрыми способами
3) И наконец ДА, этот подсчет делался в этом файле для определения строки до которой нужно брать диапазон, т.е. последней заполненной строки. Причем не один раз а повсеместно в файле.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Плиз хелп
    #39495991
Vitaliy Sahno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
Deggasad,
Помогите разобраться в чем ошибка.
У меня в одном и том же модуле формы
Код: vbnet
1.
2.
3.
4.
5.
[FIXED]Dim Diapazon, Diapazon1 As String
...
Private Sub _1
    With Workbooks("Книга1").Worksheets("Лист2").Range(Diapazon)
           iLastRow = .Cells(.Rows.count, 1).End(xlUp).Row 


СЧИТАЕТ НА 2 (ДВЕ!!!) ячейки больше - причем
я для проверки делаю Активате данного диапазона - он его правильно показывает
но вместо 6 ячеек - считает 8

НО и это еще НЕ ВСЕ
в том же модуле:

Код: vbnet
1.
2.
3.
Private Sub _2
     With Workbooks("Книга2").Worksheets("Лист1").Range(Diapazon)
           iLastRow = .Cells(.Rows.count, 1).End(xlUp).Row 


Вообще считает = 1
Что может мешать?
...
Рейтинг: 0 / 0
Плиз хелп
    #39496021
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vitaliy Sahno
Код: plaintext
Deggasad,
Помогите разобраться в чем ошибка.
У меня в одном и том же модуле формы
Код: vbnet
1.
2.
3.
4.
5.
[FIXED]Dim Diapazon, Diapazon1 As String
...
Private Sub _1
    With Workbooks("Книга1").Worksheets("Лист2").Range(Diapazon)
           iLastRow = .Cells(.Rows.count, 1).End(xlUp).Row 


СЧИТАЕТ НА 2 (ДВЕ!!!) ячейки больше - причем
я для проверки делаю Активате данного диапазона - он его правильно показывает
но вместо 6 ячеек - считает 8

НО и это еще НЕ ВСЕ
в том же модуле:

Код: vbnet
1.
2.
3.
Private Sub _2
     With Workbooks("Книга2").Worksheets("Лист1").Range(Diapazon)
           iLastRow = .Cells(.Rows.count, 1).End(xlUp).Row 


Вообще считает = 1
Что может мешать?

Diapazon имеет тип данных Variant, хотя маловероятно, что причина в этом, возможно ячейки не совсем пустые? Было бы здорово взглянуть на файл.
...
Рейтинг: 0 / 0
Плиз хелп
    #39496174
Vitaliy Sahno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Увы для того чтобы Вы увидели надо высылать оба файла и слишком много кода, чтобы в нем разбираться. Проще все-таки
Код: vbnet
1.
2.
3.
4.
[SRC vba]For i = 1 to 65536
 If cells(i,1) <> "" Then
   n = n + 1
 End if

[/SRC]
next i чем ловить ошибку!!! Тем более у меня строк будет максимум 1000
...
Рейтинг: 0 / 0
Плиз хелп
    #39496176
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vitaliy SahnoУвы для того чтобы Вы увидели надо высылать оба файла и слишком много кода, чтобы в нем разбираться. Проще все-таки
Код: vbnet
1.
2.
3.
4.
[SRC vba]For i = 1 to 65536
 If cells(i,1) <> "" Then
   n = n + 1
 End if

[/SRC]
next i чем ловить ошибку!!! Тем более у меня строк будет максимум 1000

Можно скопировать лист с данными и кусок проблемного кода и выложить только их.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Плиз хелп
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]