Добрый день. Помогите разобраться плз. Ниже кусок макроса, в рамках которого у меня перемещаются данные из файла All_data (во вложении) во второй файл Excel. При этом (смотрим вложенный файл), если в перемещаемой ячейке листа "All" копируется строка 2 (есть текст), то проблем не возникает. А вот если копируются все остальные строки (например 3 и далее), в которых нет текста, но содержатся формулы, то во втором файле создается пустая строка, чего мне важно избежать! Формулами в Excel я умею это делать, используя ДЛСТР(A1)>0, а вот в VBA не силен... Ситуация в том, что количество строк в закладках "data" постоянно меняется и поэтому приходится формулами прятать нули и Н/Д на закладке Алл, т.к. она служит отчетом.
Вот кусок макроса из второго файла. Как сделать так, чтобы он не тянул данные, где нет текста и есть формулы? [vba]
Код
' будем брать данные с первого листа Set sh = WB.Worksheets(1)
' берем диапазон ячеек с ячейки A2 до последней заполненной в столбце A Set ra = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 14)
' ==== переносим данные в наш файл (shd - кодовое имя листа, куда помещаем данные) shd.Range("b" & shd.Rows.Count).End(xlUp).Offset(1).Resize(ra.Rows.Count, ra.Columns.Count).Value = ra.Value ' ==== конец обработки данных из очередного файла
[/vba]
Добрый день. Помогите разобраться плз. Ниже кусок макроса, в рамках которого у меня перемещаются данные из файла All_data (во вложении) во второй файл Excel. При этом (смотрим вложенный файл), если в перемещаемой ячейке листа "All" копируется строка 2 (есть текст), то проблем не возникает. А вот если копируются все остальные строки (например 3 и далее), в которых нет текста, но содержатся формулы, то во втором файле создается пустая строка, чего мне важно избежать! Формулами в Excel я умею это делать, используя ДЛСТР(A1)>0, а вот в VBA не силен... Ситуация в том, что количество строк в закладках "data" постоянно меняется и поэтому приходится формулами прятать нули и Н/Д на закладке Алл, т.к. она служит отчетом.
Вот кусок макроса из второго файла. Как сделать так, чтобы он не тянул данные, где нет текста и есть формулы? [vba]
Код
' будем брать данные с первого листа Set sh = WB.Worksheets(1)
' берем диапазон ячеек с ячейки A2 до последней заполненной в столбце A Set ra = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 14)
' ==== переносим данные в наш файл (shd - кодовое имя листа, куда помещаем данные) shd.Range("b" & shd.Rows.Count).End(xlUp).Offset(1).Resize(ra.Rows.Count, ra.Columns.Count).Value = ra.Value ' ==== конец обработки данных из очередного файла
n = Application.WorksheetFunction.Match("", Columns("a"), 0) ' берем диапазон ячеек с ячейки A2 до последней заполненной в столбце A Set ra = sh.Range(sh.Range("a2"), sh.Range("a" & n)).Resize(, 14)
[/vba]
Попробуйте так: [vba]
Код
n = Application.WorksheetFunction.Match("", Columns("a"), 0) ' берем диапазон ячеек с ячейки A2 до последней заполненной в столбце A Set ra = sh.Range(sh.Range("a2"), sh.Range("a" & n)).Resize(, 14)
Добрый день, спасибо за ваши предложения, но оба предложенных способов не работают должным образом:
SLAVICK, результатом кода стало вставка только одной пустой строки между данными с разных отчетов (у меня ранее вставлялись все имющиеся пустые строки с формулами).
_Boroda_, результат вообще отсутствует, во второй файл ничего не переносится.
Добрый день, спасибо за ваши предложения, но оба предложенных способов не работают должным образом:
SLAVICK, результатом кода стало вставка только одной пустой строки между данными с разных отчетов (у меня ранее вставлялись все имющиеся пустые строки с формулами).
_Boroda_, результат вообще отсутствует, во второй файл ничего не переносится.Callione
Сообщение отредактировал Callione - Понедельник, 21.03.2016, 10:48
Что бы было без костылей, надо было на 2-х листах сделать разные отчеты как есть, а на третьем показать как надо. И результат мог быть без костылей. ИМХО.
Что бы было без костылей, надо было на 2-х листах сделать разные отчеты как есть, а на третьем показать как надо. И результат мог быть без костылей. ИМХО.Wasilich
SLAVICK, обнаружил, что предложенное вами решение не работает при обработке отчета в 37 тыс строк, оно просто игнорирует этот отчет.. Если отключаю ваши две строчки и включаю старую - все работает ок и этот проблемный отчет (в т.ч.) тоже копируется во второй файл. Не знаете, почему такое происходит?
В целях проверки в проблемном отчете удалил все записи, кроме первых пары десятков строк. Ваш вариант макроса нормально обрабатывает этот отчет. Как только копирую в этот файл обратно все 37 тыс строк.. отчет игнорируется.
Wasilich, видимо так и произойдет, если на пальцах (в теории) не найдем понимания. Структура отчетов очень сложная, чтобы подготовить рабочий шаблон для размещения тут в примерах, уйдет минут 40, нет сейчас столько времени, извините. [moder]Ну да, правильно, зачем Вам свое время тратить, если можно тратить наше - вдруг кто-нибудь да угадает?
SLAVICK, обнаружил, что предложенное вами решение не работает при обработке отчета в 37 тыс строк, оно просто игнорирует этот отчет.. Если отключаю ваши две строчки и включаю старую - все работает ок и этот проблемный отчет (в т.ч.) тоже копируется во второй файл. Не знаете, почему такое происходит?
В целях проверки в проблемном отчете удалил все записи, кроме первых пары десятков строк. Ваш вариант макроса нормально обрабатывает этот отчет. Как только копирую в этот файл обратно все 37 тыс строк.. отчет игнорируется.
Wasilich, видимо так и произойдет, если на пальцах (в теории) не найдем понимания. Структура отчетов очень сложная, чтобы подготовить рабочий шаблон для размещения тут в примерах, уйдет минут 40, нет сейчас столько времени, извините. [moder]Ну да, правильно, зачем Вам свое время тратить, если можно тратить наше - вдруг кто-нибудь да угадает?Callione
Сообщение отредактировал _Boroda_ - Понедельник, 21.03.2016, 15:36
Callione, - Wasilich прав - нужно сразу готовить правильные примеры (или говорить об объемах)- откуда мы знаем сколько и каких у Вас там данных?
Вот можно так: [vba]
Код
n = sh.Evaluate("MATCH("""", a:a, 0)") - 1
[/vba] или так: [vba]
Код
n = Application.Match("", Columns("a"), 0) - 1
[/vba] Или вообще через анализ массива - так больше код, но легче и удобнее корректировать. Можно быстро менять условия...: [vba]
Код
Function lastRow(r As Range) Dim m() m = r.Value For n = UBound(m) To 1 Step -1 If Len(m(n, 1)) > 0 Then Exit For Next lastRow = n End Function
[/vba]
Похоже не только в этом проблема на файле из 1- го поста работает только 3-й вариант. , хотя мой пример на данных того листа... Добавлено Понял в чем проблема 1-2-го варианта на примере файла не было формулы возвращающей "". Используйте 3-й вариант он надежней - хоть и больше.
Callione, - Wasilich прав - нужно сразу готовить правильные примеры (или говорить об объемах)- откуда мы знаем сколько и каких у Вас там данных?
Вот можно так: [vba]
Код
n = sh.Evaluate("MATCH("""", a:a, 0)") - 1
[/vba] или так: [vba]
Код
n = Application.Match("", Columns("a"), 0) - 1
[/vba] Или вообще через анализ массива - так больше код, но легче и удобнее корректировать. Можно быстро менять условия...: [vba]
Код
Function lastRow(r As Range) Dim m() m = r.Value For n = UBound(m) To 1 Step -1 If Len(m(n, 1)) > 0 Then Exit For Next lastRow = n End Function
[/vba]
Похоже не только в этом проблема на файле из 1- го поста работает только 3-й вариант. , хотя мой пример на данных того листа... Добавлено Понял в чем проблема 1-2-го варианта на примере файла не было формулы возвращающей "". Используйте 3-й вариант он надежней - хоть и больше.SLAVICK
SLAVICK, Wasilich, Вы безусловно правы, прошу меня извинить. Вот уж точно век живи и век учись - я даже и представить не мог, что у функции может существовать подобный лимит.
SLAVICK, подставил третий вариант, даже ничего подгонять не пришлось - все заработало с первого раза! В том числе и тот самый отчет :) Спасибо, что нашли возможность помочь!
SLAVICK, Wasilich, Вы безусловно правы, прошу меня извинить. Вот уж точно век живи и век учись - я даже и представить не мог, что у функции может существовать подобный лимит.
SLAVICK, подставил третий вариант, даже ничего подгонять не пришлось - все заработало с первого раза! В том числе и тот самый отчет :) Спасибо, что нашли возможность помочь!Callione