Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
30 / 8 / 0
Регистрация: 30.09.2011
Сообщений: 33

Разбить строку на подстроки

22.01.2012, 18:48. Показов 4664. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например есть файл C:\Home\НТД\DH_15_12_13_16_00_18_00.xls
Как можно присвоить переменную следующим частям имени файла:
1. var1:= "DH";
2. var2:= "15_12_13_16_00_18_00".
Добавить к названию файла нужную часть можно этим кодом:

Visual Basic
1
F = ActiveWorkbook.Path & "\" & Left(WbMain.Name, Len(WbMain.Name) - 4) & " " & Date
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2012, 18:48
Ответы с готовыми решениями:

Разбить строку на одинаковые подстроки
Есть такая строка: Улицатакаято, д.99, корп., кв.77, Москва г, , Москва г, 500000, ,Улицатакаято, д.99, корп., кв.77, Москва г, , Москва...

Разбить текст в ячейке на подстроки
Есть прайс поставщика необходимо разбить текст в ячейке следушим образом. Шлейф Samsung X530 04953 Шлейф Samsung X530 с установочными...

Добавить в строку, подстроки, определённое количество раз
Всем привет, помогите дописать участок кода, необходимо добавить в подстроку определённое количество раз, при этом каждая подстрока разная ...

10
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.01.2012, 19:59
Переменную нельзя присвоить. Можно добать или присвоить ее значение к чему-то или присвоить переменной какое-то значение - что имеется в виду?
var1:= "DH"; - Паскаль?
WbMain.Name
WbMain - это объект Workbook или что?

Можно перефразировать
или дать образец названия которое Вы имеете с кодом, который его делает
и сами написать образец строки, которую Вы добиваетесь получить?

Если я правильно понял, то:

Visual Basic
1
F = ActiveWorkbook.Path & "\" & Left(WbMain.Name, Len(WbMain.Name) - 4) & " " & Date & var1 & ".xls"
Учтите, что расширение файла может не всегда иметь три буквы, в особенности Office >= 2007.
0
30 / 8 / 0
Регистрация: 30.09.2011
Сообщений: 33
23.01.2012, 14:16  [ТС]
Мне нужно, чтобы в имеющейся папке открывались все файлы формата "*.xls" c разными названиями. И чтобы их названия присваивались различным переменным. Например, имею папку 17_10_11 в ней четыре файла(к примеру) с названием TDK_RU_17_10_11.xls, TDK_DG_17_10_11.xls, TDK_TS_17_10_11.xls, TDK_ZR_17_10_11.xls. Я поэтому предположил, что можно выделить первые 5 символов у названия открывающихся файлов, т.к. они уникальны, присвоить их переменной и сделать проверку с if. С указанными 4мя файлами мне придется работать не открывая через диалоговое окно, поэтому мне нужно присвоить Workbook.name уникальным переменным. Есть ли другой способ реализации данной задачи?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.01.2012, 14:38
Так, уже более ясней.

Какая конечная цель всех этих действий:
1) Вы планируете вручную работать со всеми открывшимися файлами. Или
2) Вам нужно прочитать с каждого файла какую то информацию по определенному шаблону и потом где-то использовать...

Почему спрашиваю:
1) Если п.2, то есть возможность вообще прочитать информацию, не открывая файл.
2) Если п.1, то есть более простой способ получить имена всех файлов.
0
30 / 8 / 0
Регистрация: 30.09.2011
Сообщений: 33
23.01.2012, 16:40  [ТС]
Скорее п.2, но я писал программу, которая работает при открытом Workbook, а затем закрывает его и переходит к след. workbook. Но все названия файлов Workbook(Name)Worksheet(1) у меня имеют определенное имя, это не совсем удобно, т.к. приходится менять для каждого расчета имя файлов для другого режима.

Добавлено через 44 минуты
Вот нашел на форуме код, но мне нужно присвоить имя каждому открытому файлу, что нужно поправить?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub FreeBooksOpen()
    Dim MyName As String
    Dim MyPath As String
    Dim sPath As String ' тут вставил
        MyPath = "C:\Users\vti-unit\Desktop\Тепловые испытания\"
        MyName = Dir(MyPath & "*.xls")
         Do While MyName <> ""
            sPath = MyPath + MyName ' тут вставил
            Excel.Application.Workbooks.Open sPath ' тут изменил
            MyName = Dir
         Loop
