Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Код парсер данных ячеек из множества книг в одну книгу. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Код парсер данных ячеек из множества книг в одну книгу. (Макросы/Sub)
Код парсер данных ячеек из множества книг в одну книгу.
ant6729 Дата: Четверг, 08.06.2017, 23:06 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Добрый вечер всем!

Обрыл интернет...но ничего подходящего не нашел...

Нужно, чтобы из книг с Лист1 из отдельной папки копировались данные в отдельную книгу на один лист.

Изначально есть статичная ChDir (адрес папки не планирует меняться)
В этой папке лежат книги. В книгах в листах1 в Cells (1,5) Cells (3,5) и Cells (Lr, 1) лежит нужная информация.

Мне нужно ее запарсить в отдельную книгу.

Знаю, что из примера в нете нужно циклом просматривать все книги директории...
Но комплексно я не понимаю...

Должно быть что - то

[vba]
Код
fPATH = "C:\2011\GroupFiles\" 'remember the final \ in this string

fNAME = Dir(fPATH & "*.xls") 'get the first filename in fpath
[/vba]
[vba]
Код
ActiveWorkbook.Add....))
lr = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row

i = Sheets("Лист1").Cells(Rows.Count, "A").End(xlUp).Row + 1

Cells(i,1).Value = Cells (1,5).Value
Cells(i,2).Value = Cells (3,5).Value
Cells(i,3).Value = Cells (lr,1).Value
[/vba]
Вообщем, прошу помочь.
Пример прилагаю. В лист1 пример расположения нужных данных, как он в книгах, откуда брать. В лист 2 пример(пример отдельной книги для сбора данных), куда вставлять.
Подскажите, пожалуйста....

Не понимаю, как
1) Запрашивать данные из всех книг
2) Бежать циклом по книгам

Есть, конечно, пример с power query, но он "длинный...." по исполнению. Хотел бы научиться через VBA.
К сообщению приложен файл: 8273140.xlsx (9.2 Kb)


Сообщение отредактировал ant6729 - Четверг, 08.06.2017, 23:51
 
Ответить
СообщениеДобрый вечер всем!

Обрыл интернет...но ничего подходящего не нашел...

Нужно, чтобы из книг с Лист1 из отдельной папки копировались данные в отдельную книгу на один лист.

Изначально есть статичная ChDir (адрес папки не планирует меняться)
В этой папке лежат книги. В книгах в листах1 в Cells (1,5) Cells (3,5) и Cells (Lr, 1) лежит нужная информация.

Мне нужно ее запарсить в отдельную книгу.

Знаю, что из примера в нете нужно циклом просматривать все книги директории...
Но комплексно я не понимаю...

Должно быть что - то

[vba]
Код
fPATH = "C:\2011\GroupFiles\" 'remember the final \ in this string

fNAME = Dir(fPATH & "*.xls") 'get the first filename in fpath
[/vba]
[vba]
Код
ActiveWorkbook.Add....))
lr = Sheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row

i = Sheets("Лист1").Cells(Rows.Count, "A").End(xlUp).Row + 1

Cells(i,1).Value = Cells (1,5).Value
Cells(i,2).Value = Cells (3,5).Value
Cells(i,3).Value = Cells (lr,1).Value
[/vba]
Вообщем, прошу помочь.
Пример прилагаю. В лист1 пример расположения нужных данных, как он в книгах, откуда брать. В лист 2 пример(пример отдельной книги для сбора данных), куда вставлять.
Подскажите, пожалуйста....

Не понимаю, как
1) Запрашивать данные из всех книг
2) Бежать циклом по книгам

Есть, конечно, пример с power query, но он "длинный...." по исполнению. Хотел бы научиться через VBA.

