Здравствуйте! Очень нуждаюсь в Вашей помощи! Есть макрос, он работает, но нужно его немного подправить. Чтобы можно было: 1) копировать данные из закрытой книги (мой только при открытой копирует) 2) убрать расширение чтобы он не привязывался к определенному расширению книги. (т.е хотелось бы если просто если указываешь имя файла, такое как есть в ячейки)
[vba]
Code
Sub импорт() On Error Resume Next Set c = Workbooks(Cells(1, 2) & ".xlsx").Worksheets("Лист1").Range("A1:K20").Find("Товар", LookIn:=xlValues) ' тут бы хотелось убрать расширение т.е эту строчку & ".xlsx", т.к файлы бывают различного расширения If Not c Is Nothing Then Application.Goto c, True Workbooks("Книга2.xlsm").Worksheets("Отчет").Cells(4, 2) = Cells(ActiveCell.Row, ActiveCell.Column + 1) End If Windows("Книга2.xlsm").Activate End Sub
[/vba]
Здравствуйте! Очень нуждаюсь в Вашей помощи! Есть макрос, он работает, но нужно его немного подправить. Чтобы можно было: 1) копировать данные из закрытой книги (мой только при открытой копирует) 2) убрать расширение чтобы он не привязывался к определенному расширению книги. (т.е хотелось бы если просто если указываешь имя файла, такое как есть в ячейки)
[vba]
Code
Sub импорт() On Error Resume Next Set c = Workbooks(Cells(1, 2) & ".xlsx").Worksheets("Лист1").Range("A1:K20").Find("Товар", LookIn:=xlValues) ' тут бы хотелось убрать расширение т.е эту строчку & ".xlsx", т.к файлы бывают различного расширения If Not c Is Nothing Then Application.Goto c, True Workbooks("Книга2.xlsm").Worksheets("Отчет").Cells(4, 2) = Cells(ActiveCell.Row, ActiveCell.Column + 1) End If Windows("Книга2.xlsm").Activate End Sub
Sub импорт() Dim wb As Workbook Application.ScreenUpdating = 0 Set wb = GetObject(Cells(2, 2).Value & "\" & Cells(1, 2).Value & ".xls") Set c = wb.Worksheets("Лист1").Range("A1:K20").Find("Товар", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Err <> 0 Then MsgBox "Не указано имя файла или он не открыт" 'любая ошибка If Not c Is Nothing Then Application.Goto c, True ThisWorkbook.Worksheets("Отчет").Cells(4, 2).Value = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value 'Row + - адрес от критерия End If ThisWorkbook.Activate wb.Close Application.ScreenUpdating = 1 End Sub
[/vba]
автор файла Ерик...???
[vba]
Code
Sub импорт() Dim wb As Workbook Application.ScreenUpdating = 0 Set wb = GetObject(Cells(2, 2).Value & "\" & Cells(1, 2).Value & ".xls") Set c = wb.Worksheets("Лист1").Range("A1:K20").Find("Товар", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Err <> 0 Then MsgBox "Не указано имя файла или он не открыт" 'любая ошибка If Not c Is Nothing Then Application.Goto c, True ThisWorkbook.Worksheets("Отчет").Cells(4, 2).Value = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value 'Row + - адрес от критерия End If ThisWorkbook.Activate wb.Close Application.ScreenUpdating = 1 End Sub
А как можно сделать так чтобы не привязываться к определенному расширению ? т.к бывают файлы с разным расширением (.xls или .xlsx или .xlsm)
Quote (Imba_Ra)
On Error Resume Next
А почему эту строчку убрали? без нее выходит Debug если что то не указали, а это пугает сотрудников)) Её ведь можно указать в начале? или это не правильно?
Quote (ABC)
smile автор файла Ерик...???
Да) Спс большое за решение!
Quote (ABC)
Value & ".xls")
А как можно сделать так чтобы не привязываться к определенному расширению ? т.к бывают файлы с разным расширением (.xls или .xlsx или .xlsm)
Quote (Imba_Ra)
On Error Resume Next
А почему эту строчку убрали? без нее выходит Debug если что то не указали, а это пугает сотрудников)) Её ведь можно указать в начале? или это не правильно?Imba_Ra
Sub импорт() On Error GoTo Errors1'обработок ошибок Dim wb As Workbook, FName ChDrive Mid(ThisWorkbook.Path, 1, 1) FName = Application.GetOpenFilename("Excel Files, *.xls*", , "Выберите файл") If FName = False Then Exit Sub'если нажали ОТМЕНА, тогда выходим Application.ScreenUpdating = 0 Set wb = GetObject(FName)'открываем файл скрыто If wb.Name = ThisWorkbook.Name Then Exit Sub'если имя открываемого файла совпадает с этим файлом, тогда выходим Set c = wb.Worksheets("Лист1").Range("A1:K20").Find("Товар", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.Goto c, True With ThisWorkbook.Worksheets("Отчет") .Cells(4, 2).Value = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value 'Row + - адрес от критерия .Cells(1, 2).Value = wb.Name'имя файла .Cells(2, 2).Value = wb.Path'путь файла End With Else: ud End If ThisWorkbook.Activate If IsFileOpen(wb.Name) = True Then wb.Close 0'если файл открыть, тогда закрываем без сохранении GoTo Ends: Errors1: ud Ends: Application.ScreenUpdating = 1 End Sub 'функция: узнаем открыта ли файл Function IsFileOpen(FilePathName As String) As Boolean Dim FN% FN = FreeFile On Error Resume Next Open FilePathName For Random Access Read Write Lock Read Write As FN Close FN IsFileOpen = Err <> 0 End Function
Sub ud() With ThisWorkbook.Worksheets("Отчет") .Cells(1, 2).Value = "": .Cells(2, 2).Value = "" .Cells(4, 2).Value = "" .Cells(4, 2).Value = "" End With End Sub
[/vba]
[vba]
Code
Sub импорт() On Error GoTo Errors1'обработок ошибок Dim wb As Workbook, FName ChDrive Mid(ThisWorkbook.Path, 1, 1) FName = Application.GetOpenFilename("Excel Files, *.xls*", , "Выберите файл") If FName = False Then Exit Sub'если нажали ОТМЕНА, тогда выходим Application.ScreenUpdating = 0 Set wb = GetObject(FName)'открываем файл скрыто If wb.Name = ThisWorkbook.Name Then Exit Sub'если имя открываемого файла совпадает с этим файлом, тогда выходим Set c = wb.Worksheets("Лист1").Range("A1:K20").Find("Товар", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.Goto c, True With ThisWorkbook.Worksheets("Отчет") .Cells(4, 2).Value = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value 'Row + - адрес от критерия .Cells(1, 2).Value = wb.Name'имя файла .Cells(2, 2).Value = wb.Path'путь файла End With Else: ud End If ThisWorkbook.Activate If IsFileOpen(wb.Name) = True Then wb.Close 0'если файл открыть, тогда закрываем без сохранении GoTo Ends: Errors1: ud Ends: Application.ScreenUpdating = 1 End Sub 'функция: узнаем открыта ли файл Function IsFileOpen(FilePathName As String) As Boolean Dim FN% FN = FreeFile On Error Resume Next Open FilePathName For Random Access Read Write Lock Read Write As FN Close FN IsFileOpen = Err <> 0 End Function
Sub ud() With ThisWorkbook.Worksheets("Отчет") .Cells(1, 2).Value = "": .Cells(2, 2).Value = "" .Cells(4, 2).Value = "" .Cells(4, 2).Value = "" End With End Sub
ABC, Супер! то что нужно! И последний вопрос. т.к значений копировать таким макросом нужно достаточное большое количество, подскажите как мне быть? Например нужно еще скопировать еще сумму и срок. (Книга1) Сам пытался разобраться, но не выходит...
ABC, Супер! то что нужно! И последний вопрос. т.к значений копировать таким макросом нужно достаточное большое количество, подскажите как мне быть? Например нужно еще скопировать еще сумму и срок. (Книга1) Сам пытался разобраться, но не выходит...Imba_Ra
если порядок как в первом файле тогда поменяйте .Cells(4, 2).Value = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value на Range(Cells(ActiveCell.Row, ActiveCell.Column + 1), Cells(ActiveCell.Row + 3, ActiveCell.Column + 1)).Copy _ Destination:=.Cells(4, 2) ud отредактируйте
[vba]
Code
Sub ud() With ThisWorkbook.Worksheets("Отчет") .Range("B1:B2").Value = "" .Range("B4:B6").Value = "" End With End Sub
если порядок как в первом файле тогда поменяйте .Cells(4, 2).Value = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value на Range(Cells(ActiveCell.Row, ActiveCell.Column + 1), Cells(ActiveCell.Row + 3, ActiveCell.Column + 1)).Copy _ Destination:=.Cells(4, 2) ud отредактируйте
[vba]
Code
Sub ud() With ThisWorkbook.Worksheets("Отчет") .Range("B1:B2").Value = "" .Range("B4:B6").Value = "" End With End Sub
В общем получилось следующее с помощью ABC, Этот макрос использовал в начале
[vba]
Code
Sub get1() 'On Error GoTo Errors1 'обработок ошибок Dim wb As Workbook, FName, FPath FName = Cells(1, 2).Value & ".xlsx" 'имя файла FPath = Cells(2, 2).Value 'путь к файлу ' If Cells(1, 2).Value = "" Or Cells(1, 2).Value = "" Then Exit Sub Application.ScreenUpdating = 0 'проверяем открыть ли файл: если нет, тогда открываем If IsFileOpen(FPath & "\" & FName) = False Then Set wb = GetObject(FPath & "\" & FName) 'открываем скрыто Else: Set wb = Workbooks(FName) End If 'если имя файла соовпадает с этим файлом, тогда выходим If wb.Name = ThisWorkbook.Name Then Exit Sub
Set c = wb.Worksheets("Лист1").Range("A1:K20").Find("Заемщик", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.GoTo c, True With ThisWorkbook.Worksheets("Отчет") Range(Cells(ActiveCell.Row, ActiveCell.Column + 1), Cells(ActiveCell.Row + 3, ActiveCell.Column + 1)).Copy _ Destination:=.Cells(4, 2) 'копируем данные End With Else: ThisWorkbook.Worksheets("Отчет").Range("B4:B6").Value = "" End If ThisWorkbook.Activate 'закрываем файл без сохранении 'wb.Close 0 'если где та вылетить ошибка, тогда очищаем данные с ячеек "B4:B6" GoTo Ends: Errors1: ThisWorkbook.Worksheets("Отчет").Range("B4:B6").Value = "" Ends: Application.ScreenUpdating = 1 End Sub
'не удалять функцию: проверка открыта ли файл Function IsFileOpen(FilePathName As String) As Boolean Dim FN% FN = FreeFile On Error Resume Next Open FilePathName For Random Access Read Write Lock Read Write As FN Close FN IsFileOpen = Err <> 0 End Function
[/vba]
Этот для копировании остальных значений
[vba]
Code
Sub get2() Set c = Workbooks(Cells(4, 4) & ".xlsx").Worksheets("Резюме").Range("A6:AY20").Find("Программа кредитования:", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.GoTo c, True With ThisWorkbook.Worksheets("Compare") Cells(ActiveCell.Row, ActiveCell.Column + 12).Copy _ Destination:=.Cells(19, 3) 'копируем данные End With Else: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" End If ThisWorkbook.Activate 'если где та вылетить ошибка, тогда очищаем данные с ячеек "C18" GoTo Ends: Errors1: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" Ends: Application.ScreenUpdating = 1 End Sub
[/vba]
Этим запускал все макросы
[vba]
Code
Sub Click Call get1 Call get2 End Sub
[/vba]
В конце в последнем макросе добавил строчку, чтобы закрыть книгу откуда копировал т.к в начале в первом макросе ее открыли 'wb.Close 0
Есть один вопрос, как можно при копировании вставлять значения? (бывают значения в виде формул и при копировании копируются эти формулы)
В общем получилось следующее с помощью ABC, Этот макрос использовал в начале
[vba]
Code
Sub get1() 'On Error GoTo Errors1 'обработок ошибок Dim wb As Workbook, FName, FPath FName = Cells(1, 2).Value & ".xlsx" 'имя файла FPath = Cells(2, 2).Value 'путь к файлу ' If Cells(1, 2).Value = "" Or Cells(1, 2).Value = "" Then Exit Sub Application.ScreenUpdating = 0 'проверяем открыть ли файл: если нет, тогда открываем If IsFileOpen(FPath & "\" & FName) = False Then Set wb = GetObject(FPath & "\" & FName) 'открываем скрыто Else: Set wb = Workbooks(FName) End If 'если имя файла соовпадает с этим файлом, тогда выходим If wb.Name = ThisWorkbook.Name Then Exit Sub
Set c = wb.Worksheets("Лист1").Range("A1:K20").Find("Заемщик", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.GoTo c, True With ThisWorkbook.Worksheets("Отчет") Range(Cells(ActiveCell.Row, ActiveCell.Column + 1), Cells(ActiveCell.Row + 3, ActiveCell.Column + 1)).Copy _ Destination:=.Cells(4, 2) 'копируем данные End With Else: ThisWorkbook.Worksheets("Отчет").Range("B4:B6").Value = "" End If ThisWorkbook.Activate 'закрываем файл без сохранении 'wb.Close 0 'если где та вылетить ошибка, тогда очищаем данные с ячеек "B4:B6" GoTo Ends: Errors1: ThisWorkbook.Worksheets("Отчет").Range("B4:B6").Value = "" Ends: Application.ScreenUpdating = 1 End Sub
'не удалять функцию: проверка открыта ли файл Function IsFileOpen(FilePathName As String) As Boolean Dim FN% FN = FreeFile On Error Resume Next Open FilePathName For Random Access Read Write Lock Read Write As FN Close FN IsFileOpen = Err <> 0 End Function
[/vba]
Этот для копировании остальных значений
[vba]
Code
Sub get2() Set c = Workbooks(Cells(4, 4) & ".xlsx").Worksheets("Резюме").Range("A6:AY20").Find("Программа кредитования:", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.GoTo c, True With ThisWorkbook.Worksheets("Compare") Cells(ActiveCell.Row, ActiveCell.Column + 12).Copy _ Destination:=.Cells(19, 3) 'копируем данные End With Else: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" End If ThisWorkbook.Activate 'если где та вылетить ошибка, тогда очищаем данные с ячеек "C18" GoTo Ends: Errors1: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" Ends: Application.ScreenUpdating = 1 End Sub
[/vba]
Этим запускал все макросы
[vba]
Code
Sub Click Call get1 Call get2 End Sub
[/vba]
В конце в последнем макросе добавил строчку, чтобы закрыть книгу откуда копировал т.к в начале в первом макросе ее открыли 'wb.Close 0
Есть один вопрос, как можно при копировании вставлять значения? (бывают значения в виде формул и при копировании копируются эти формулы)Imba_Ra
Сообщение отредактировал Imba_Ra - Вторник, 04.12.2012, 23:17
Друзья подскажите как можно убрать расширение т.к сделать так чтобы можно было работать с любым расширением
Quote (Imba_Ra)
Sub get2() Set c = Workbooks(Cells(4, 4) & ".xlsx").Worksheets("Резюме").Range("A6:AY20").Find("Программа кредитования:", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.GoTo c, True With ThisWorkbook.Worksheets("Compare") Cells(ActiveCell.Row, ActiveCell.Column + 12).Copy _ Destination:=.Cells(19, 3) 'копируем данные End With Else: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" End If ThisWorkbook.Activate 'если где та вылетить ошибка, тогда очищаем данные с ячеек "C18" GoTo Ends: Errors1: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" Ends: Application.ScreenUpdating = 1 End Sub
И как в конце закрыть активную книгу, которая была открыта в первом макросе скрыта
Quote (Imba_Ra)
Set wb = GetObject(FPath & "\" & FName) 'открываем скрыто
Quote (Imba_Ra)
FName = Cells(1, 2).Value & ".xlsx" 'имя файла
Друзья подскажите как можно убрать расширение т.к сделать так чтобы можно было работать с любым расширением
Quote (Imba_Ra)
Sub get2() Set c = Workbooks(Cells(4, 4) & ".xlsx").Worksheets("Резюме").Range("A6:AY20").Find("Программа кредитования:", LookIn:=xlValues) 'Диапазон ячеек ГДЕ ищем If Not c Is Nothing Then Application.GoTo c, True With ThisWorkbook.Worksheets("Compare") Cells(ActiveCell.Row, ActiveCell.Column + 12).Copy _ Destination:=.Cells(19, 3) 'копируем данные End With Else: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" End If ThisWorkbook.Activate 'если где та вылетить ошибка, тогда очищаем данные с ячеек "C18" GoTo Ends: Errors1: ThisWorkbook.Worksheets("Compare").Range("C19").Value = "" Ends: Application.ScreenUpdating = 1 End Sub
И как в конце закрыть активную книгу, которая была открыта в первом макросе скрыта
Quote (Imba_Ra)
Set wb = GetObject(FPath & "\" & FName) 'открываем скрыто