Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2012, 14:57   #1
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию Заполнение ячеек не с последней заполненной прежде

Добрый день, уважаемые форумчане!

Наверняка знаете вот этот классный макрос сбора данных из книг, листов в один лист:

Код:
 Sub Consolidated_Range_of_Books_and_Sheets2()
Dim iBeginRange As Object, lCalc As Long
Dim sRngAddress As String, oAwb As String, sCopyAddress As String, sSheetName As String
Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
Dim wsSh As Object, wsDataSheet As Object, bPolyBooks As Boolean, avFiles

On Error Resume Next
Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
"1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
If iBeginRange Is Nothing Then Exit Sub
sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
If sSheetName = "" Then sSheetName = "*"
On Error GoTo 0
If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "Excel-VBA") = vbYes Then
avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
If VarType(avFiles) = vbBoolean Then Exit Sub
bPolyBooks = True
Else
avFiles = Array(ThisWorkbook.FullName)
End If
With Application
lCalc = .Calculation
.ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
End With
'ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
Set wsDataSheet = ThisWorkbook.ActiveSheet
For li = LBound(avFiles) To UBound(avFiles)
If bPolyBooks Then Workbooks.Open Filename:=avFiles(li)
oAwb = Dir(avFiles(li), vbDirectory)
For Each wsSh In Workbooks(oAwb).Sheets
If wsSh.Name Like sSheetName Then
If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
With wsSh
Select Case iBeginRange.Count
Case 1
lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).row
iLastColumn = .Cells.SpecialCells(xlLastCell).Column
sCopyAddress = .Range(.Cells(iBeginRange.row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
Case Else
sCopyAddress = iBeginRange.Address
lLastrow = iBeginRange.Rows.Count
iLastColumn = iBeginRange.Columns.Count
End Select
lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).row + 1
sRngAddress = .Range(.Cells(lLastRowMyBook, 1), .Cells(lLastRowMyBook + lLastrow, iLastColumn)).Address
.Range(sCopyAddress).Copy wsDataSheet.Range(sRngAddress)
End With
End If
NEXT_:
Next wsSh
If bPolyBooks Then Workbooks(oAwb).Close False
Next li
With Application
lCalc = .Calculation
.ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
End With
End Sub
Автору огромное спасибо за него. The_Prist.
Но вот при его использовании возник вопрос. Если добавляются данные, потом очищается лист и еще добавляются данные, то во второй раз (и последующие) вставка происходит со строки, следующей за последней заполненной в предыдущий раз. Даже если предыдущие данные удалены. С первой строки загрузка данных происходит только после перезагрузки самого файла. Какая строка в коде запоминает этот адрес? Или очистку производить как-то по особому?
Заранее спасибо!

Последний раз редактировалось EducatedFool; 13.05.2012 в 16:38.
strannick вне форума Ответить с цитированием
Старый 13.05.2012, 21:08   #2
ShAM66
Форумчанин
 
Регистрация: 24.02.2012
Сообщений: 160
По умолчанию

Может, вместо:
Код:
lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).row
Использовать:
Код:
lLastrow  = .Cells(Rows.Count, 1).End(xlUp).Row
ShAM66 вне форума Ответить с цитированием
Старый 13.05.2012, 21:36   #3
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от ShAM66 Посмотреть сообщение
Может, вместо:
Код:
lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).row
Использовать:
Код:
lLastrow  = .Cells(Rows.Count, 1).End(xlUp).Row
Не, то же самое. А не вот эта строка?

sRngAddress = .Range(.Cells(lLastRowMyBook, 1), .Cells(lLastRowMyBook + lLastrow, iLastColumn)).Address
strannick вне форума Ответить с цитированием
Старый 13.05.2012, 22:17   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Здесь ещё исправьте определение последней строки:

Код:
lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).row + 1
"Какая строка в коде запоминает этот адрес?" - запоминает не код, запоминает Эксель.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 13.05.2012, 23:10   #5
ShAM66
Форумчанин
 
Регистрация: 24.02.2012
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Здесь ещё исправьте определение последней строки:

Код:
lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).row + 1
"Какая строка в коде запоминает этот адрес?" - запоминает не код, запоминает Эксель.
Спасибо, Hugo121, что-то я не доглядел.
Только у этого способа тоже есть минус. Определяется последняя заполненная строка в 1 столбце. Т.е. если могут быть данные в других столбцах ниже, чем в 1-м, то они затрутся при следующем заполнении.
ShAM66 вне форума Ответить с цитированием
Старый 13.05.2012, 23:20   #6
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Здесь ещё исправьте определение последней строки:

Код:
lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).row + 1
"Какая строка в коде запоминает этот адрес?" - запоминает не код, запоминает Эксель.
Конечно, я так и хотел сказать. А за подсказку спасибо ребята, все работает.
strannick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск последней заполненной стрки dedwar Microsoft Office Excel 1 27.04.2011 02:45
поиск последней заполненной ячейки, которая находится выше ячейки с формулой Akmal-Sharipov Microsoft Office Excel 3 11.01.2011 13:27
перенести значение последней заполненной строки Jazz1200 Microsoft Office Excel 4 12.12.2010 17:11
Формула значения последней (нижней) заполненной ячейки в столбце VictorM Microsoft Office Excel 16 09.09.2010 20:47
определение последней заполненной ячейки Bezdar Microsoft Office Excel 4 20.03.2009 09:55