Автор - ant6729
Дата добавления - 08.06.2017 в 23:06
_Boroda_ Дата: Пятница, 09.06.2017, 00:17 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Примерно это нужно?
[vba]
Код
Sub tt()
    Dim wb_ As Workbook
    Application.ScreenUpdating = False
    fp_ = "D:\Стереть\1\"
    fn_ = Dir(fp_ & "*.xls*", vbNormal)
    On Error Resume Next
    Do While fn_ <> ""
        Set wb_ = GetObject(fp_ & fn_)
        With wb_.Sheets("Лист1")
            lr_ = .Cells(.Rows.Count, 1).End(xlUp).Row
            If Not IsEmpty(lr_) Then'если нет Лист1
                n_ = n_ + 1
                Cells(n_, 1).Value = .Cells(1, 5).Value
                Cells(n_, 2).Value = .Cells(3, 5).Value
                Cells(n_, 3).Value = .Cells(lr_, 1).Value
            End If
        End With
        wb_.Close False
        lr_ = Empty
        fn_ = Dir()
    Loop
End Sub
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПримерно это нужно?
[vba]
Код
Sub tt()
    Dim wb_ As Workbook
    Application.ScreenUpdating = False
    fp_ = "D:\Стереть\1\"
    fn_ = Dir(fp_ & "*.xls*", vbNormal)
    On Error Resume Next
    Do While fn_ <> ""
        Set wb_ = GetObject(fp_ & fn_)
        With wb_.Sheets("Лист1")
            lr_ = .Cells(.Rows.Count, 1).End(xlUp).Row
            If Not IsEmpty(lr_) Then'если нет Лист1
                n_ = n_ + 1
                Cells(n_, 1).Value = .Cells(1, 5).Value
                Cells(n_, 2).Value = .Cells(3, 5).Value
                Cells(n_, 3).Value = .Cells(lr_, 1).Value
            End If
        End With
        wb_.Close False
        lr_ = Empty
        fn_ = Dir()
    Loop
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 09.06.2017 в 00:17
AndreTM Дата: Пятница, 09.06.2017, 00:26 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Примерно то же самое получилось (правда без контроля на ошибки):
К сообщению приложен файл: 10-34075-1.xlsb (17.4 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеПримерно то же самое получилось (правда без контроля на ошибки):

Автор - AndreTM
Дата добавления - 09.06.2017 в 00:26
ant6729 Дата: Пятница, 09.06.2017, 00:37 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Это было круто...!!!
То, что надо...

Закрыли именно те пробелы именно там, где было надо

Спасибо, _Boroda_!

Всем спасибо!


Сообщение отредактировал ant6729 - Пятница, 09.06.2017, 00:39
 
Ответить
СообщениеЭто было круто...!!!
То, что надо...

Закрыли именно те пробелы именно там, где было надо

Спасибо, _Boroda_!

Всем спасибо!

Автор - ant6729
Дата добавления - 09.06.2017 в 00:37
ant6729 Дата: Суббота, 10.06.2017, 12:54 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Всем привет!

Как логическое продолжение этой темы , если нет, создам новую тему
(Получить данные к имеющимся в первом цикле)
Есть, по сути, код выще....:

[vba]
Код
Sub ttu()
    Dim wb_ As Workbook
    Application.ScreenUpdating = False
    fp_ = "F:\1\"
    fn_ = Dir(fp_ & "*.xls*", vbNormal)
    On Error Resume Next
    Do While fn_ <> ""
        Set wb_ = GetObject(fp_ & fn_)
        With wb_.Sheets("Лист1")
            lr_ = .Cells(.Rows.Count, 1).End(xlUp).Row
            If Not IsEmpty(lr_) Then
                u = .Cells(1, 5).Value
                s = .Cells(3, 5).Value
                b = .Cells(lr_, 1).Value
Lc = Sheets("Лист1").Cells(10, Sheets("Лист1").Columns.Count).End(xlToLeft).Column
' на листе активной книги ищу следующий день, нахожу номер колонки:
For i = 8 To Lc
If Cells(4, i).Value = Date + 1 Then a = Cells(4, i).Column
Next i

lr = Cells(Rows.Count, 9).End(xlUp).Row
' иду вниз, заполняю колонку:
For i = 11 To lr
If Cells(i, 3).Value = s Then Cells(i, a).Value = UCase(u) & " " & b
Next i
        End If
        End With
        wb_.Close False
        lr_ = Empty
        fn_ = Dir()
    Loop
End Sub
[/vba]

Суть вопроса в том, как сделать так, чтобы если у меня два и более документов, которые парсятся из папки и в них одинаковые s, то чтобы вот этот кусок [vba]
Код
If Cells(i, 3).Value = s Then Cells(i, a).Value = UCase(u) & " " & b
[/vba] не шлепал мне сверху вместо уже написанного первого значения последнее в цикле, а добавлял к уже имеющемуся типа [vba]
Код
Cells(i, a).Value & " " &  UCase(u) & " " & b
[/vba]

Наиболее близко решил только так, но это ни то... потому что пусть и бахает в дополнение, но несколько раз. А надо, чтобы один.Привязывался к наличию/отсутствию значений в ячейке. Но понял, что нужно циклить, но как, не понимаю.
[vba]
Код
'Select Case Cells(i, a).Value
' если пустая ячейка, то
'Case Is = ""
'Select Case Cells(i, 3).Value
'Case Is = s
'Cells(i, a).Value = UCase(u) & " " & b &
'End Select
'End Select
' если не пустая, то добавляет, но добавляет нужное несколько раз
'Select Case Cells(i, a).Value
'Case Is > 0
'Select Case Cells(i, 3).Value
'Case Is = s
'Cells(i, a).Value = Cells(i, a).Value & UCase(u) & " " & b
'End Select
'End Select
[/vba]

Вообщем... под утро понял, что масштаб этого вопрос выходит за рамки моего опыта

Помогите, пожалуйста, с этим. Расширьте опыт )

