Уважаемые Товарищи! Прошу помочь в решение задачи касающиеся гиперссылок.
Есть заявки на обеспечение которые лежат на сетевом диске Z:\заявки\подразделение\дата в формате(год-месяц-число)пробел подразделение-номер заявки ( окончание которое изменяется)*
Окончание которое изменяется я имею ввиду что человек который сканирует заявки и раскладывает их по папкам называет окончание папки (Приборы, ножи, бумага и.д.) остальное все по однотипному принцепу.
И есть у меня файл куда забиваются данные, которые выглядят следующим образом
столбец-подразделение столбец-№заявки столбец- дата заявки ( в формат 10.12.2014)
Да как вот гиперссылку на данные папки исходя что часть названия папки известно и забита в таблицу эксель а про конец ничего не известно ( начало папки уникальное и неизменное)
И хотелось бы чтобы при нажатии по ячейки счет можно было бы выбрать счет который лежит в папке с заявкой.Чтобы открывалась папка заявки попросту говоря т.к. Документы ( чп. договора лежат в одной папке с заявкой)
Надеюсь на Вашу отзывчивость. [moder]Прочитайте п.2 Правил форума. О чем название Вашей темы? Конкретизируйте его.
Уважаемые Товарищи! Прошу помочь в решение задачи касающиеся гиперссылок.
Есть заявки на обеспечение которые лежат на сетевом диске Z:\заявки\подразделение\дата в формате(год-месяц-число)пробел подразделение-номер заявки ( окончание которое изменяется)*
Окончание которое изменяется я имею ввиду что человек который сканирует заявки и раскладывает их по папкам называет окончание папки (Приборы, ножи, бумага и.д.) остальное все по однотипному принцепу.
И есть у меня файл куда забиваются данные, которые выглядят следующим образом
столбец-подразделение столбец-№заявки столбец- дата заявки ( в формат 10.12.2014)
Да как вот гиперссылку на данные папки исходя что часть названия папки известно и забита в таблицу эксель а про конец ничего не известно ( начало папки уникальное и неизменное)
И хотелось бы чтобы при нажатии по ячейки счет можно было бы выбрать счет который лежит в папке с заявкой.Чтобы открывалась папка заявки попросту говоря т.к. Документы ( чп. договора лежат в одной папке с заявкой)
Надеюсь на Вашу отзывчивость. [moder]Прочитайте п.2 Правил форума. О чем название Вашей темы? Конкретизируйте его.Filmion
Filmion, я бы в меру своих знаний сделал как-то так. Уверен, что в формировании имени и пути где-то не попал, т.к. по Вашим описаниям не все конкретно указано.
[moder]Замечание устранено. Ответ открыт[/moder]
Filmion, я бы в меру своих знаний сделал как-то так. Уверен, что в формировании имени и пути где-то не попал, т.к. по Вашим описаниям не все конкретно указано.
[moder]Замечание устранено. Ответ открыт[/moder]EvgenyD
EvgenyD, что-то у вас все как-то "сложно" написано... Сделал попроще Переделал гиперссылки (чтоб при изменении путей не лазить в макросы) и написал маленькую UDF [vba]
Код
Function ПУТЬ(ByVal sPath As String) As String Dim i&, sDir$ i = InStrRev(sPath, Application.PathSeparator) If i Then sDir = Left$(sPath, i) ПУТЬ = sDir & Dir$(sPath, vbDirectory) End Function
[/vba] (теперь гиперссылки будут открывать папки, даже если потом поменять хвостик в имени)
чтобы при нажатии по ячейки счет можно было бы выбрать счет который лежит в папке с заявкой
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 7 Then Exit Sub If Target.Row = 1 Then Exit Sub ' эту строчку можно убрать, т.к. будет корректно работать и без этой проверки Dim p$: p = Target(, -1) & Application.PathSeparator Dim f$: f = Dir$(p & "Договор " & Target & ".*") If Len(f) Then Shell "explorer " & p & f, vbNormalFocus: Cancel = True End Sub
[/vba] Так, по двойному клику в ячейках столбца G, будут открываться файлы "Договор *.*", независимо от того, в каком формате они хранятся.
[p.s.]А если у вас все договоры хранятся в одном формате (например, в Word'овском), то можно чуть упростить [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 7 Then Exit Sub If Target.Row = 1 Then Exit Sub ' эту строчку можно убрать, т.к. будет корректно работать и без этой проверки Dim p$: p = Target(, -1) & Application.PathSeparator & "Договор " & Target & ".doc" If Len(Dir$(p)) Then Shell "explorer " & p, vbNormalFocus: Cancel = True End Sub
[/vba][/p.s.]
[p.s.]На всякий случай, в архиве структура каталогов, на которой все проверял.[/p.s.]
EvgenyD, что-то у вас все как-то "сложно" написано... Сделал попроще Переделал гиперссылки (чтоб при изменении путей не лазить в макросы) и написал маленькую UDF [vba]
Код
Function ПУТЬ(ByVal sPath As String) As String Dim i&, sDir$ i = InStrRev(sPath, Application.PathSeparator) If i Then sDir = Left$(sPath, i) ПУТЬ = sDir & Dir$(sPath, vbDirectory) End Function
[/vba] (теперь гиперссылки будут открывать папки, даже если потом поменять хвостик в имени)
чтобы при нажатии по ячейки счет можно было бы выбрать счет который лежит в папке с заявкой
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 7 Then Exit Sub If Target.Row = 1 Then Exit Sub ' эту строчку можно убрать, т.к. будет корректно работать и без этой проверки Dim p$: p = Target(, -1) & Application.PathSeparator Dim f$: f = Dir$(p & "Договор " & Target & ".*") If Len(f) Then Shell "explorer " & p & f, vbNormalFocus: Cancel = True End Sub
[/vba] Так, по двойному клику в ячейках столбца G, будут открываться файлы "Договор *.*", независимо от того, в каком формате они хранятся.
[p.s.]А если у вас все договоры хранятся в одном формате (например, в Word'овском), то можно чуть упростить [vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 7 Then Exit Sub If Target.Row = 1 Then Exit Sub ' эту строчку можно убрать, т.к. будет корректно работать и без этой проверки Dim p$: p = Target(, -1) & Application.PathSeparator & "Договор " & Target & ".doc" If Len(Dir$(p)) Then Shell "explorer " & p, vbNormalFocus: Cancel = True End Sub
[/vba][/p.s.]
[p.s.]На всякий случай, в архиве структура каталогов, на которой все проверял.[/p.s.]KSV
чтобы при нажатии по ячейки счет можно было бы выбрать счет который лежит в папке с заявкой Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 7 Then Exit Sub If Target.Row = 1 Then Exit Sub ' эту строчку можно убрать, т.к. будет корректно работать и без этой проверки Dim p$: p = Target(, -1) & Application.PathSeparator Dim f$: f = Dir$(p & "Договор " & Target & ".*") If Len(f) Then Shell "explorer " & p & f, vbNormalFocus: Cancel = True End Sub Так, по двойному клику в ячейках столбца G, будут открываться файлы "Договор *.*", независимо от того, в каком формате они хранятся.
Вот это почему то не работает, при двойном нажатии по столбцу G не открываются файлы и папки с файлами тоже не открываются. Столбец Е вроде работает.
По поводу файлов:
1.Договора которые лежат в папке с заявкой хранятся в PDF формате. 3. В одной папке с заявкой лежат: a. сама заявка б. договора ( ни один их несколько.)
Итак столбец: С - это сама заявка которая лежит в папке с заявкой на которую вы сделали ссылку ( называется врать не буду по моему также как папка) G - Счета, договора.
Было бы хорошо если не пришлось пользователей строго заставлять называть файлы согласно какому то алгоритму (люди ошибаются, человеческий фактор) Договора как правила называют номером договора, датой и поставщиком. ( называют по разному Пример: Сч. №777 от 12.12.2012 - ООО Медиа, Сч. №777 от 12.12.12 - Медиа,) самое неизменное тут номер договора и номер заявки.
Вечером приду постараюсь детально просмотреть что Вы написали и детально описать проблемы. Эксель с помощью VBA творит чудеса.
чтобы при нажатии по ячейки счет можно было бы выбрать счет который лежит в папке с заявкой Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 7 Then Exit Sub If Target.Row = 1 Then Exit Sub ' эту строчку можно убрать, т.к. будет корректно работать и без этой проверки Dim p$: p = Target(, -1) & Application.PathSeparator Dim f$: f = Dir$(p & "Договор " & Target & ".*") If Len(f) Then Shell "explorer " & p & f, vbNormalFocus: Cancel = True End Sub Так, по двойному клику в ячейках столбца G, будут открываться файлы "Договор *.*", независимо от того, в каком формате они хранятся.
Вот это почему то не работает, при двойном нажатии по столбцу G не открываются файлы и папки с файлами тоже не открываются. Столбец Е вроде работает.
По поводу файлов:
1.Договора которые лежат в папке с заявкой хранятся в PDF формате. 3. В одной папке с заявкой лежат: a. сама заявка б. договора ( ни один их несколько.)
Итак столбец: С - это сама заявка которая лежит в папке с заявкой на которую вы сделали ссылку ( называется врать не буду по моему также как папка) G - Счета, договора.
Было бы хорошо если не пришлось пользователей строго заставлять называть файлы согласно какому то алгоритму (люди ошибаются, человеческий фактор) Договора как правила называют номером договора, датой и поставщиком. ( называют по разному Пример: Сч. №777 от 12.12.2012 - ООО Медиа, Сч. №777 от 12.12.12 - Медиа,) самое неизменное тут номер договора и номер заявки.
Вечером приду постараюсь детально просмотреть что Вы написали и детально описать проблемы. Эксель с помощью VBA творит чудеса.Filmion
по столбцу G не открываются файлы и папки с файлами тоже не открываются
Поэтому я и приложил архив со структурой каталогов диска Z, такой, как я ее понял из вашего описания (хотя, по-хорошему, это вы должны были приложить подобный архив со своей структурой и несколькими файлами (можно пустыми, лишь было понятно, как они у вас называются, хотя бы примерно), лежащими в ваших папках, в качестве примера, чтоб мы не гадали, что у вас, да как). Разархивируйте мой архив в корень какого-нибудь диска, например D, замените в гиперссылке букву диска с Z на D, и попробуйте, чтобы понять что и как работает в примере.
[/vba] если PDF-файл, начинающийся на "Сч.", в каждой папке только один. Короче, только вы знаете, как у вас называются (или могут называться) файлы, а мы не экстрасенсы.
по столбцу G не открываются файлы и папки с файлами тоже не открываются
Поэтому я и приложил архив со структурой каталогов диска Z, такой, как я ее понял из вашего описания (хотя, по-хорошему, это вы должны были приложить подобный архив со своей структурой и несколькими файлами (можно пустыми, лишь было понятно, как они у вас называются, хотя бы примерно), лежащими в ваших папках, в качестве примера, чтоб мы не гадали, что у вас, да как). Разархивируйте мой архив в корень какого-нибудь диска, например D, замените в гиперссылке букву диска с Z на D, и попробуйте, чтобы понять что и как работает в примере.
[/vba] если PDF-файл, начинающийся на "Сч.", в каждой папке только один. Короче, только вы знаете, как у вас называются (или могут называться) файлы, а мы не экстрасенсы.KSV
[moder]Не нужно цитировать весь пост. Об этом в Правилах форума написано[/moder]
Уважаемый KSV! Приношу свои извинения за плохой подход к вопросу. Вот ссылка на архив с нашей структурой и файлами и таблицей экселя: https://drive.google.com/file....sharing Загрузить на сайт не получилось т.к. весит он больше 100кб. ( Надеюсь администрация меня за это не накажет)
Надеюсь теперь вы сможете мне помочь.
прикрутить из вашего примера в свою рабочую таблицу у меня не получилось,т.к.: 1.путь до файлов не совсем такой как я написал изначально
Я поигрался с гиперссылкой и при вычисление формулы поэтапно у меня не срабатывала последнее &[@[Исх_№]]&"*" т.е. как я понимаю окончания папок ( самый последний этап вычисления мне выдавало ошибку и давала ссылку на корень с папками) (Модуль вроде прикрутил =ПУТЬ начал появляться.)
Теперь надеюсь на Вашу помощь в уже более конкретизированном вопросе.
Цеха кстати тоже пишут порой по разному. Но данную проблему я решу проверкой данных из раскрывающегося списка. С поставщиками если понадобится тоже проделаю такую операцию. С уважением, Filmion
[moder]Не нужно цитировать весь пост. Об этом в Правилах форума написано[/moder]
Уважаемый KSV! Приношу свои извинения за плохой подход к вопросу. Вот ссылка на архив с нашей структурой и файлами и таблицей экселя: https://drive.google.com/file....sharing Загрузить на сайт не получилось т.к. весит он больше 100кб. ( Надеюсь администрация меня за это не накажет)
Надеюсь теперь вы сможете мне помочь.
прикрутить из вашего примера в свою рабочую таблицу у меня не получилось,т.к.: 1.путь до файлов не совсем такой как я написал изначально
Я поигрался с гиперссылкой и при вычисление формулы поэтапно у меня не срабатывала последнее &[@[Исх_№]]&"*" т.е. как я понимаю окончания папок ( самый последний этап вычисления мне выдавало ошибку и давала ссылку на корень с папками) (Модуль вроде прикрутил =ПУТЬ начал появляться.)
Теперь надеюсь на Вашу помощь в уже более конкретизированном вопросе.
Цеха кстати тоже пишут порой по разному. Но данную проблему я решу проверкой данных из раскрывающегося списка. С поставщиками если понадобится тоже проделаю такую операцию. С уважением, FilmionFilmion
Сообщение отредактировал _Boroda_ - Понедельник, 24.08.2015, 23:55
Сделал обработку дабл-кликов в ячейках столбцов C и K, и поиск соответствующих файлов в подкаталоге "Приобретение". С остальными файлами и подкаталогами даже не разбирался (доделаете по образу и подобию). Проверил поверхностно, но, теоретически, должно обрабатывать большинство ваших несоответствий в наименованиях. Код получился побольше из-за проверок на возможное отсутствие данных, необходимых для формирования пути и имени файла (если какие-то необходимые данные отсутствуют, то будет выдано сообщение и активирована соответствующая ячейка).
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim c&: c = Target.Column If c <> 3 And c <> 11 Then Exit Sub If Target.Row < 3 Then Exit Sub If Len(Target) = 0 Then Exit Sub Cancel = True Dim m$, n$, d$, p$, f$ Set Target = Target.EntireRow.Cells(, 4) ' Дата исх. d = Target If IsDate(d) Then p = "D:\300-Инструментальный комплекс\Документы 300\009 Документы\02-07-03 Заявки на инструмент\" & Year(d) & "\" Set Target = Target(, -1) ' Цех n = Target If Len(n) Then m = p & "*" & n & "-*" f = Dir$(m, vbDirectory) If Len(f) Then p = p & f & "\Приобретение\" Set Target = Target(, 2) ' Исх № f = Target If Len(f) Then m = p & Format$(d, "yyyy-mm-dd") & "*" & n & "*" & f & " *" f = Dir$(m, vbDirectory) If Len(f) Then p = p & f & "\" If c = 11 Then Set Target = Target(, 9): f = "* " & Target & " *" m = p & f & ".pdf" f = Dir$(m) If Len(f) Then Shell "explorer " & p & f, vbNormalFocus Exit Sub Else m = "файл: " & vbCr & m End If Else m = "каталог:" & vbCr & m End If Else m = [C2] ' Исх № End If Else m = "каталог:" & vbCr & m End If Else m = [B2] ' Цех End If Else m = [D2] ' Дата исх. End If MsgBox "Отсутствует " & m, vbExclamation, "Документ не найден" Target.Select End Sub
[/vba]
А вообще, по-хорошему, нужно не базу подгонять к кривой структуре, а лучше сразу продумать нормальную структуру уровней и имен, стандартизировать данные в БД (и в дальнейшем проверять/корректировать их еще ПРИ ВВОДЕ), и имена каталогов и файлов привести в строгое соответствие данным БД. Иначе вам придется все время дописывать код, чтобы обрабатывать все новые и новые несоответствия, которые будут допускать пользователи, а их "фантазия" безгранична.
Сделал обработку дабл-кликов в ячейках столбцов C и K, и поиск соответствующих файлов в подкаталоге "Приобретение". С остальными файлами и подкаталогами даже не разбирался (доделаете по образу и подобию). Проверил поверхностно, но, теоретически, должно обрабатывать большинство ваших несоответствий в наименованиях. Код получился побольше из-за проверок на возможное отсутствие данных, необходимых для формирования пути и имени файла (если какие-то необходимые данные отсутствуют, то будет выдано сообщение и активирована соответствующая ячейка).
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim c&: c = Target.Column If c <> 3 And c <> 11 Then Exit Sub If Target.Row < 3 Then Exit Sub If Len(Target) = 0 Then Exit Sub Cancel = True Dim m$, n$, d$, p$, f$ Set Target = Target.EntireRow.Cells(, 4) ' Дата исх. d = Target If IsDate(d) Then p = "D:\300-Инструментальный комплекс\Документы 300\009 Документы\02-07-03 Заявки на инструмент\" & Year(d) & "\" Set Target = Target(, -1) ' Цех n = Target If Len(n) Then m = p & "*" & n & "-*" f = Dir$(m, vbDirectory) If Len(f) Then p = p & f & "\Приобретение\" Set Target = Target(, 2) ' Исх № f = Target If Len(f) Then m = p & Format$(d, "yyyy-mm-dd") & "*" & n & "*" & f & " *" f = Dir$(m, vbDirectory) If Len(f) Then p = p & f & "\" If c = 11 Then Set Target = Target(, 9): f = "* " & Target & " *" m = p & f & ".pdf" f = Dir$(m) If Len(f) Then Shell "explorer " & p & f, vbNormalFocus Exit Sub Else m = "файл: " & vbCr & m End If Else m = "каталог:" & vbCr & m End If Else m = [C2] ' Исх № End If Else m = "каталог:" & vbCr & m End If Else m = [B2] ' Цех End If Else m = [D2] ' Дата исх. End If MsgBox "Отсутствует " & m, vbExclamation, "Документ не найден" Target.Select End Sub
[/vba]
А вообще, по-хорошему, нужно не базу подгонять к кривой структуре, а лучше сразу продумать нормальную структуру уровней и имен, стандартизировать данные в БД (и в дальнейшем проверять/корректировать их еще ПРИ ВВОДЕ), и имена каталогов и файлов привести в строгое соответствие данным БД. Иначе вам придется все время дописывать код, чтобы обрабатывать все новые и новые несоответствия, которые будут допускать пользователи, а их "фантазия" безгранична.KSV
Все работает, спасибо! Я позже задам вопрос по данному VBA. А Вас обязательно поблагодарю. [moder]А пока замечание Вам за игнорирование указаний администрации. Очередное излишнее цитирование удалил
Все работает, спасибо! Я позже задам вопрос по данному VBA. А Вас обязательно поблагодарю. [moder]А пока замечание Вам за игнорирование указаний администрации. Очередное излишнее цитирование удалилFilmion