Не понятно - что должно было произойти - меня ничего не происходит Вот макрос - который представлен сдесь уважаемым Hugo, [vba]
Код
Sub Get_Value_From_Close_Book_Formula() Dim sPath As String, sFile As String, sShName As String, sep_ As String sShName = "Лист1"
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub sep_ = Application.PathSeparator sFile = Split(.SelectedItems(1), sep_)(UBound(Split(.SelectedItems(1), sep_))) ' "Êíèãà1.xls" sPath = Replace(.SelectedItems(1), sFile, "") '"C:\Documents and Settings\" End With
With Range("H6:AS100") .Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A6" .Value = .Value End With End Sub
[/vba] Он в принципе устраивает - но в нем нужно указывать - какой диапазон данных брать - а уменя их в закрытом файле в примере может больше 100 или меньше! А макрос либо будет захватывать пустые строки если их допустим меньше 100 либо обрезать данные если их больше! Поэтому вопрос - как можно брать только заполненые данные и вставлять их?
Не понятно - что должно было произойти - меня ничего не происходит Вот макрос - который представлен сдесь уважаемым Hugo, [vba]
Код
Sub Get_Value_From_Close_Book_Formula() Dim sPath As String, sFile As String, sShName As String, sep_ As String sShName = "Лист1"
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub sep_ = Application.PathSeparator sFile = Split(.SelectedItems(1), sep_)(UBound(Split(.SelectedItems(1), sep_))) ' "Êíèãà1.xls" sPath = Replace(.SelectedItems(1), sFile, "") '"C:\Documents and Settings\" End With
With Range("H6:AS100") .Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A6" .Value = .Value End With End Sub
[/vba] Он в принципе устраивает - но в нем нужно указывать - какой диапазон данных брать - а уменя их в закрытом файле в примере может больше 100 или меньше! А макрос либо будет захватывать пустые строки если их допустим меньше 100 либо обрезать данные если их больше! Поэтому вопрос - как можно брать только заполненые данные и вставлять их?Ed_Vard
Сообщение отредактировал Ed_Vard - Среда, 21.09.2011, 17:51
Есть книга Пример с таблицей из которой нужно получить данные в диапазоне А1:AL в другую открытую книгу начиная с ячейки Н6 и втавил все скопированне данные.
В книгу "Пример.xls" в стандартный модуль вставляем это [vba]
Код
Sub ert() Range("A1").CurrentRegion.Copy Workbooks("Другая_книга.xls").Sheets(1).Range("H6") End Sub
[/vba] ... и выполняем при активном листе с данными в книге "Пример". Диапазон (непрерывный диапазон, как у вас в примере) копируется в открытую книгу с именем "Другая_книга.xls" на 1-й лист, начиная с яч. Н6. На всякий случай проверил. У вас не так?
ЦитатаEd_Vard
Есть книга Пример с таблицей из которой нужно получить данные в диапазоне А1:AL в другую открытую книгу начиная с ячейки Н6 и втавил все скопированне данные.
В книгу "Пример.xls" в стандартный модуль вставляем это [vba]
Код
Sub ert() Range("A1").CurrentRegion.Copy Workbooks("Другая_книга.xls").Sheets(1).Range("H6") End Sub
[/vba] ... и выполняем при активном листе с данными в книге "Пример". Диапазон (непрерывный диапазон, как у вас в примере) копируется в открытую книгу с именем "Другая_книга.xls" на 1-й лист, начиная с яч. Н6. На всякий случай проверил. У вас не так?nilem
Яндекс.Деньги 4100159601573
Сообщение отредактировал nilem - Среда, 21.09.2011, 18:07
Ed_Vard, Вам нужно объединить два кода - мой пример и код Николая.
Мой пример состоит из двух половин - в первой половине получаем в переменную путь к открываемому файлу, во второй половине используем этот путь в формулах, затем заменяем формулы полученными данными. И да, в том коде действительно ошибка - правильная строка такая: [vba]
[/vba] можно менять как хочется - в каждую ячейку этого диапазона будет вписана формула с ссылкой на соответствующую ячейку выбранной книги (жёстко прописанного листа). Но диапазон действительно нужно знать заранее - т.к. книга кодом не открывается, то посмотреть, что на этот раз нужно копировать, этим кодом не получится.
Но если объединить эти два кода (добавив процесс открытия файла) - то уже можно сперва посмотреть. А в случае с этим примером - можно не глядя копировать Range("A1").CurrentRegion, как написал Николай.
Получается такой несложный код:
[vba]
Код
Option Explicit
Sub Get_Value_From_Book() Dim sFile As String, sh As Worksheet, ac As Long
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub sFile = .SelectedItems(1) End With
Set sh = ActiveWorkbook.ActiveSheet
With Application 'отключаем обновление экрана - это убыстрит работу макроса .ScreenUpdating = False 'отключаем события книги .EnableEvents = False 'включаем ручной пересчёт формул - это убыстрит работу макроса ac = .Calculation: .Calculation = xlCalculationManual
With GetObject(sFile).Sheets(1) .[A1].CurrentRegion.Copy sh.[H6] .Parent.Close False End With
'возвращаем назад всё отключенное/изменённое .ScreenUpdating = True .EnableEvents = True .Calculation = ac End With
End Sub
[/vba]
Ed_Vard, Вам нужно объединить два кода - мой пример и код Николая.
Мой пример состоит из двух половин - в первой половине получаем в переменную путь к открываемому файлу, во второй половине используем этот путь в формулах, затем заменяем формулы полученными данными. И да, в том коде действительно ошибка - правильная строка такая: [vba]
[/vba] можно менять как хочется - в каждую ячейку этого диапазона будет вписана формула с ссылкой на соответствующую ячейку выбранной книги (жёстко прописанного листа). Но диапазон действительно нужно знать заранее - т.к. книга кодом не открывается, то посмотреть, что на этот раз нужно копировать, этим кодом не получится.
Но если объединить эти два кода (добавив процесс открытия файла) - то уже можно сперва посмотреть. А в случае с этим примером - можно не глядя копировать Range("A1").CurrentRegion, как написал Николай.
Получается такой несложный код:
[vba]
Код
Option Explicit
Sub Get_Value_From_Book() Dim sFile As String, sh As Worksheet, ac As Long
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub sFile = .SelectedItems(1) End With
Set sh = ActiveWorkbook.ActiveSheet
With Application 'отключаем обновление экрана - это убыстрит работу макроса .ScreenUpdating = False 'отключаем события книги .EnableEvents = False 'включаем ручной пересчёт формул - это убыстрит работу макроса ac = .Calculation: .Calculation = xlCalculationManual
With GetObject(sFile).Sheets(1) .[A1].CurrentRegion.Copy sh.[H6] .Parent.Close False End With
'возвращаем назад всё отключенное/изменённое .ScreenUpdating = True .EnableEvents = True .Calculation = ac End With
Прошу прощения - протупил немного - сразу не въехал! Hugo, - спасибо за очень развенутое объяснение - все пределно понятно - но как всегда - одно НО - происходит копирование всего листа - независимо от того - что указываешь А1 или А6! Это нужно для того - чтоб не захватывать шапку таблицы - а брать только данные - для последующей обработки - т.к. на листе - куда вставляються данные - есть еще одна таблица! Возможно ли сдесь использовать Application.ScreenUpdating = False дабы всетаки открывать книгу в фоне - получить количество строк с данными - и полученую переменную передать в диапазон ? Конечно - это не совсем из "закрытой" книги - но всетаки!
Quote (nilem)
На всякий случай проверил. У вас не так?
Прошу прощения - протупил немного - сразу не въехал! Hugo, - спасибо за очень развенутое объяснение - все пределно понятно - но как всегда - одно НО - происходит копирование всего листа - независимо от того - что указываешь А1 или А6! Это нужно для того - чтоб не захватывать шапку таблицы - а брать только данные - для последующей обработки - т.к. на листе - куда вставляються данные - есть еще одна таблица! Возможно ли сдесь использовать Application.ScreenUpdating = False дабы всетаки открывать книгу в фоне - получить количество строк с данными - и полученую переменную передать в диапазон ? Конечно - это не совсем из "закрытой" книги - но всетаки!Ed_Vard
Для удаления шапки (если она постоянная) совсем не нужно данные смотреть А давайте сами код подправьте - Вы ведь не слова не сказали в задании про то, что шапка не нужна...
Вот пример сдвига выбора таблицы (6 сторок ненужная шапка):
[vba]
Код
Sub ttt() ActiveSheet.UsedRange.Select With ActiveSheet.UsedRange .Resize(.Rows.Count - 6).Offset(6).Select End With End Sub
[/vba]
И Application.ScreenUpdating = False - это совсем не для того, чтобы открывать книгу в фоне...
Для удаления шапки (если она постоянная) совсем не нужно данные смотреть А давайте сами код подправьте - Вы ведь не слова не сказали в задании про то, что шапка не нужна...
Вот пример сдвига выбора таблицы (6 сторок ненужная шапка):
[vba]
Код
Sub ttt() ActiveSheet.UsedRange.Select With ActiveSheet.UsedRange .Resize(.Rows.Count - 6).Offset(6).Select End With End Sub
[/vba]
И Application.ScreenUpdating = False - это совсем не для того, чтобы открывать книгу в фоне...Hugo
Так книга в коде №23 открывается и закрывается - так оно и работает. Но если шапка постоянна и не "бегает" по листу - чего на неё смотреть? Вполне кода №25 хватает, чтоб её откинуть.
Так книга в коде №23 открывается и закрывается - так оно и работает. Но если шапка постоянна и не "бегает" по листу - чего на неё смотреть? Вполне кода №25 хватает, чтоб её откинуть.Hugo
Огромное спасибо Hugo, и nilem, за оказанную помощь, в конечном варианте выглядит вот так: [vba]
Код
Sub Get_Value_From_Book() Dim sFile As String, sh As Worksheet, ac As Long
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub sFile = .SelectedItems(1) End With
With Application 'отключаем обновление экрана - это убыстрит работу макроса .ScreenUpdating = False 'отключаем события книги .EnableEvents = False 'включаем ручной пересчёт формул - это убыстрит работу макроса ac = .Calculation: .Calculation = xlCalculationManual
With GetObject(sFile).Sheets(1).UsedRange .Resize(.Rows.Count - 5).Offset(5).Copy sh.[H6] '.Parent.Close False End With
'возвращаем назад всё отключенное/изменённое .ScreenUpdating = True .EnableEvents = True .Calculation = ac End With
End Sub
[/vba]
Во сяком случае у меня работает может комуто пригодиться
Огромное спасибо Hugo, и nilem, за оказанную помощь, в конечном варианте выглядит вот так: [vba]
Код
Sub Get_Value_From_Book() Dim sFile As String, sh As Worksheet, ac As Long
With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Microsoft Excel files", "*.xls" .AllowMultiSelect = False .InitialFileName = ThisWorkbook.Path If .Show = 0 Then Exit Sub sFile = .SelectedItems(1) End With
With Application 'отключаем обновление экрана - это убыстрит работу макроса .ScreenUpdating = False 'отключаем события книги .EnableEvents = False 'включаем ручной пересчёт формул - это убыстрит работу макроса ac = .Calculation: .Calculation = xlCalculationManual
With GetObject(sFile).Sheets(1).UsedRange .Resize(.Rows.Count - 5).Offset(5).Copy sh.[H6] '.Parent.Close False End With
'возвращаем назад всё отключенное/изменённое .ScreenUpdating = True .EnableEvents = True .Calculation = ac End With
End Sub
[/vba]
Во сяком случае у меня работает может комуто пригодитьсяEd_Vard
Я вообще-то не думал, что так буквально код примените - думал, что currentregion будете ресайзить/оффсетить, но можно и так, если там ничего больше нет. Но эти цифры кажется не должны быть одинаковыми, если таблица ровная - в моём примере снизу одна строка с ИТОГО откидывалась Так что посмотрите, что там копируется - не пропало ли чего... Я особо не тестил, не изучал...
А '.Parent.Close False зря отключили - так файл остаётся невидимо открытым.
Я вообще-то не думал, что так буквально код примените - думал, что currentregion будете ресайзить/оффсетить, но можно и так, если там ничего больше нет. Но эти цифры кажется не должны быть одинаковыми, если таблица ровная - в моём примере снизу одна строка с ИТОГО откидывалась Так что посмотрите, что там копируется - не пропало ли чего... Я особо не тестил, не изучал...
А '.Parent.Close False зря отключили - так файл остаётся невидимо открытым.Hugo
Я вообще-то не думал, что так буквально код примените - думал, что currentregion будете ресайзить/оффсетить, но можно и так, если там ничего больше нет.
Quote
'.Parent.Close False
Почему то в 2010 офисе не захотел работать - а т.к. нужно было срочно и инет на работе пропал - то не стал изобретать велосипед! Кпируеться вроде все нормально - пробовал с разной длиной таблицы - вроде ничего! не совсем понял - какие цифры
Quote
Но эти цифры не должны быть одинаковыми
Quote (Hugo)
Я вообще-то не думал, что так буквально код примените - думал, что currentregion будете ресайзить/оффсетить, но можно и так, если там ничего больше нет.
Quote
'.Parent.Close False
Почему то в 2010 офисе не захотел работать - а т.к. нужно было срочно и инет на работе пропал - то не стал изобретать велосипед! Кпируеться вроде все нормально - пробовал с разной длиной таблицы - вроде ничего! не совсем понял - какие цифры
Чтоб посмотреть, что копируется - тормозните код на строке [vba]
Код
With GetObject(sFile).Sheets(1).[A1].CurrentRegion .Resize(.Rows.Count - 5).Offset(5).Select 'Copy sh.[H6] '<-- ВОТ НА ЭТОЙ '.Parent.Close False End With
А насчёт .Parent.Close False - я не знаю, под 2010 не работал, но гляньте, какие окна файлов скрыты - наверняка там и этот файл есть после окончания работы кода. В 2007 это в Вид->Окно->Отобразить
Может быть [A1].CurrentRegion мешает - попробуйте так:
[vba]
Код
With GetObject(sFile).Sheets(1) With .[A1].CurrentRegion .Resize(.Rows.Count - 5).Offset(5).Copy sh.[H6] End With .Parent.Close False End With
[/vba]
Чтоб посмотреть, что копируется - тормозните код на строке [vba]
Код
With GetObject(sFile).Sheets(1).[A1].CurrentRegion .Resize(.Rows.Count - 5).Offset(5).Select 'Copy sh.[H6] '<-- ВОТ НА ЭТОЙ '.Parent.Close False End With
А насчёт .Parent.Close False - я не знаю, под 2010 не работал, но гляньте, какие окна файлов скрыты - наверняка там и этот файл есть после окончания работы кода. В 2007 это в Вид->Окно->Отобразить
Может быть [A1].CurrentRegion мешает - попробуйте так:
[vba]
Код
With GetObject(sFile).Sheets(1) With .[A1].CurrentRegion .Resize(.Rows.Count - 5).Offset(5).Copy sh.[H6] End With .Parent.Close False End With
Hugo, спасибо - действительно - мешал [A1].CurrentRegion мешал! Ваш вариант проходит нормально! Но и без него окна не остаеться - в 2010 это Вид->Перейти в другое окно - там его тоже нет! Хотя это можно проверить просто поробовав запустить книгу - откуда происходило копирование - если она открыта - то выдаст предупреждение.
Hugo, спасибо - действительно - мешал [A1].CurrentRegion мешал! Ваш вариант проходит нормально! Но и без него окна не остаеться - в 2010 это Вид->Перейти в другое окно - там его тоже нет! Хотя это можно проверить просто поробовав запустить книгу - откуда происходило копирование - если она открыта - то выдаст предупреждение.Ed_Vard