А к чему? Cells все равно должен быть к листу привязан 2. Я неоднократно замечал, что конструкция (я тоже раньше так писал) [vba]
Код
r_ = .Cells(Rows.Count, 1).End(3).Row
[/vba]на некоторых машинах дает ошибку, пока точку перед Rows не поставишь. Причем дома в 2010 все нормально работает, приходишь на работу в 2013 - бац, ошибка.
А к чему? Cells все равно должен быть к листу привязан 2. Я неоднократно замечал, что конструкция (я тоже раньше так писал) [vba]
Код
r_ = .Cells(Rows.Count, 1).End(3).Row
[/vba]на некоторых машинах дает ошибку, пока точку перед Rows не поставишь. Причем дома в 2010 все нормально работает, приходишь на работу в 2013 - бац, ошибка._Boroda_
_Boroda_, Саш, я не знаю почему ошибка но по логике не должно её быть и на 2013 прям сейчас сижу и нет понятно что в случае .Range(.Cells(1,1),.Cells(2,2)) точки нужны иначе перекос будет, но вот Rows.Count …. Очень странно В той конструкции все на активный лист и ваще не должно играть роли. Разве что файлы xls и xlsx тогда .cells ссылается на лист из xls книги, а а активный лист xlsx. Вот тогда лимон строк в xls отсутствует и будет ошибка. Другого варианта не вижу.
_Boroda_, Саш, я не знаю почему ошибка но по логике не должно её быть и на 2013 прям сейчас сижу и нет понятно что в случае .Range(.Cells(1,1),.Cells(2,2)) точки нужны иначе перекос будет, но вот Rows.Count …. Очень странно В той конструкции все на активный лист и ваще не должно играть роли. Разве что файлы xls и xlsx тогда .cells ссылается на лист из xls книги, а а активный лист xlsx. Вот тогда лимон строк в xls отсутствует и будет ошибка. Другого варианта не вижу.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Дык у меня тоже нет. Я ж говорю - при перекидывании файла между машинами. Возможно с разными Офисами и/или разной Виндой, я не заострял внимание, пофиг
Не все. Cells на указанный в With выше лист, а Rows да, на активный. Более того, макросы у меня почти всегда запускаются из той же книги кнопкой, то есть об xls и речи быть не может. Однако вот так оно получается. Причем, повторюсь, не всегда, не на всех машинах и не на всех файлах. Более того, иногда такая фигня случается у других людей, которым я код или файл с кодом отправляю. Логику появления ошибки я не вычислил, да не очень-то и пытался. Просто запомнил, что перед Rows нужно ставить точку
Дык у меня тоже нет. Я ж говорю - при перекидывании файла между машинами. Возможно с разными Офисами и/или разной Виндой, я не заострял внимание, пофиг
Не все. Cells на указанный в With выше лист, а Rows да, на активный. Более того, макросы у меня почти всегда запускаются из той же книги кнопкой, то есть об xls и речи быть не может. Однако вот так оно получается. Причем, повторюсь, не всегда, не на всех машинах и не на всех файлах. Более того, иногда такая фигня случается у других людей, которым я код или файл с кодом отправляю. Логику появления ошибки я не вычислил, да не очень-то и пытался. Просто запомнил, что перед Rows нужно ставить точку_Boroda_
Sub tt() Cells(2, 1).Resize(Cells(Rows.Count, 1).End(3).Row).ClearContents r0_ = 6 For Each sh In ThisWorkbook.Sheets With sh If .Name <> Me.Name Then r1_ = .Cells(.Rows.Count, 5).End(3).Row If r1_ >= r0_ Then n_ = n_ + r1_ - r0_ + 1 End If End If End With Next sh 'можно без блока выше, переназначать массив каждый раз redim preserve, но это фу 'правда с блоком тоже фу :) ar = Cells(2, 1).Resize(n_) For Each sh In ThisWorkbook.Sheets With sh If .Name <> Me.Name Then k_ = .Cells(.Rows.Count, 5).End(3).Row - r0_ + 1 If k_ > 0 Then ari = .Cells(r0_, 5).Resize(k_) For i = 1 To k_ x_ = x_ + 1 ar(x_, 1) = ari(i, 1) Next i End If End If End With Next sh Cells(2, 1).Resize(n_) = ar End Sub
[/vba]
А лучше через словарь
[vba]
Код
Sub ee() Cells(2, 1).Resize(Cells(Rows.Count, 1).End(3).Row).ClearContents Set slov = CreateObject("Scripting.Dictionary") r0_ = 6 For Each sh In ThisWorkbook.Sheets With sh If .Name <> Me.Name Then k_ = .Cells(.Rows.Count, 5).End(3).Row - r0_ + 1 If k_ > 0 Then ari = .Cells(r0_, 5).Resize(k_) For i = 1 To k_ x_ = x_ + 1 slov.Item(x_) = ari(i, 1) Next i End If End If End With Next sh Cells(2, 1).Resize(x_) = Application.Transpose(slov.Items) End Sub
Sub tt() Cells(2, 1).Resize(Cells(Rows.Count, 1).End(3).Row).ClearContents r0_ = 6 For Each sh In ThisWorkbook.Sheets With sh If .Name <> Me.Name Then r1_ = .Cells(.Rows.Count, 5).End(3).Row If r1_ >= r0_ Then n_ = n_ + r1_ - r0_ + 1 End If End If End With Next sh 'можно без блока выше, переназначать массив каждый раз redim preserve, но это фу 'правда с блоком тоже фу :) ar = Cells(2, 1).Resize(n_) For Each sh In ThisWorkbook.Sheets With sh If .Name <> Me.Name Then k_ = .Cells(.Rows.Count, 5).End(3).Row - r0_ + 1 If k_ > 0 Then ari = .Cells(r0_, 5).Resize(k_) For i = 1 To k_ x_ = x_ + 1 ar(x_, 1) = ari(i, 1) Next i End If End If End With Next sh Cells(2, 1).Resize(n_) = ar End Sub
[/vba]
А лучше через словарь
[vba]
Код
Sub ee() Cells(2, 1).Resize(Cells(Rows.Count, 1).End(3).Row).ClearContents Set slov = CreateObject("Scripting.Dictionary") r0_ = 6 For Each sh In ThisWorkbook.Sheets With sh If .Name <> Me.Name Then k_ = .Cells(.Rows.Count, 5).End(3).Row - r0_ + 1 If k_ > 0 Then ari = .Cells(r0_, 5).Resize(k_) For i = 1 To k_ x_ = x_ + 1 slov.Item(x_) = ari(i, 1) Next i End If End If End With Next sh Cells(2, 1).Resize(x_) = Application.Transpose(slov.Items) End Sub
Может в определенных билдах был сбой и обновления исправили
Пофиг. Если один раз ошибка была, то нужно закладываться на то, что она может повториться. Тем более, что это несложно - всего лишь одну лишнюю точку поставить
Может в определенных билдах был сбой и обновления исправили
Пофиг. Если один раз ошибка была, то нужно закладываться на то, что она может повториться. Тем более, что это несложно - всего лишь одну лишнюю точку поставить_Boroda_