Надеюсь, никого не запутал.
Файл, для визуализации приложил.
К сообщению приложен файл: 2543913.xlsx (11.1 Kb)


Сообщение отредактировал ant6729 - Суббота, 10.06.2017, 14:35
 
Ответить
СообщениеВсем привет!

Как логическое продолжение этой темы , если нет, создам новую тему
(Получить данные к имеющимся в первом цикле)
Есть, по сути, код выще....:

[vba]
Код
Sub ttu()
    Dim wb_ As Workbook
    Application.ScreenUpdating = False
    fp_ = "F:\1\"
    fn_ = Dir(fp_ & "*.xls*", vbNormal)
    On Error Resume Next
    Do While fn_ <> ""
        Set wb_ = GetObject(fp_ & fn_)
        With wb_.Sheets("Лист1")
            lr_ = .Cells(.Rows.Count, 1).End(xlUp).Row
            If Not IsEmpty(lr_) Then
                u = .Cells(1, 5).Value
                s = .Cells(3, 5).Value
                b = .Cells(lr_, 1).Value
Lc = Sheets("Лист1").Cells(10, Sheets("Лист1").Columns.Count).End(xlToLeft).Column
' на листе активной книги ищу следующий день, нахожу номер колонки:
For i = 8 To Lc
If Cells(4, i).Value = Date + 1 Then a = Cells(4, i).Column
Next i

lr = Cells(Rows.Count, 9).End(xlUp).Row
' иду вниз, заполняю колонку:
For i = 11 To lr
If Cells(i, 3).Value = s Then Cells(i, a).Value = UCase(u) & " " & b
Next i
        End If
        End With
        wb_.Close False
        lr_ = Empty
        fn_ = Dir()
    Loop
End Sub
[/vba]

Суть вопроса в том, как сделать так, чтобы если у меня два и более документов, которые парсятся из папки и в них одинаковые s, то чтобы вот этот кусок [vba]
Код
If Cells(i, 3).Value = s Then Cells(i, a).Value = UCase(u) & " " & b
[/vba] не шлепал мне сверху вместо уже написанного первого значения последнее в цикле, а добавлял к уже имеющемуся типа [vba]
Код
Cells(i, a).Value & " " &  UCase(u) & " " & b
[/vba]

Наиболее близко решил только так, но это ни то... потому что пусть и бахает в дополнение, но несколько раз. А надо, чтобы один.Привязывался к наличию/отсутствию значений в ячейке. Но понял, что нужно циклить, но как, не понимаю.
[vba]
Код
'Select Case Cells(i, a).Value
' если пустая ячейка, то
'Case Is = ""
'Select Case Cells(i, 3).Value
'Case Is = s
'Cells(i, a).Value = UCase(u) & " " & b &
'End Select
'End Select
' если не пустая, то добавляет, но добавляет нужное несколько раз
'Select Case Cells(i, a).Value
'Case Is > 0
'Select Case Cells(i, 3).Value
'Case Is = s
'Cells(i, a).Value = Cells(i, a).Value & UCase(u) & " " & b
'End Select
'End Select
[/vba]

