Здравствуйте, уважаемые эксперты! Прошу указать на мои ошибки и помочь с решением: в C:\БДДС 9 мес\ находятся типовые отчеты с 15 листами. Листы защищены и их форма спускается головной организацией. (впринципе, буду что-нибудь придумывать для шапки, и перекрестных ссылок у двух листов). Из данной папки запускаю файл свод БДДС 2013 с кодом, который суммирует значения ячеек с каждого файла в папке отдельно по каждому листу - тем самым получаю сводный отчет. (можно даже перебором с последнего к первому) С помощью примеров Вашего и похожих форумов был написан код Sub Векселя (). И в целом, на 14 листах книги из 15 работает. А вот со вторым листом встает на строке:"If arr(i, j) = "" Then" с ошибкой 13 arr(i,j)=. Из прочитанного, улавливается, что либо что-то с данными в листе? Однако, и диапазон менял до одной ячейки и стирал незащищенные значения - ошибка именно на этом листе стоит мертво. Не очень понял установленный порядок выкладки кода (в первый раз пишу на форуме). Поэтому проблемный кусок, если что не так, извините: [vba]
Code
Dim z As Variant, f As String, i&, j& z = Range(Cells(1, 1), Cells(lLastRow, lLastCol)) f = Dir(ThisWorkbook.Path & "\" & "*.xls*", vbNormal) Do While f <> "" If f <> ThisWorkbook.Name Then [a1].Formula = "=Toarr('" & pth & f & " ]" & Sheets(l).Name & "'! R1C1:R" & lLastRow & "C" & lLastCol & ")" For i = 1 To UBound(z, 1) For j = 1 To UBound(z, 2) If arr(i, j) = "" Then
[/vba]
Здравствуйте, уважаемые эксперты! Прошу указать на мои ошибки и помочь с решением: в C:\БДДС 9 мес\ находятся типовые отчеты с 15 листами. Листы защищены и их форма спускается головной организацией. (впринципе, буду что-нибудь придумывать для шапки, и перекрестных ссылок у двух листов). Из данной папки запускаю файл свод БДДС 2013 с кодом, который суммирует значения ячеек с каждого файла в папке отдельно по каждому листу - тем самым получаю сводный отчет. (можно даже перебором с последнего к первому) С помощью примеров Вашего и похожих форумов был написан код Sub Векселя (). И в целом, на 14 листах книги из 15 работает. А вот со вторым листом встает на строке:"If arr(i, j) = "" Then" с ошибкой 13 arr(i,j)=. Из прочитанного, улавливается, что либо что-то с данными в листе? Однако, и диапазон менял до одной ячейки и стирал незащищенные значения - ошибка именно на этом листе стоит мертво. Не очень понял установленный порядок выкладки кода (в первый раз пишу на форуме). Поэтому проблемный кусок, если что не так, извините: [vba]
Code
Dim z As Variant, f As String, i&, j& z = Range(Cells(1, 1), Cells(lLastRow, lLastCol)) f = Dir(ThisWorkbook.Path & "\" & "*.xls*", vbNormal) Do While f <> "" If f <> ThisWorkbook.Name Then [a1].Formula = "=Toarr('" & pth & f & " ]" & Sheets(l).Name & "'! R1C1:R" & lLastRow & "C" & lLastCol & ")" For i = 1 To UBound(z, 1) For j = 1 To UBound(z, 2) If arr(i, j) = "" Then
Не понимаю пока прикрепились ли вложения. Надеюсь это не страшно, попробую прикрепить файлы еще раз: и код:
[vba]
Code
Option Explicit Dim arr
Sub Векселя() Application.ScreenUpdating = False 'Dim K As Long, s As String 'For K = ThisWorkbook.Worksheets.Count To 1 Step -1 'With ThisWorkbook.Worksheets(K) 'Worksheets(K).Activate Dim l As Integer, m, n As String 'l = 15 l = ActiveSheet.Index m = "АБДДС.xlsb" Dim e, d As Workbook Sheets(l).Select Set e = ThisWorkbook.ActiveSheet
Dim pthh, pth$: Application.ScreenUpdating = False pthh = ThisWorkbook.Path & "\" Set d = Workbooks.Open("" & pthh & m, UpdateLinks:=0) Sheets(l).Select Dim lLastRow As Long Dim lLastCol As Long lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1 n = d.Sheets(l).Name 'd.Close saveChanges:=False e.Activate Sheets(l).Select e.Name = n Cells.Select Selection.Delete Shift:=xlUp
pth = ThisWorkbook.Path & "\[": arr = Empty Dim z As Variant, f As String, i&, j& 'z(1 To 33, 1 To 10)кол-во первый диапазон рядов, второй колонок z = Range(Cells(1, 1), Cells(lLastRow, lLastCol)) f = Dir(ThisWorkbook.Path & "\" & "*.xls*", vbNormal) Do While f <> "" If f <> ThisWorkbook.Name Then [a1].Formula = "=Toarr('" & pth & f & " ]" & Sheets(l).Name & "'! R1C1:R" & lLastRow & "C" & lLastCol & ")" For i = 1 To UBound(z, 1) 'ряды For j = 1 To UBound(z, 2) 'колонки 'If IsError(arr(i, j)) Then If arr(i, j) = "" Then z(i, j) = z(i, j) Else If IsNumeric(arr(i, j)) Then z(i, j) = z(i, j) + arr(i, j) Else z(i, j) = arr(i, j) 'End If End If End If Next j Next i End If f = Dir() Loop e.Activate: Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value = z: [a1] = Empty
Dim eCell As Range Set eCell = Range(Cells(1, 1), Cells(lLastRow, lLastCol)) d.Activate 'Set d = Workbooks.Open("" & pthh & m, UpdateLinks:=0) 'Sheets(l).Select Dim dCell As Range Set dCell = Range(Cells(1, 1), Cells(lLastRow, lLastCol))
d.Worksheets(l).Activate With dCell 'Do While dCell < Range(Cells(1, 1), Cells(lLastRow + 1, lLastCol + 1)) For i = 1 To lLastRow 'ряды For j = 1 To lLastCol 'колонки 'For Each dCell In .Range(Cells(1, 1), Cells(lLastRow, lLastCol))
If dCell(i, j).Locked = False Then If dCell(i, j).Value >= "0" Then _ dCell(i, j).Value = "" If dCell(i, j).Value <= "0" Then _ dCell(i, j).Value = "" Else If dCell(i, j).Locked = True Then If dCell(i, j) = xlFormula Then eCell(i, j).Formula = dCell(i, j).Formula End If End If End If Next j Next i 'Loop End With
e.Activate: Range("W1").Clear d.Close saveChanges:=False Range("A1").Select Application.ScreenUpdating = True 'End With ' Next End Sub
Function ToArr(ExtData) arr = ExtData End Function
[/vba]
Для листингов кода есть специнструмент. А для длинных листингов - специнструмент для специнструмента. Модераторы.
Не понимаю пока прикрепились ли вложения. Надеюсь это не страшно, попробую прикрепить файлы еще раз: и код:
[vba]
Code
Option Explicit Dim arr
Sub Векселя() Application.ScreenUpdating = False 'Dim K As Long, s As String 'For K = ThisWorkbook.Worksheets.Count To 1 Step -1 'With ThisWorkbook.Worksheets(K) 'Worksheets(K).Activate Dim l As Integer, m, n As String 'l = 15 l = ActiveSheet.Index m = "АБДДС.xlsb" Dim e, d As Workbook Sheets(l).Select Set e = ThisWorkbook.ActiveSheet
Dim pthh, pth$: Application.ScreenUpdating = False pthh = ThisWorkbook.Path & "\" Set d = Workbooks.Open("" & pthh & m, UpdateLinks:=0) Sheets(l).Select Dim lLastRow As Long Dim lLastCol As Long lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1 n = d.Sheets(l).Name 'd.Close saveChanges:=False e.Activate Sheets(l).Select e.Name = n Cells.Select Selection.Delete Shift:=xlUp
pth = ThisWorkbook.Path & "\[": arr = Empty Dim z As Variant, f As String, i&, j& 'z(1 To 33, 1 To 10)кол-во первый диапазон рядов, второй колонок z = Range(Cells(1, 1), Cells(lLastRow, lLastCol)) f = Dir(ThisWorkbook.Path & "\" & "*.xls*", vbNormal) Do While f <> "" If f <> ThisWorkbook.Name Then [a1].Formula = "=Toarr('" & pth & f & " ]" & Sheets(l).Name & "'! R1C1:R" & lLastRow & "C" & lLastCol & ")" For i = 1 To UBound(z, 1) 'ряды For j = 1 To UBound(z, 2) 'колонки 'If IsError(arr(i, j)) Then If arr(i, j) = "" Then z(i, j) = z(i, j) Else If IsNumeric(arr(i, j)) Then z(i, j) = z(i, j) + arr(i, j) Else z(i, j) = arr(i, j) 'End If End If End If Next j Next i End If f = Dir() Loop e.Activate: Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value = z: [a1] = Empty
Dim eCell As Range Set eCell = Range(Cells(1, 1), Cells(lLastRow, lLastCol)) d.Activate 'Set d = Workbooks.Open("" & pthh & m, UpdateLinks:=0) 'Sheets(l).Select Dim dCell As Range Set dCell = Range(Cells(1, 1), Cells(lLastRow, lLastCol))
d.Worksheets(l).Activate With dCell 'Do While dCell < Range(Cells(1, 1), Cells(lLastRow + 1, lLastCol + 1)) For i = 1 To lLastRow 'ряды For j = 1 To lLastCol 'колонки 'For Each dCell In .Range(Cells(1, 1), Cells(lLastRow, lLastCol))
If dCell(i, j).Locked = False Then If dCell(i, j).Value >= "0" Then _ dCell(i, j).Value = "" If dCell(i, j).Value <= "0" Then _ dCell(i, j).Value = "" Else If dCell(i, j).Locked = True Then If dCell(i, j) = xlFormula Then eCell(i, j).Formula = dCell(i, j).Formula End If End If End If Next j Next i 'Loop End With
В любом случае спасибо. Сейчас специально запустил в том урезанном виде источника, что ранее здесь прикрепил. Повторяется то же самое: если запустить со второго листа ("Доходы"), та же 13 ошибка в том же месте. Если запустить с третьего или с первого (там единственное: файл источника надо подправить расширение с АБДДС.xlsb на .xls, а если запускать с первого листа, так как там обрезались ссылки, то надо еще добавить проверку на If IsError(arr(i, j)) Then и If IsError(dCell(i, j)) Then и отключить найти/заменить), то все работает. Сорри за первый лист и его "ссылки". А второй так и зависает на arr(i,j)=<type mismatch>. И лист малюсенький - 3-и циферки. С уважением,
В любом случае спасибо. Сейчас специально запустил в том урезанном виде источника, что ранее здесь прикрепил. Повторяется то же самое: если запустить со второго листа ("Доходы"), та же 13 ошибка в том же месте. Если запустить с третьего или с первого (там единственное: файл источника надо подправить расширение с АБДДС.xlsb на .xls, а если запускать с первого листа, так как там обрезались ссылки, то надо еще добавить проверку на If IsError(arr(i, j)) Then и If IsError(dCell(i, j)) Then и отключить найти/заменить), то все работает. Сорри за первый лист и его "ссылки". А второй так и зависает на arr(i,j)=<type mismatch>. И лист малюсенький - 3-и циферки. С уважением,Lenokk2000
Заработало. Поставьте всем ячейкам пустого листа "Доходы" общий формат - он там у Вас текстовый. О, Андрей уже ответил Но я ставил одной ячейке - не помогает. Там [vba]
Code
Cells.Select Selection.Delete Shift:=xlUp
[/vba] После этого формат опять текстовый
Заработало. Поставьте всем ячейкам пустого листа "Доходы" общий формат - он там у Вас текстовый. О, Андрей уже ответил Но я ставил одной ячейке - не помогает. Там [vba]