Страницы: 1
RSS
Код выдает ошибку overflow
 
Всем доброго дня!  
 
Помогите, пожалуйста, с кодом, мне не понятно почему происходит ошибка… ((  
 
Задача макроса: в цикле открывать файлы (их может быть до 200 шт) – выбирать диапазон заполненных ячеек, копировать и вставлять значения ячеек в файл «сводный» на один лист друг под другом.  
 
Те готовые решения, что  я нашла на сайте к моей задаче  к сожалению не подходят, потому что во-первых  мои исходники защищены паролем, во вторых 2007 excel (для 2003 версии есть работающий макрос).  
 
При работе макрос выдает ошибку: overflow  
 
Примеры во вложении (сводный файл, и файлик, откуда копируются данные)  
 
Очень-очень вас прошу мне помочь!!!
Alen
 
Для подсчёта строк Integer не годится, замените на Long.  
Обычно Oferflow бывает по этой причине.  
 
Dim Srow As Integer 'кол-во строк в исходном  
Dim i As Integer ' переменная для счетчика
 
Спасибо большое!!! только теперь выдает другую ошибку (((    
 
Application-defined or object-defined error  
 
в чем может тут может быть дело? ругается на строчку:  
 
rgI.Range(rgI.Cells(i, 17)).Copy
Alen
 
возможно у вас не описана переменная rgI с помощью Dim.
Редко но метко ...
 
описана... может я тут код покажу, чтобы нагляднее было?    
 
 
Sub TMsvodka(strFileName As String)  
 
Dim wbkI As Workbook 'исходники  
Dim shtI As Worksheet    
Dim rgI As Range    
Dim strFile As String    
Dim Srow As Long    
Dim i As Long    
Dim Scol As Long    
 
Dim wbkSv As Workbook  'сводный  
Dim shtSv As Worksheet    
Dim rgSv As Range    
Dim SvRow As Long    
Dim SvCol As Long    
 
Set wbkSv = ThisWorkbook    
Set shtSv = wbkSv.Worksheets("Сводка")    
Set rgSv = shtSv.Range("A8").CurrentRegion    
   
   
Set wbkI = Application.Workbooks.Open(strPath & "\" & strFileName)      
Set shtI = wbkI.Sheets("data")    
Set rgI = shtI.UsedRange    
 
Srow = rgI.Rows.Count    
Scol = 17    
 
SvRow = rgSv.Rows.Count    
SvCol = 17    
 
For i = 1 To Srow    
   rgI.Range(rgI.Cells(i, 17)).Copy  
   rgSv.Cells(SvRow + 1, 17).PasteSpecial xlPasteValuesAndNumberFormats  
   Application.CutCopyMode = False  
Next i  
 
wbkI.Close False      
shtSv.Range("A8").Select  
 
End Sub
Alen
 
Кто Вам такой бред написал? Сильно не вникал, но попробуйте так:  
Sub TMsvodka(strFileName As String)  
 
Dim wbkI As Workbook 'исходная книга  
Dim shtI As Worksheet 'исходный лист в исходной книге  
Dim rgI As Range 'диапазон в исходном для копирования  
Dim strFile As String 'это открываемый файл  
Dim Srow As Long 'кол-во строк в исходном  
Dim i As Long ' переменная для счетчика  
Dim Scol As Long 'кол-во столбцов в исходном  
 
Dim wbkSv As Workbook ' сводный  
Dim shtSv As Worksheet 'сводный лист  
Dim rgSv As Range 'диапазон для вставки данных в сводном файле  
Dim SvRow As Long 'число строк в сводном для определения последней заполненной  
Dim SvCol As Long 'число столбцов в сводном  
 
Set wbkSv = ThisWorkbook 'сводный файл  
Set shtSv = wbkSv.Worksheets("Сводка") 'сводный лист  
Set rgSv = shtSv.Range("A8").CurrentRegion ' диапазон ячеек для вставки  
   
   
Set wbkI = Application.Workbooks.Open(strPath & "\" & strFileName)    'открыть исходный файл  
Set shtI = wbkI.Sheets("data") 'определить исходный лист  
Set rgI = shtI.UsedRange ' диапазон в исходном  
 
Srow = rgI.Rows.Count ' кол-во строк в исходном  
Scol = 17 'колво столбцов в исходном - всегда 17  
 
SvRow = rgSv.Rows.Count ' кол-во строк в исходном  
SvCol = 17 'колво столбцов в сводном - всегда 17  
 
For i = 1 To Srow 'цикл для копирования и вставки строк  
   rgI.Range(rgI.Cells(i, 1), rgI.Cells(i, 17)).Copy  
   rgSv.Cells(SvRow + i, 1).PasteSpecial xlPasteValuesAndNumberFormats  
Next i  
Application.CutCopyMode = False  
 
wbkI.Close False    'закрыть книгу без сохранения  
shtSv.Range("A8").Select  
 
End Sub
Я сам - дурнее всякого примера! ...
 
Еще одно. Насчет 200 файлов Вы сильно погорячились. У Вас в приложенном файле 60000 строк копируется(хотя почти все они пустые). А всего на листе в 2003 65536 строк.
Я сам - дурнее всякого примера! ...
 
:) Этот бред написала я... просто я еще только учусь :)  
 
Спасибо огромнейшее, теперь работает!!!!    
 
НО...  
 
Пожалуйста, скажите, как сделать, чтобы не копировал 60 000 строк, а только те, что заполнены?
Alen
 
Будет копировать меньше, если удалить в примере все строки после данных, включая ту с единицей в X60000. И сохранить файл!  
Но вообще я UsedRange избегаю использовать из-за таких сюрпризов, лучше ориентироваться на точно до конца заполненный столбец, что обычно бывает.  
Я так чуть упростил, попробуйте:  
 
Sub TMsvodka(strFileName As String)  
 
   Dim Srow As Long    'кол-во строк в исходном  
   Dim rgSv As Range    'диапазон для вставки данных в сводном файле  
   Dim SvRow As Long    'число строк в сводном для определения последней заполненной  
 
   Set rgSv = ThisWorkbook.Worksheets("Сводка").Range("A8").CurrentRegion  
   SvRow = rgSv.Rows.Count    ' кол-во строк в исходном  
 
   With Application.Workbooks.Open(strPath & "\" & strFileName)  
       With .Sheets("data").UsedRange     'открыть исходный файл  
           Srow = .Rows.Count    ' кол-во строк в исходном  
           .Range(.Cells(1, 1), .Cells(Srow, 17)).Copy  
           rgSv.Cells(SvRow + 1, 1).PasteSpecial xlPasteValuesAndNumberFormats  
           Application.CutCopyMode = False  
       End With  
       .Close False    'закрыть книгу без сохранения  
   End With  
   ThisWorkbook.Worksheets("Сводка").Range("A8").Select  
 
End Sub
 
Ура! Вы супер! Работает! =)  
 
Но только с одним файлом. Если файла два - он вставляет поверх прежних данных (((  
 
и еще вопрос: можно ли сделать так, чтобы он начинал копировать не с первой строки а с 6-ой?  
где это нужно исправить?
Alen
 
Вставляет поверх вероятно потому, что    
ThisWorkbook.Worksheets("Сводка").Range("A8").CurrentRegion  
не включает в себя докопированные строки, т.к. там вероятно есть пустые строки.  
Нужно вместо CurrentRegion определять диапазон иначе, как и вместо UsedRange.  
Чтоб копировал не с перовой - замените тут первую единицу на что нужно:  
.Range(.Cells(1, 1), .Cells(Srow, 17)).Copy
 
Всё, теперь вроде работает!!!    
 
Спасибо вам огромнейшее Hugo и KukLP за помощь!!!!!!! =)
Alen
 
Как это? В секунду прочитали, исправили, проверили, ответили? :)
 
:)) я просто сама поняла как исправить  
 
УФ! Я счастлива!! Мучилась целую неделю!!!!    
 
Еще раз спасибо!!! =)
Alen
Страницы: 1
Читают тему
Наверх