Вообщем... под утро понял, что масштаб этого вопрос выходит за рамки моего опыта

Помогите, пожалуйста, с этим. Расширьте опыт )

Надеюсь, никого не запутал.
Файл, для визуализации приложил.

Автор - ant6729
Дата добавления - 10.06.2017 в 12:54
RAN Дата: Суббота, 10.06.2017, 15:28 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
If Cells(i, 3).Value = s Then Cells(i, a).Value = Trim(Cells(i, a).Value & " " &  UCase(u) & " " & b)
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
If Cells(i, 3).Value = s Then Cells(i, a).Value = Trim(Cells(i, a).Value & " " &  UCase(u) & " " & b)
[/vba]

Автор - RAN
Дата добавления - 10.06.2017 в 15:28
ant6729 Дата: Суббота, 10.06.2017, 15:56 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
....это был TRIM.... killed ...

Спасибо, RAN... !!
...как всегда...
мда... про TRIM///одно дело прочитать, другое дело в голове держать.
 
Ответить
Сообщение....это был TRIM.... killed ...

Спасибо, RAN... !!
...как всегда...
мда... про TRIM///одно дело прочитать, другое дело в голове держать.

Автор - ant6729
Дата добавления - 10.06.2017 в 15:56
ant6729 Дата: Суббота, 10.06.2017, 16:16 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
И еще вопрос в продолжение освоения "логики парсинга"

Если будет нужно, создам вопрос в новой теме (Парсинг массива из документов)

Просто все логически из одного кода...

Пробую на массиве код выше...
[vba]
Код


Sub ttu()
    Dim wb_ As Workbook
    Application.ScreenUpdating = False
    fp_ = "F:\1\"
    fn_ = Dir(fp_ & "*.xls*", vbNormal)
    On Error Resume Next
    Do While fn_ <> ""
        Set wb_ = GetObject(fp_ & fn_)
        
    
        
    With wb_.Sheets("Лист1")

'    Sheets("Лист2").Select
'    Range("A8:J8").Select
'    Range(Selection, Selection.End(xlDown)).Select
'    Selection.Copy

'    Sheets("Лист1").Select
'    i = Sheets("Лист1").Cells(Rows.Count, "A").End(xlUp).Row + 1
'    Sheets("Лист1").Cells(i, 1).Select
'    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
'    SkipBlanks:=False, Transpose:=False
'    ActiveSheet.Paste
    

        End With
        wb_.Close False
        lr_ = Empty
        fn_ = Dir()
    Loop
End Sub
[/vba]

Закомментированный кусок работает: тянет информацию с листа2 на лист1. В нем специально оставил нумерацию листов. Как есть. Чтобы объяснить, что я имею ввиду и хочу сделать.

То есть как логику применить, чтобы именно из запрашиваемых файлов копировалось в activebook? К сожалению, не уловил...

Двигал первые 4 строчки до [vba]
Код
With wb_.Sheets("Лист1")
[/vba] менял лист 2 на лист1....
Как это сделать, прошу помочь...
Приложил файл... Для примера...пусть в лист2 как бы книга в папке, в лист1 - открытая книга для записи.
К сообщению приложен файл: 22.xlsm (14.7 Kb)


Сообщение отредактировал ant6729 - Суббота, 10.06.2017, 16:28
 
Ответить
СообщениеИ еще вопрос в продолжение освоения "логики парсинга"

Если будет нужно, создам вопрос в новой теме (Парсинг массива из документов)

Просто все логически из одного кода...

Пробую на массиве код выше...
[vba]
Код


Sub ttu()
    Dim wb_ As Workbook
    Application.ScreenUpdating = False
    fp_ = "F:\1\"
    fn_ = Dir(fp_ & "*.xls*", vbNormal)
    On Error Resume Next
    Do While fn_ <> ""
        Set wb_ = GetObject(fp_ & fn_)
        
    
        
    With wb_.Sheets("Лист1")

