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

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

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

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

Форум листал долго но не могу подогнать примеры под себя точнее интересует как сделать чтобы друг за другом добавлялись и не трогали предыдущие
...
Рейтинг: 0 / 0
15.08.2007, 17:40
    #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
16.08.2007, 15:30
    #34732784
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
я этот я зык еще плохо знаю можно как нить попроще для чайников
...
Рейтинг: 0 / 0
16.08.2007, 15:42
    #34732842
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
Deggasad Добрый день
скажи, каким всё-таки способом надо, или лучше, определять последнюю строку
методом Find(What:="*", как в твоей функции LastRow
или так
Код: plaintext
1.
2.
        With ThisWorkbook.Worksheets("Лист1").UsedRange
             RowMax = .Rows.Count + .Row -  1 
        End With
Спасибо
...
Рейтинг: 0 / 0
16.08.2007, 16:00
    #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
16.08.2007, 16:05
    #34732930
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
Огромное спасибо
...
Рейтинг: 0 / 0
16.08.2007, 16:14
    #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
16.08.2007, 16:16
    #34732978
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
Я не тормоз, меня просто без конца дёргают!
...
Рейтинг: 0 / 0
16.08.2007, 16:20
    #34732994
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
а мне то что делать?
...
Рейтинг: 0 / 0
16.08.2007, 16:24
    #34733010
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
Большущее всем спасибо и Deggasad и KL (XL)
я учусь в основном на этом форуме
С уважением Игорь
...
Рейтинг: 0 / 0
16.08.2007, 16:32
    #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
16.08.2007, 16:46
    #34733108
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
encyя этот я зык еще плохо знаю можно как нить попроще для чайников

Знаешь я как раз попроще и сделал вроде, постарался ввести все переменные которые может потребоваться поменять, сделал краткие описания, не использовал сложных методов. Примерно с такого кода (2 модуля и 1 функция) и с такими же краткими объяснениями начиналось моё изучение VBA (товарищ помог сделать первую выборку из 60 книг, я честно говоря был шокирован, а прошло с того времени меньше года, щас сам многим помогаю, так что дерзайте). Правда этот пример я делал уже давно, сейчас бы наверное я по другому сделал.
...
Рейтинг: 0 / 0
16.08.2007, 16:57
    #34733154
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
encyа мне то что делать?изучи код, что Deggasad нарисовал, там коментариев полно
начни хотя бы посстрочно разбирать
С уважением Игорь
...
Рейтинг: 0 / 0
29.08.2007, 16:17
    #34762171
kyber
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
А что, если ловить данные снизу?
Код: plaintext
Range("A65536").End(xlUp).Select
...
Рейтинг: 0 / 0
29.08.2007, 17:07
    #34762439
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плиз хелп
А ты предыдущие посты читал???
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.07.2009, 15:47
    #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
06.07.2009, 08:45
    #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
Период между сообщениями больше года.
27.07.2017, 13:41
    #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
27.07.2017, 14:16
    #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
27.07.2017, 16:26
    #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
27.07.2017, 16:30
    #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
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Плиз хелп / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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