Спасибо Alex_ST за подсказку с использованием файлов.
У меня возник встречный вопрос Написан макрос [vba]
Code
Sub Макрос_тест131() Dim GetFileName GetFileName = Application.GetOpenFilename(FileFilter:="Книга MS Excel (*.xlsx;*.xls),*.xlsx", Title:="Выберите отчёт", MultiSelect:=False) If VarType(GetFileName) = vbBoolean Then Exit Sub ' если нажата "Отмена", то GetFileName = False ActiveCell.FormulaR1C1 = GetFileName End Sub
[/vba]
Он вставляет в выделенную пользователем ячейку, полный путь к файлу. Мне нужно этот файл использовать в формуле "ВПР", но при использовании в формуле, имя файла надо вводить [в квадратных скобках]. Подскажите как вычленить имя файла из строки и взять его в скобки.
Второй вопрос, в макросе Copy_ROWs_to_EXT_FILE, можно ли организовать функцию, что бы по окончании работы макроса, он сам сделал видимым файл-накопитель? Я пробовал прописывать в конце макроса строку Window(sDestDir).Visible = True Но нисего не происходит
Благодарю!
Спасибо Alex_ST за подсказку с использованием файлов.
У меня возник встречный вопрос Написан макрос [vba]
Code
Sub Макрос_тест131() Dim GetFileName GetFileName = Application.GetOpenFilename(FileFilter:="Книга MS Excel (*.xlsx;*.xls),*.xlsx", Title:="Выберите отчёт", MultiSelect:=False) If VarType(GetFileName) = vbBoolean Then Exit Sub ' если нажата "Отмена", то GetFileName = False ActiveCell.FormulaR1C1 = GetFileName End Sub
[/vba]
Он вставляет в выделенную пользователем ячейку, полный путь к файлу. Мне нужно этот файл использовать в формуле "ВПР", но при использовании в формуле, имя файла надо вводить [в квадратных скобках]. Подскажите как вычленить имя файла из строки и взять его в скобки.
Второй вопрос, в макросе Copy_ROWs_to_EXT_FILE, можно ли организовать функцию, что бы по окончании работы макроса, он сам сделал видимым файл-накопитель? Я пробовал прописывать в конце макроса строку Window(sDestDir).Visible = True Но нисего не происходит
Нашел решение для вставки адреса к файлу для функции ВПР
[vba]
Code
Dim i, reval sDestFile = Split(GetFileName, "\") For i = 0 To UBound(sDestFile) If i <> UBound(sDestFile) Then reval = reval & sDestFile(i) + "\" If i = UBound(sDestFile) Then reval = reval & "[" + sDestFile(UBound(sDestFile)) + "]" Next i Range("A7").Select ActiveCell.FormulaR1C1 = reval
[/vba]
Всё оказалось проще чем я думал.
Второй вопрос остался не решенным.
Нашел решение для вставки адреса к файлу для функции ВПР
[vba]
Code
Dim i, reval sDestFile = Split(GetFileName, "\") For i = 0 To UBound(sDestFile) If i <> UBound(sDestFile) Then reval = reval & sDestFile(i) + "\" If i = UBound(sDestFile) Then reval = reval & "[" + sDestFile(UBound(sDestFile)) + "]" Next i Range("A7").Select ActiveCell.FormulaR1C1 = reval
У меня сейчас аврал на работе, поэтому с ответом запоздал. Но я бы не стал так извращаться с циклом. Первое, что пришло на ум, по началу - то же, что и у Вас - разбить адрес на части в элементы массива по слэшам при помощи Split[vba]
Code
sDestFile = Split(GetFileName, "\")
[/vba] Но следующие шаги, ИМХО, должны быть типа[vba]
[/vba](не проверял, писал по памяти, но что-то типа того)
Quote (JustXXX)
Всё оказалось проще чем я думал
У меня сейчас аврал на работе, поэтому с ответом запоздал. Но я бы не стал так извращаться с циклом. Первое, что пришло на ум, по началу - то же, что и у Вас - разбить адрес на части в элементы массива по слэшам при помощи Split[vba]
Code
sDestFile = Split(GetFileName, "\")
[/vba] Но следующие шаги, ИМХО, должны быть типа[vba]
Alex_ST, Подскажите пожалуйста как где и что прописать в коде если меня не устраивает выделение области. Мне надо чтоб он работал чуть по другому например копировал заданный диапазон А1:G10» с листа под названием «отчет»
Alex_ST, Подскажите пожалуйста как где и что прописать в коде если меня не устраивает выделение области. Мне надо чтоб он работал чуть по другому например копировал заданный диапазон А1:G10» с листа под названием «отчет»dx84
Приветствую всех, авторам спасибо за функцию , очень интересная. 1) Хотел спросить, как можно задать постоянный адрес нахождения файла накопителя (не с листа) как в изначальном варианте, но уже с возможностью пользоваться откуда угодно? 2) И возможно-ли задать адрес файла свой для каждой строчки, чтоб при копировании каждая строчка попадала по прописанному на листе индивидуальному адресу? Есть мысль формировать динамический адрес (ВПР-ом + СЦЕПИТЬ) нахождения файла в зависимости от данных самой таблицы, и, предварительно создав дерево из файлов накопителей, вести пополняемую базу.
Приветствую всех, авторам спасибо за функцию , очень интересная. 1) Хотел спросить, как можно задать постоянный адрес нахождения файла накопителя (не с листа) как в изначальном варианте, но уже с возможностью пользоваться откуда угодно? 2) И возможно-ли задать адрес файла свой для каждой строчки, чтоб при копировании каждая строчка попадала по прописанному на листе индивидуальному адресу? Есть мысль формировать динамический адрес (ВПР-ом + СЦЕПИТЬ) нахождения файла в зависимости от данных самой таблицы, и, предварительно создав дерево из файлов накопителей, вести пополняемую базу.amiko
Сообщение отредактировал amiko - Вторник, 22.04.2014, 17:41
Выбранные строки копируются вместе с форматами и формулами. Естественно, если формула в строке ссылается на значения других строк, то возможны ошибки.
А как формула в ячейках другого листа другой книги по-Вашему может "подцепить" аргументы, оставшиеся в не скопированных ячейках старой книги? Продолжают работать, естественно, только формулы, ссылающиеся на ячейки-аргументы, копируемые вместе с ними.
Выбранные строки копируются вместе с форматами и формулами. Естественно, если формула в строке ссылается на значения других строк, то возможны ошибки.
А как формула в ячейках другого листа другой книги по-Вашему может "подцепить" аргументы, оставшиеся в не скопированных ячейках старой книги? Продолжают работать, естественно, только формулы, ссылающиеся на ячейки-аргументы, копируемые вместе с ними.Alex_ST
По второму вопросу - а что мешает Вам использовать не прописанный в коде адрес файла, а адрес, прописанный в определённой ячейке копируемой строки?Alex_ST
Спасибо за оперативный ответ. Особыми знаниями в VBA не обладаю, программировал раньше на других языках, недавно посмотрел что можно сделать с Excel при помощи VBA, очень заинтересовало, и стал по аналогии допиливать интересные проги. В первом вопросе я имел ввиду, что как можно во втором примере (в котором адрес прописывается в примечаниях) реализовать прописывание адреса накопителя в коде VBA как в первом примере из первого сообщения в теме. По второму вопросу, мне мешает то, что адрес задается только 1 для всего документа, а не построчно, и мало того, он даже не в ячейке, а в примечаниях.
Спасибо за оперативный ответ. Особыми знаниями в VBA не обладаю, программировал раньше на других языках, недавно посмотрел что можно сделать с Excel при помощи VBA, очень заинтересовало, и стал по аналогии допиливать интересные проги. В первом вопросе я имел ввиду, что как можно во втором примере (в котором адрес прописывается в примечаниях) реализовать прописывание адреса накопителя в коде VBA как в первом примере из первого сообщения в теме. По второму вопросу, мне мешает то, что адрес задается только 1 для всего документа, а не построчно, и мало того, он даже не в ячейке, а в примечаниях.amiko
Чтобы адреса файлов-накопителей динамически изменялись, нужно, чтобы в каждой строке эти адреса были где-то прописаны. Вот так попробуйте:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91083-16-1398248247 ' DateTime : 23.04.14, 14:17 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в ячейках копируемых строк листа файла-источника ' в тексте примечания пути к файлу-накопителю прописываются ВО ВТОРОЙ СТРОКЕ (после переноса строки) ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wb As Workbook, lb As Workbook Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю sLocDestPath = Range(sLocAddrCol & Selection(1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(1).Row).Value With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With On Error Resume Next Set wb = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wb = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель не доступен!": GoTo eXXit
Set lb = ThisWorkbook lr = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Selection.EntireRow.Copy wb.Sheets(1).Cells(lr + 1, 1) ' копирование wb.Close (True) ' закрыть с сохранением eXXit: With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wb = Nothing: Set lb = Nothing End Sub
[/vba]
Чтобы адреса файлов-накопителей динамически изменялись, нужно, чтобы в каждой строке эти адреса были где-то прописаны. Вот так попробуйте:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91083-16-1398248247 ' DateTime : 23.04.14, 14:17 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в ячейках копируемых строк листа файла-источника ' в тексте примечания пути к файлу-накопителю прописываются ВО ВТОРОЙ СТРОКЕ (после переноса строки) ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wb As Workbook, lb As Workbook Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю sLocDestPath = Range(sLocAddrCol & Selection(1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(1).Row).Value With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With On Error Resume Next Set wb = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wb = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель не доступен!": GoTo eXXit
Set lb = ThisWorkbook lr = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Selection.EntireRow.Copy wb.Sheets(1).Cells(lr + 1, 1) ' копирование wb.Close (True) ' закрыть с сохранением eXXit: With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wb = Nothing: Set lb = Nothing End Sub
Работает! Браво гуру! Единственный момент, он копирует по адресам только построчно, т.е. если выделить 2 строчки с разными адресами, то он скопирует их в один файл, адрес которого указан выше в столбе "А" (или "В" для сетевого доступа). Но чувствую интуитивно, если копировать несколько строчек одним макросом по разным адресам, то придется изменять все намного глубже, т.к. предусмотрена работа (открытие/копирования/сохранение+закрытие) только с одним накопителем. И еще, по каким источникам проще всего изучить принцип работы, синтаксис и функции VBA?
Работает! Браво гуру! Единственный момент, он копирует по адресам только построчно, т.е. если выделить 2 строчки с разными адресами, то он скопирует их в один файл, адрес которого указан выше в столбе "А" (или "В" для сетевого доступа). Но чувствую интуитивно, если копировать несколько строчек одним макросом по разным адресам, то придется изменять все намного глубже, т.к. предусмотрена работа (открытие/копирования/сохранение+закрытие) только с одним накопителем. И еще, по каким источникам проще всего изучить принцип работы, синтаксис и функции VBA?amiko