'    Sheets("Лист2").Select
'    Range("A8:J8").Select
'    Range(Selection, Selection.End(xlDown)).Select
'    Selection.Copy

'    Sheets("Лист1").Select
'    i = Sheets("Лист1").Cells(Rows.Count, "A").End(xlUp).Row + 1
'    Sheets("Лист1").Cells(i, 1).Select
'    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
'    SkipBlanks:=False, Transpose:=False
'    ActiveSheet.Paste
    

        End With
        wb_.Close False
        lr_ = Empty
        fn_ = Dir()
    Loop
End Sub
[/vba]

Закомментированный кусок работает: тянет информацию с листа2 на лист1. В нем специально оставил нумерацию листов. Как есть. Чтобы объяснить, что я имею ввиду и хочу сделать.

То есть как логику применить, чтобы именно из запрашиваемых файлов копировалось в activebook? К сожалению, не уловил...

Двигал первые 4 строчки до [vba]
Код
With wb_.Sheets("Лист1")
[/vba] менял лист 2 на лист1....
Как это сделать, прошу помочь...
Приложил файл... Для примера...пусть в лист2 как бы книга в папке, в лист1 - открытая книга для записи.

Автор - ant6729
Дата добавления - 10.06.2017 в 16:16
AndreTM Дата: Суббота, 10.06.2017, 17:58 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
1) Не используйте select/selection, а также копирование через буфер, без необходимости.
Аналогом для .select будет назначить нужный диапазон объектной переменной через Set, аналогом для selection. будет использовать назначенную переменную.
Если копируете диапазоны - то метод .Copy имеет параметр Destination, который можно сразу же указать при вызове команды, прогонять данные через буфер нет необходимости.

2) Если вы обращаетесь к методам и свойствам (Cells,Range,Sheets,..) - то должны понимать, к какому объекту они при этом принадлежат
[vba]
Код
Cells(1,3) ' ячейка "C1" активной книги
Sheets("Лист1") ' лист с именем "Лист1" в активной книге
With wb_.Sheets("Лист1")
    Sheets("Лист2") ' лист с именем "Лист2" активной книги
    .Sheets("Лист2") ' вызовет ошибку, потому что у объекта wb_.Sheets("Лист1") нет свойства Sheets
    Cells(1,3) ' ячейка "C1" активного листа активной книги
    .Cells(1,3) ' ячейка "C1" листа wb_.Sheets("Лист1")
End With
[/vba]
С Range и .Range надо обращаться ещё более аккуратно - ссылки на объекты в параметрах метода должны принадлежать тому же объекту, что и сам Range

3) Ваш "закомментированный кусок" мог бы выглядеть так:
[vba]
Код
        lr1 = Cells(Rows.Count, "A").End(xlUp).Row + 1 ' здесь Cells и Rows относятся к активному листу
        lr2 = .Range("a8:j8").End(xlDown).Row ' здесь .Range относится к with (листу-источнику)
        If lr2 >= 8 Then
            .Range("a8:j8").Resize(lr2 - 7).Copy Cells(lr1, 1) ' здесь .Range относится к листу-источнику, а Cells - к активному листу
        End If
[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Суббота, 10.06.2017, 22:11
 
Ответить
Сообщение1) Не используйте select/selection, а также копирование через буфер, без необходимости.
Аналогом для .select будет назначить нужный диапазон объектной переменной через Set, аналогом для selection. будет использовать назначенную переменную.
Если копируете диапазоны - то метод .Copy имеет параметр Destination, который можно сразу же указать при вызове команды, прогонять данные через буфер нет необходимости.

2) Если вы обращаетесь к методам и свойствам (Cells,Range,Sheets,..) - то должны понимать, к какому объекту они при этом принадлежат
[vba]
Код
Cells(1,3) ' ячейка "C1" активной книги
Sheets("Лист1") ' лист с именем "Лист1" в активной книге
With wb_.Sheets("Лист1")
    Sheets("Лист2") ' лист с именем "Лист2" активной книги
    .Sheets("Лист2") ' вызовет ошибку, потому что у объекта wb_.Sheets("Лист1") нет свойства Sheets
    Cells(1,3) ' ячейка "C1" активного листа активной книги
    .Cells(1,3) ' ячейка "C1" листа wb_.Sheets("Лист1")