End Sub
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.01.2012, 17:21
Тогда Вам нужна команда Dir. Ее использование очень специфическое для бейсика, не такое как в MS-DOS. Написал конструкцию, которой Вы сможете последовательно прочить каждое имя файла XLS:

1) в папке с макросом (тогда само имя книги с макросом исключается из чтения). Или
2) в другой папке, задав еще в переменной Folder.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub aa()
Dim myFile$, mask$, folder$
'folder - настраиваемый параметр. Задайте папку, где будем искать файлы по маске
'по умолчанию задана папка размещения документа Excel с этим макросом
folder = ThisWorkbook.Path 'например folder="c:\temp"
mask = folder + "\*.xls"
Do
    If mask <> "" Then
        myFile = Dir(mask) 'первый раз - задаем маску
        mask = ""
    Else: myFile = Dir 'второй и дальше читаем без маски
End If
If myFile = "" Then Exit Do 'если достигнут конец чтения - выйти с цикла
If myFile <> ThisWorkbook.Name Or folder <> ThisWorkbook.Path Then 'пропускаем эту книгу
    myFile = folder + "\" + myFile 'добавляем полное имя файла
    'вместо MsgBox выполняете нужные команды с именем файла "myFile"
    MsgBox myFile
End If
Loop While 1
End Sub
Вложения
Тип файла: xls GetFileName.xls (23.5 Кб, 11 просмотров)
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.01.2012, 17:26
Цитата Сообщение от morgen84 Посмотреть сообщение
присвоить имя каждому открытому файлу
Сорри, поздно увидел.

Так, нельзя присвоить открытой. Можно:
1) сохранить под новым именем. Или
2) Закрыть книгу и переименовать файл.
Что именно Вы хотите сдеолать?

Может Вам и не нужно открывать все файлы, а достаточно будет вышеизложенного кода и этой команды:
Visual Basic
1
2
3
4
5
6
7
8
'Пример из Help по VBA:
Dim OldName, NewName
OldName = "OLDFILE": NewName = "NEWFILE"    ' Определение имён
Name OldName As NewName    ' Переименование файла
 
OldName = "C:\MYDIR\OLDFILE": NewName = "C:\YOURDIR\NEWFILE"
Name OldName As NewName    ' Перемещение и переименование файла
'Переименуемый файл должен существовать и не должен быть открыт
Проверил - все работает.
0
30 / 8 / 0
Регистрация: 30.09.2011
Сообщений: 33
23.01.2012, 22:32  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Dim myFile$, mask$, folder$, foldermain$
foldermain = ThisWorkbook.Worksheets("Data").Range("B5")
mask = folder + "\" + foldermain + "\*.xls"
MsgBox mask
Do
    If mask <> "" Then
        myFile = Dir(mask) 
        mask = ""
    Else: myFile = Dir 
End If
If myFile = "" Then Exit Do 
If myFile <> ThisWorkbook.Name Or folder <> ThisWorkbook.Path Then 
    myFile = folder + "\" + foldermain + "\" + myFile 
   
    myName = Dir
    MsgBox myFile 
    MsgBox myName
    Excel.Application.Workbooks.Open myFile
    
Application.Run "'1.xls'!Лист6.Data_GT_11_10"
Application.Run "'1.xls'!Лист4.HRSG_11_10"
Application.Run "'1.xls'!Лист4.HRSG_11_11"
Application.Run "'1.xls'!Лист4.HRSG_11_12"
Application.Run "'1.xls'!Лист4.HRSG_11_13"
Application.Run "'1.xls'!Лист2.Data_ST_10"
Application.Run "'1.xls'!Лист2.Data_ST_11"
Application.Run "'1.xls'!Лист2.Data_ST_12"
Application.Run "'1.xls'!Лист7.Data_TFU_10"
Application.Run "'.xls'!Лист7.Data_TFU_11"
'Application.Run "'1.xls'!Лист9.Data_CCPP_10"
 
End If
        
    
Loop While 1
End Sub
myFile полный путь и название файла myName расходятся в имени. Можно ли сделать, чтобы myName было имя файла в пути myFile. И этот метод не совсем хорош, т.к. в каждом application.run у меня стоит оператор find по константе которой нет в других открываемых файлах. Программа будет работать, но придется проверять файлы в которых нет этих значений.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.01.2012, 22:57
Visual Basic
1
2
foldermain = ThisWorkbook.Worksheets("Data").Range("B5")
mask = folder + "\" + foldermain + "\*.xls"
- это не будет работать. Я же писал folder, зачем было менять на foldermain.
Чему по-Вашему сейчас равняется переменная folder? Dir - будет работать некорректно.

