Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
1

Как открыть файл, опираясь только на его расширение?

08.02.2018, 16:24. Просмотров 3299. Ответов 14
Метки нет (Все метки)

Здравствуйте, уважаемые пользователи форума! Спасибо, что помогаете! Желаю всем счастья!

Очень буду благодарен, если подскажете как открывать файл, независимо от его названия (MindMap (Excel).xml или MM (Ex) (проба).xml и т.д.), опираясь только на расширение .xml, с помощью макроса в текущем открытом файле Excel. Он находится в той же папке, что и вспомогательный файл, который нужно периодически открывать, и является единственным на ноутбуке с таким расширением. После открытия вспомогательного файла нужно скопировать лист (он там единственный), закрыть файл, вставить скопированный лист вместо 2-го листа открытого файла. Уже обращался на подобную тему в другой форум: http://www.............. index.php?topic=5486.0. Там мне практически помогли. Осталось скомбинировать 2 макроса.
Скидываю ссылку из OneDrive на папку с 2 файлами (https://1drv.ms/f/s!AiLfFp_9DgAOgtdLjFXBfowbZLa8Kg) как пример (только вместо .xml будет .xlsx), но суть одна: возможность вместо MindMap (Excel) использовать разные названия.

Благодарю всех, прочитавших тему!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2018, 16:24
Ответы с готовыми решениями:

Как открыть файл как приложение который не EXE (изменено только расширение)
У меня есть приложение,но у него расширение не .exe ,а .SAAQN ,и мне надо,что бы оно запускалось...

Как ассоциировать расширение со своим приложением и открыть файл своей программой
На последней стадии реализации своей программы задался вопросом. А как сделать так, что бы при...

Не удается открыть файл, так как формат или расширение файла являются недопустимыми
Пытаюсь открыть файл, позже появляется окно, в котором написано : не удается открыть файл, так как...

Как скачать файл с сайта зная только часть файла и расширение?
Возможно ли скачать файл зная только часть файла и расширение? Или это доступ к каталогу ножен где...

14
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
08.02.2018, 20:01 2
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim p$, f$, ws As Worksheet
 
For Each ws In ThisWorkbook.Worksheets
    If LCase(ws.Name) = "freemind sheet" Then
       Application.DisplayAlerts = False
       ws.Delete
       Application.DisplayAlerts = True
       Exit For
    End If
Next
 
p = ThisWorkbook.Path & "\"
f = Dir(p & "*.xlsx")
 
If f = "" Then Exit Sub
 
With Workbooks.Open(p & f, 0)
     'Здесь можете работать с открытой книгой
End With
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
09.02.2018, 11:43  [ТС] 3
БРАВО!!!
https://image.ibb.co/goFbdx/image.jpg
Есть же всё-таки настоящие профессионалы!!!
Благодарю от всей души!
https://thumb.ibb.co/h9iptm/Gratitude.jpg
И, вообще, Павел - это моё самое любимое имя! Меня с этим именем многое связывает. Это, действительно, мистика: только Павел смог мне помочь... Огромное спасибо!!!

Добавлено через 14 минут
https://image.ibb.co/fqBxYx/image.jpg
 Комментарий модератора 
Ознакомьтесь с правилами форума:
Если какой-либо пост на форуме показался вам полезным, то вы можете выразить свою благодарность, нажав кнопку "Спасибо" внизу самого поста.

Картинки и любые другие файлы загружайте на форум, во избежание их удаления или потери на сторонних ресурсах. По этой же причине коды программ также должны находиться на форуме.

Запрещено публиковать ссылки на другие форумы


Добавлено через 13 часов 20 минут
Извините, пожалуйста
0
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
09.02.2018, 19:58 4
RedC, Если открываемый файл содержит всего один рабочий лист, который и нужно скопировать, то можно обойтись без всех этих действий, ибо Excel (за исключением Excel 365) позволяет просто импортировать лист(ы), т.е. вместо строк 17-19 достаточно :

Visual Basic
1
ThisWorkbook.Sheets.Add , ThisWorkbook.Sheets(1), , p & f
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
09.02.2018, 21:48  [ТС] 5
Спасибо!
Сейчас буду разбираться
Можете также просветить для общего развития по поводу Dir(p & "*.xlsx") ?
Это, как я понимаю, ключевое звено.
Как я понимаю, Dir(...) - это имя моего файла: MM (Ex) (проба).xml
а то, что внутри Dir (p & "*.xml") - это C:\Users\kznts\OneDrive\Телемаркетинг\Проба\MM (Ex) (проба).xml
Т.е. она как бы отчленяет имя файла от всего этого пути.
p - это C:\Users\kznts\OneDrive\Телемаркетинг\Проба\
Что означает "*.xml"
Точнее, сама звёздочка (*)?

Мне очень приятно, что эта тема Вас затронула: Вы даже материализовали мысли, пронёсшиеся сквозь сутки. Я тоже думал об этом... Мы с Вами на одной волне ~
Счастья Вам!!!

Добавлено через 5 минут
Не понимаю: когда нажимаю "Лучший ответ", появляется "Это не ответ".

Добавлено через 7 минут
Подскажите, пожалуйста, как оставить Вам отзыв и выразить большую благодарность с помощью инструментов этого форума?
0
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
09.02.2018, 21:52 6
Лучший ответ Сообщение было отмечено RedC как решение

Решение

p это папка, где находится текущая книга, т.е. книга, содержащая выполняющийся макрос
* это символ подстановки, означающий любое количество символов

а функция Dir (которая поддерживает использование символов подстановки) возвратит первый найденный файл в указанной папке p, имя которого неизвестно * , но расширение указано как ".xlsx"


Цитата Сообщение от RedC Посмотреть сообщение
появляется "Это не ответ"
Так правильно, что появляется ибо импорт листов осуществляется из рабочей книги, и он не должен работать с файлами "*.xml", ибо это не книги
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
10.02.2018, 14:16  [ТС] 7
Фактически, сейчас код такой:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub Новая_карта()
Dim a, p, f As String
Dim ws As Worksheet
'a - название текущей (целевой) книги (в данном случае - "Телемаркетинг.xlsm")
a = ActiveWorkbook.Name
For Each ws In ThisWorkbook.Worksheets
 If ws.Name = "FreeMind Sheet" Then
  Application.DisplayAlerts = False
  ws.Delete 'Удаление листа
  Application.DisplayAlerts = True
  Exit For
 End If
Next ws
p = ThisWorkbook.Path & "\"
f = Dir(p & "*.xml")
If f = "" Then Exit Sub
ThisWorkbook.Sheets.Add , ThisWorkbook.Sheets(1), , p & f
End Sub
Павел, Вы сказали, что
Цитата Сообщение от pashulka Посмотреть сообщение
импорт листов осуществляется из рабочей книги, и он не должен работать с файлами "*.xml", ибо это не книги
Но у меня получается и с .xml, этот файл создаю следующим образом: создаю обычный Excel-файл, открываю его, нажимаю файл - Сохранить копию - выбираю "Таблица XML 2003 (*.xml)"
В принципе, всё работает. Конечно, на сколько я знаю, в VBA много чего может всё равно работать даже если где-то какая-то оплошность. Хотелось бы профессиональной эстетики кода.
0
Миниатюры
Как открыть файл, опираясь только на его расширение?  
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
10.02.2018, 14:35  [ТС] 8
И если не сложно, можете объяснить как работает эта строка кода?
Код
ThisWorkbook.Sheets.Add , ThisWorkbook.Sheets(1), , p & f
Не встречался ещё с такой конструкцией. Для чего нужны 2 запятые, разделённые пробелом?
0
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
10.02.2018, 15:19 9
Лучший ответ Сообщение было отмечено RedC как решение

Решение

Зачем править чужой код, даже ещё с ошибками ?

Visual Basic
1
2
Dim a, p, f As String
a = ActiveWorkbook.Name
Переменная a вообще не используется, но главное, что p это тоже string, поэтому

Visual Basic
1
Dim p$, f$
или

Visual Basic
1
Dim p As String, f As String
А та строка должна "импортировать" все листы из указанной книги. Правда, если в книге попадётся скрытый лист, то, по памяти - возникнет ошибка при попытке его импорта.

A если Вы запутались в аргументах метода Add, то просто используйте :

Visual Basic
1
ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(1), Type:=p & f
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
10.02.2018, 15:59  [ТС] 10
Спасибо огромное за быстрый ответ!
Т.е., фактически,
Код
ThisWorkbook.Sheets.Add , ThisWorkbook.Sheets(1), , p & f
и
Код
ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(1), Type:=p & f
- это одно и то же?

Добавлено через 29 минут
Извините за глупый вопрос: это одно и то же, я понял.
Фактически, получается изучать VBA по форумам. Вы принесёте большую пользу, и буду Вам очень благодарен , если раскроете суть этой конструкции , чтобы её можно было бы применять и в других случаях. Итак,
Код
ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(1), Type:=p & f
Смысл ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(1) понятен: вставляем лист в рабочей книге после 1-го листа. Что происходит после запятой? Хотелось бы проникнуться более глубоким смыслом происходящего , если Вас не затруднит.
0
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
10.02.2018, 16:02 11
Да, только в первом случае передача параметров осуществляется по позиции, а во втором по имени.

Если используется первый вариант, то необходимо строго соблюдать позицию аргумента

т.е. у метода Add четыре необязательных аргумента Add(Before, After, Count, Type) нам нужны только два After и Type, поэтому ненужные мы просто пропустим

Visual Basic
1
2
3
псевдокод:
 
ThisWorkbook.Sheets.Add [не_используется], ThisWorkbook.Sheets(1), [не_используется], Путь_к_файлу
Если используется второй вариант, то соблюдать позицию аргумента вовсе не обязательно, т.к. используется имя аргумента, что нагляднее, ибо имена, как правило, несут смысловую нагрузку. Но и более затратно по времени (разумеется, имеется ввиду использование в цикле)

Visual Basic
1
ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(1), Type:=Путь_к_файлу
но можно и

Visual Basic
1
ThisWorkbook.Sheets.Add Type:=Путь_к_файлу, After:=ThisWorkbook.Sheets(1)
0
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
10.02.2018, 17:24  [ТС] 12
Я не программист, но немного могу пользоваться VBA. Поэтому такие вопросы.

Добавлено через 8 минут
Даже не знаю, как Вас отблагодарить!
Милости Кришны и Шрилы Прабхупады!
Харе Кришна!

Добавлено через 2 минуты
Огромное Спасибо!

Добавлено через 12 минут
Вы отличный профессионал! Восхищаюсь Вами! И всё Вы это делаете абсолютно бескорыстно! За это Кришна повышает Ваше благочистивую карму! Вы необъяснимым образом способны внедрить знание в голову неведже! У Вас явно телепатические способности! Вы можете их ещё больше развивать!

Добавлено через 3 минуты
Харибол!!!

Добавлено через 42 минуты
И ещё маленький вопросик, если не затруднит: Type - это всегда путь к файлу или это частный случай? Если частный случай, то можете привести парочку наиболее распространённых примеров его значения, применительно к подобным макросам?
0
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
10.02.2018, 18:02 13
Лучший ответ Сообщение было отмечено RedC как решение

Решение

Цитата из офисной справки :

Add Method (Sheets Collection)

Creates a new worksheet, chart, or macro sheet.

Syntax

expression.Add(Before, After, Count, Type)

expression Required. An expression that returns a Sheets object.

Before Optional Variant. An object that specifies the sheet before which the new sheet is added.

After Optional Variant. An object that specifies the sheet after which the new sheet is added.

Count Optional Variant. The number of sheets to be added. The default value is one.

Type Optional Variant. Specifies the sheet type. Can be one of the following XlSheetType constants: xlWorksheet, xlChart, xlExcel4MacroSheet, or xlExcel4IntlMacroSheet. The default value is xlWorksheet.

Remarks

If Before and After are both omitted, the new sheet is inserted before the active sheet.

О чём умолчала справка :
- кроме вышеперечисленных констант (типов) можно использовать xlDialogSheet (диалоговые листы сейчас заменены на userform и информация о них скрыта, ибо dialogsheet устарели) и xlModule (этот финт позволяет создать лист модуля, тоже устарел, однако, начиная с версии 97 он будет отображать как стандартный модуль, а главное, его можно создать, даже при отсутствии доверенного доступа к VBProject)
- и собственно можно указать книгу в качестве источника листов. Эта возможность хоть и не описана, но зато этот секрет выдаётся макрорекордером(запись макроса)
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 10
10.02.2018, 18:41  [ТС] 14
Спасибо! Совсем запамятовал, что есть F1 Пользуюсь, в основном, интернетом. Нравится сайт: https://msdn.microsoft.com/ru-ru/vba/index

Добавлено через 9 минут
Т.е., как я понимаю, в type мы указали книгу (путь к ней) в качестве источника листов. Так?

Добавлено через 8 минут
Да, хотя у неё и расширение .xml и это как бы не книга, но, как описывал выше, я её делаю из Excel путём сохранения как "Таблица XML 2003 (*.xml)"
Потом полученная "Таблица XML 2003 (*.xml)" открывается с помощью Excel и внешне ничем не отличается: те же листы, ячейки и т.д.
Это нормально?
0
4110 / 2217 / 938
Регистрация: 01.12.2010
Сообщений: 4,625
10.02.2018, 19:31 15
Для новых версий нормально, тем более, что этот файл Вы же и создаёте.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2018, 19:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как открыть только что закрытый файл
Решаю задачу с ней проблем нет, проблема возникла в том что не понимаю как открыть файл (в 45...

Открыть файл для чтения, а если его нет, то создать его и открыть для записи
Здравствуйте! Подскажите, как сделать программу, чтобы она открывала файл для чтения, а если его...

Попытка открыть файл типа расширение приложения (dll)
выскакивает табличка -попытка открыть файл типа расширение приложения (dll)

Открыть новую форму опираясь на данные авторизации
Есть главная форма авторизации... Мне нужно открыть новую форму опираясь на данные авторизации?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.