End With
[/vba]
С Range и .Range надо обращаться ещё более аккуратно - ссылки на объекты в параметрах метода должны принадлежать тому же объекту, что и сам Range

3) Ваш "закомментированный кусок" мог бы выглядеть так:
[vba]
Код
        lr1 = Cells(Rows.Count, "A").End(xlUp).Row + 1 ' здесь Cells и Rows относятся к активному листу
        lr2 = .Range("a8:j8").End(xlDown).Row ' здесь .Range относится к with (листу-источнику)
        If lr2 >= 8 Then
            .Range("a8:j8").Resize(lr2 - 7).Copy Cells(lr1, 1) ' здесь .Range относится к листу-источнику, а Cells - к активному листу
        End If
[/vba]

Автор - AndreTM
Дата добавления - 10.06.2017 в 17:58
ant6729 Дата: Суббота, 10.06.2017, 19:22 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
.


Сообщение отредактировал ant6729 - Суббота, 10.06.2017, 19:39
 
Ответить
Сообщение.

Автор - ant6729
Дата добавления - 10.06.2017 в 19:22
AndreTM Дата: Суббота, 10.06.2017, 19:43 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Я уже показал в п.3) что нужно делать :) Зачем тебе отдельные процедуры?
Внимательно посмотри на него, особенно на использование/неиспользование . перед именами методов и свойств.

Про select/selection - это отдельный разговор. В текущем контексте решаемой задачи - их использование вообще не нужно, вот и всё.


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Суббота, 10.06.2017, 19:45
 
Ответить
СообщениеЯ уже показал в п.3) что нужно делать :) Зачем тебе отдельные процедуры?
Внимательно посмотри на него, особенно на использование/неиспользование . перед именами методов и свойств.

Про select/selection - это отдельный разговор. В текущем контексте решаемой задачи - их использование вообще не нужно, вот и всё.

Автор - AndreTM
Дата добавления - 10.06.2017 в 19:43
ant6729 Дата: Суббота, 10.06.2017, 20:18 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
Объясните, пожалуйста, что делает этот пункт [vba]
Код
.Resize(lr2 - 7).
[/vba]
Попробовал с ним и без него... Разные результаты...Но не смог понять на отличиях, что он дает...
 
Ответить
СообщениеОбъясните, пожалуйста, что делает этот пункт [vba]
Код
.Resize(lr2 - 7).
[/vba]
Попробовал с ним и без него... Разные результаты...Но не смог понять на отличиях, что он дает...

Автор - ant6729
Дата добавления - 10.06.2017 в 20:18
ant6729 Дата: Суббота, 10.06.2017, 20:21 | Сообщение № 13
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
. перед именами методов и свойств.


Я ее цеплял у Вокенбаха про with, но на какой объект . выруливает здесь... я пока возьму время на понимание.

Спасибо, Вам за помощь!!


Сообщение отредактировал ant6729 - Суббота, 10.06.2017, 20:22
 
Ответить
Сообщение
. перед именами методов и свойств.


Я ее цеплял у Вокенбаха про with, но на какой объект . выруливает здесь... я пока возьму время на понимание.

Спасибо, Вам за помощь!!

Автор - ant6729
Дата добавления - 10.06.2017 в 20:21
AndreTM Дата: Суббота, 10.06.2017, 20:44 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Объясните, пожалуйста, что делает этот пункт

lr2 мы искали, начиная с 8-й строки листа (a8:j8) в листе-источнике (.Range()), и он у нас содержит номер последней строки с данными в листе-источнике. При этом мы проверили, чтобы lr2 был точно не меньше 8.
lr2-7 даёт нам количество строк данных в листе источнике (начиная с a8:j8)
.Range("a8:j8").Resize(lr2 - 7) возьмёт указанный диапазон (состоящий из одной строки и 10 столбцов, начинается в "a8") и изменит его размеры на указанные (lr2-7 строк, т.е. столько строк, сколько имеется данных, и столько же столбцов, что и было). То есть мы получим весь диапазон, ссылающийся на данные в листе-источнике.
Например, если данные занимали диапазон a8:j10, то lr2 = 10, lr2 - 7 = 3, копируемый диапазон = .Range("a8:j8").Resize(3) = "a8:j10"

А далее просто скопируем этот диапазон в лист-получатель, начиная с указанной нами ячейки на листе-получателе...

Что касается понимания использования "." - то совет единственный: надо просто отвыкнуть использовать имена методов и свойств без точного указания на объект, которому они принадлежат. Для "начинающих в VBA" это обычно Cells, Sheets, Range, которые копипастятся из примеров, и вставляются в существующие "текущие", "активные" объекты, имеющие эти свойства - но в полной уверенности, что обращение пойдет к каким-то другим объектам/диапазонам :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Суббота, 10.06.2017, 20:59
 
Ответить
Сообщение
Объясните, пожалуйста, что делает этот пункт

lr2 мы искали, начиная с 8-й строки листа (a8:j8) в листе-источнике (.Range()), и он у нас содержит номер последней строки с данными в листе-источнике. При этом мы проверили, чтобы lr2 был точно не меньше 8.
lr2-7 даёт нам количество строк данных в листе источнике (начиная с a8:j8)
.Range("a8:j8").Resize(lr2 - 7) возьмёт указанный диапазон (состоящий из одной строки и 10 столбцов, начинается в "a8") и изменит его размеры на указанные (lr2-7 строк, т.е. столько строк, сколько имеется данных, и столько же столбцов, что и было). То есть мы получим весь диапазон, ссылающийся на данные в листе-источнике.
Например, если данные занимали диапазон a8:j10, то lr2 = 10, lr2 - 7 = 3, копируемый диапазон = .Range("a8:j8").Resize(3) = "a8:j10"

А далее просто скопируем этот диапазон в лист-получатель, начиная с указанной нами ячейки на листе-получателе...

Что касается понимания использования "." - то совет единственный: надо просто отвыкнуть использовать имена методов и свойств без точного указания на объект, которому они принадлежат. Для "начинающих в VBA" это обычно Cells, Sheets, Range, которые копипастятся из примеров, и вставляются в существующие "текущие", "активные" объекты, имеющие эти свойства - но в полной уверенности, что обращение пойдет к каким-то другим объектам/диапазонам :)

Автор - AndreTM
Дата добавления - 10.06.2017 в 20:44
ant6729 Дата: Суббота, 10.06.2017, 21:41 | Сообщение № 15
Группа: Проверенные
Ранг: Ветеран
Сообщений: 533
Репутация: 2 ±
Замечаний: 40% ±

Excel 2010
о отвыкнуть использоват


Я сам пока и не использую ".". Я заимствовал этот код у _Boroda_, который мне помог.

.Resize(lr2 - 7). понял, что количество строк минусует от крыши

проблема на самом деле была не в ".", какой найти заменитель закомментированному коду и как обойтись без обозначения названия листов.

[vba]
Код
lr1 = Cells(Rows.Count, "A").End(xlUp).Row + 1
        lr2 = .Range("A8:J8").End(xlDown).Row
[/vba]

До этой записи я бы не дошел, а с объектами я понимал, что и откуда. Спасибо еще раз)!


Сообщение отредактировал ant6729 - Суббота, 10.06.2017, 22:00
 
Ответить
Сообщение
о отвыкнуть использоват


Я сам пока и не использую ".". Я заимствовал этот код у _Boroda_, который мне помог.

.Resize(lr2 - 7). понял, что количество строк минусует от крыши

проблема на самом деле была не в ".", какой найти заменитель закомментированному коду и как обойтись без обозначения названия листов.

[vba]
Код
lr1 = Cells(Rows.Count, "A").End(xlUp).Row + 1
        lr2 = .Range("A8:J8").End(xlDown).Row
[/vba]

До этой записи я бы не дошел, а с объектами я понимал, что и откуда. Спасибо еще раз)!

Автор - ant6729
Дата добавления - 10.06.2017 в 21:41
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Код парсер данных ячеек из множества книг в одну книгу. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!