Visual Basic
1
myName = Dir
повторяется два раза. Так нельзя. Будет пропускать через раз по одному файлу.
Если хотите получить имя файла (а не полное имя файла) закомментируйте строку в моем примере:
Visual Basic
1
'myFile = folder + "\" + myFile
Полное имя требуется для того, чтобы его передать, например, в команду сохранения документа.

Чтобы написать код, у меня нет достаточно информации:
1) Что у Вас под Range("B5") - изменяемый путь к документам?
Цитата Сообщение от morgen84 Посмотреть сообщение
application.run у меня стоит оператор find по константе которой нет в других открываемых файлах
Это мне не о чем не говорит.
Так и не понятна конечная цель - открыть по очереди каждый документ в папке X, а затем произвести над ним действия с помощью макросов, записанных под именами 1.xls'!Лист6.Data_GT_11_10 ... и.т.д., а затем сохранить (под тем же именем? в той же папке?) и закрыть?

Можно как-нибудь "разжевать" ?
0
30 / 8 / 0
Регистрация: 30.09.2011
Сообщений: 33
23.01.2012, 23:27  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Dim myFile$, myFile1$, mask$, folder$, foldermain$
folder = ThisWorkbook.Path 'íàïðèìåð folder="c:\temp"
foldermain = ThisWorkbook.Worksheets("Data").Range("B5")
mask = folder + "\" + foldermain + "\*.xls"
MsgBox mask
Do
    If mask <> "" Then
        myFile = Dir(mask)
        mask = ""
    Else: myFile = Dir 
End If
If myFile = "" Then Exit Do 
If myFile <> ThisWorkbook.Name Or folder <> ThisWorkbook.Path Then 
    MsgBox myFile
    myFile1 = folder + "\" + foldermain + "\" + myFile
   
        MsgBox myFile1 
    MsgBox myFile
        Excel.Application.Workbooks.Open myFile1
    myName = ActiveWorkbook.Name
    MsgBox myName
    
 
'Application.Run .....
 
End If
        
    
Loop While 1
End Sub
Да все заработало, спасибо!! в B5 у меня название папки(их будет много), где будут хранится файлы за разные даты. А конечная цель открытие файла и взятие из них определенных значений. Я думаю для моих решений этого хватит и я сэкономлю кучу времени. А может все же можно, открывая файл присваивать ему myName = ActiveWorkbook.Name, а затем переходить к открытию следующего файла из одной папки по-моему примеру?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
24.01.2012, 01:46
Еще раз говорю:
Цитата Сообщение от Diskretor Посмотреть сообщение
присвоить открытой нельзя. Это Windows! Нельзя изменить имя открытого файла. Из-за неправильной терминологии я не могу понять суть задачи. Можно:
1) сохранить под новым именем. Или
2) Закрыть книгу и переименовать файл.
Во-первых, опять "открывая файл присваивать ему myName" (имя книги с этим макросом?) с какой целью?
(Ваш пример мне непонятен).

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

Ведь, если Вам всего лишь нужно прочитать данные со всех этих книг с одинаковых Range-й можно эти книги НЕ открывать вообще.

Не по теме:

Мне было бы интересно это реализовать. Так как я помогаю только ради практики и "тренировок" новых алгоритмов. Все, не буду оффтопить. Переходим на ЛС.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2012, 01:46
Помогаю со студенческими работами здесь

Разбить строку на символы
Вот собственно задание, не знаю как решить, нашел решение такое Sub main() Rows(2).ClearContents 'очистим вторую строку ...

Разбить строку на числа, разделенные пробелами
Всем доброго времени суток! Переменные типа String в виде строк состоят из десяти чисел. Числа в строке разделены одним пробелом. ...

Строку в ячейке разбить по разным ячейкам
В столбце А написаны ФИО, прежде чем экспортировать файл в Аксес, надо в новом файле написать эти ФИО по разным ячейкам. Сам пытался не...

Разбить строку на слова и вывести их в ячейки первого столбца
Суть задания: Разбить строку, введёную в первую ячейку первого столбца активного листа, на слова, и вывести их в ячейки первого столбца,...

Как разбить строку символов используя один разделитель.
Как разбить строку символов используя один разделитель. Например: Dim strTest As string Dim strTest_1 As string Dim strTest_2 As...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru