Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Выбор места запуска кода по значению в ячейке - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Выбор места запуска кода по значению в ячейке (Макросы/Sub)
Выбор места запуска кода по значению в ячейке
Leviven Дата: Вторник, 25.08.2020, 11:04 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Уважаемые форумчане, добрый день! Написал макрос по обновлению файлов с данными. Он состоит из одинаковых модулей-дней - их 365. Проблема в том, что не нужно запускать обновление с 1 января по 31 декабря. Это может быть произвольная дата, которая выбрана в окошке "Следующая дата". Как запускать код обновления с этой даты? Например, выбрана следующая дата - 2 января. Код запустится с блока 2 января. Выбрано 15 июня - с 15 июня.
К сообщению приложен файл: Obnova.xlsm (19.4 Kb)
 
Ответить
СообщениеУважаемые форумчане, добрый день! Написал макрос по обновлению файлов с данными. Он состоит из одинаковых модулей-дней - их 365. Проблема в том, что не нужно запускать обновление с 1 января по 31 декабря. Это может быть произвольная дата, которая выбрана в окошке "Следующая дата". Как запускать код обновления с этой даты? Например, выбрана следующая дата - 2 января. Код запустится с блока 2 января. Выбрано 15 июня - с 15 июня.

Автор - Leviven
Дата добавления - 25.08.2020 в 11:04
прохожий2019 Дата: Вторник, 25.08.2020, 17:51 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1244
Репутация: 317 ±
Замечаний: 0% ±

365 Beta Channel
а просто циклом нельзя?[vba]
Код
Dim d, y

d ' некая дата
y = Year(d)
Do

iPath = "D:\METOD\ÄÂÈÆÅÍÈÅ\2020\Data\" & Format(d, "MMMM") & "\"
iFileName = Dir(iPath & Format(d, "DD_M") & ".xlsm")

' остальной код

d = d + 1
Loop While Year(d) = y
[/vba]
 
Ответить
Сообщениеа просто циклом нельзя?[vba]
Код
Dim d, y

d ' некая дата
y = Year(d)
Do

iPath = "D:\METOD\ÄÂÈÆÅÍÈÅ\2020\Data\" & Format(d, "MMMM") & "\"
iFileName = Dir(iPath & Format(d, "DD_M") & ".xlsm")

' остальной код

d = d + 1
Loop While Year(d) = y
[/vba]

Автор - прохожий2019
Дата добавления - 25.08.2020 в 17:51
Leviven Дата: Среда, 26.08.2020, 09:01 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
прохожий2019, в таблице нет года. И значение dd_m - это не формат даты, а сцепка в ячейке Y2 выбранных значений из ячеек V2 и W2. Скажем так, аналог даты, выбираемый пользователем. Если бы можно было задать ячейке Y2 переменную, а в коде поставить "якори", к которым код обращается, но не знаю как. К примеру, в батнике это легко можно было бы организовать по принципу: [vba]
Код

@echo off
Set m = Y2

If m = 01_1 Goto 02_1a
Else
Goto 01_1a

If m = 02_1 Goto 03_1a
Else
Goto 01_1a

If m = 03_1 Goto 04_1a
Else
Goto 01_1a

Rem и так до конца - Goto 12_31a

Rem продолжение кода

Goto: 01_1a
Start "" "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\02_01.xlsm"

Goto: 02_1a
Start "" "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\03_01.xlsm"

Rem и так до конца кода - Goto: 12_31a

Exit/b
[/vba]

где Y2 - значение ячейки Y2 в файле Obnova.xlsm.

Но как это реализовать в VBA? Вот в этом:
[vba]
Код
Sub upds()
'начало обновления со 2-го января

Dim iPath$, iFileName$
'2 января
iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\"
iFileName = Dir(iPath & "02_1.xlsm")
If iFileName <> "" Then

Application.ScreenUpdating = False
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\02_1.xlsm")
Application.Visible = False
Application.Run "02_1.xlsm!Executive.cont_02_1": Workbooks("02_1.xlsm").Close True
Else
   Call Slogan
   Range("O11").Interior.Color = 13395711
   Application.Visible = True
   Exit Sub
End If

'3 января


iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\"
iFileName = Dir(iPath & "03_1.xlsm")
    
If iFileName <> "" Then

Application.ScreenUpdating = False
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\03_1.xlsm")
Application.Visible = False
Application.Run "03_1.xlsm!Executive.cont_03_1": Workbooks("03_1.xlsm").Close True
Application.Visible = True
Else
   Call Slogan
   Range("O11").Interior.Color = 13395711
   Application.Visible = True
   Exit Sub
End If

'далее такие же коды всех дней в году

'затем окончание обновления

   Application.Visible = True
End Sub
[/vba]

Если можно, в моем вложенном примере - файле Obnova.xlsm
 
Ответить
Сообщениепрохожий2019, в таблице нет года. И значение dd_m - это не формат даты, а сцепка в ячейке Y2 выбранных значений из ячеек V2 и W2. Скажем так, аналог даты, выбираемый пользователем. Если бы можно было задать ячейке Y2 переменную, а в коде поставить "якори", к которым код обращается, но не знаю как. К примеру, в батнике это легко можно было бы организовать по принципу: [vba]
Код

@echo off
Set m = Y2

If m = 01_1 Goto 02_1a
Else
Goto 01_1a

If m = 02_1 Goto 03_1a
Else
Goto 01_1a

If m = 03_1 Goto 04_1a
Else
Goto 01_1a

Rem и так до конца - Goto 12_31a

Rem продолжение кода

Goto: 01_1a
Start "" "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\02_01.xlsm"

Goto: 02_1a
Start "" "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\03_01.xlsm"

Rem и так до конца кода - Goto: 12_31a

Exit/b
[/vba]

где Y2 - значение ячейки Y2 в файле Obnova.xlsm.

Но как это реализовать в VBA? Вот в этом:
[vba]
Код
Sub upds()
'начало обновления со 2-го января

Dim iPath$, iFileName$
'2 января
iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\"
iFileName = Dir(iPath & "02_1.xlsm")
If iFileName <> "" Then

Application.ScreenUpdating = False
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\02_1.xlsm")
Application.Visible = False
Application.Run "02_1.xlsm!Executive.cont_02_1": Workbooks("02_1.xlsm").Close True
Else
   Call Slogan
   Range("O11").Interior.Color = 13395711
   Application.Visible = True
   Exit Sub
End If

'3 января


iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\"
iFileName = Dir(iPath & "03_1.xlsm")
    
If iFileName <> "" Then

Application.ScreenUpdating = False
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Январь\03_1.xlsm")
Application.Visible = False
Application.Run "03_1.xlsm!Executive.cont_03_1": Workbooks("03_1.xlsm").Close True
Application.Visible = True
Else
   Call Slogan
   Range("O11").Interior.Color = 13395711
   Application.Visible = True
   Exit Sub
End If

'далее такие же коды всех дней в году

'затем окончание обновления

   Application.Visible = True
End Sub
[/vba]

Если можно, в моем вложенном примере - файле Obnova.xlsm

Автор - Leviven
Дата добавления - 26.08.2020 в 09:01
Nic70y Дата: Среда, 26.08.2020, 09:34 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
как-то так попробуйте
[vba]
Код
u_1 = Range("v2").Value 'день
u_1_1 = Right(0 & u_1, 2)
u_2 = Range("w2").Value 'месяц
u_2_1 = StrConv(u_2)
u_3 = Range("x2").Value 'месяц (2)
u_4 = u_1_1 & "_" & u_3 'день_месяц

iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\" & u_2_1 & "\"
iFileName = Dir(iPath & u_4 & ".xlsm")
[/vba]далее аналогично


ЮMoney 41001841029809
 
Ответить
Сообщениекак-то так попробуйте
[vba]
Код
u_1 = Range("v2").Value 'день
u_1_1 = Right(0 & u_1, 2)
u_2 = Range("w2").Value 'месяц
u_2_1 = StrConv(u_2)
u_3 = Range("x2").Value 'месяц (2)
u_4 = u_1_1 & "_" & u_3 'день_месяц

iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\" & u_2_1 & "\"
iFileName = Dir(iPath & u_4 & ".xlsm")
[/vba]далее аналогично

Автор - Nic70y
Дата добавления - 26.08.2020 в 09:34
Leviven Дата: Среда, 26.08.2020, 11:51 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Nic70y, Немного переделал и вставил Ваш код в свой:
[vba]
Код
Sub PRB()
k = Range("Y2").Value  'название файла
iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest\"
iFileName = Dir(iPath & k & ".xlsm")
If iFileName <> "" Then
Application.ScreenUpdating = False
Workbooks.Open (iFileName)
'Application.Visible = False
Application.Run "iFileName!Executive.cont_ & k &": Workbooks(iFileName).Close True
Else
MsgBox "ЗАВЕРШЕНО"
   Range("O11").Interior.Color = 13395711
   ' Application.Visible = True
   Exit Sub
End If
End Sub
[/vba]

Книги замечательно открываются по выбору в ячейке Y2. Но вот как дело заходит до запуска макроса в книге:

[vba]
Код
Application.Run "iFileName!Executive.cont_ & k &": Workbooks(iFileName).Close True
[/vba]
Компилятор ругается на часть кода:
[vba]
Код
Application.Run "iFileName!Executive.cont_ & k &"
[/vba]
Пишет: Не удалось найти "iFileName.htm" Проверьте правильность ввода имени и расположение файла
При этом если вставить жестко заданные имя файла и макроса:
[vba]
Код
Application.Run "26_8.xlsm!Executive.cont_26_8": Workbooks("26_8.xlsm").Close True
[/vba]
то все работает.
Вопрос: как запустить макрос из модуля Executive с учетом выбора его имени и имени файла?
 
Ответить
СообщениеNic70y, Немного переделал и вставил Ваш код в свой:
[vba]
Код
Sub PRB()
k = Range("Y2").Value  'название файла
iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest\"
iFileName = Dir(iPath & k & ".xlsm")
If iFileName <> "" Then
Application.ScreenUpdating = False
Workbooks.Open (iFileName)
'Application.Visible = False
Application.Run "iFileName!Executive.cont_ & k &": Workbooks(iFileName).Close True
Else
MsgBox "ЗАВЕРШЕНО"
   Range("O11").Interior.Color = 13395711
   ' Application.Visible = True
   Exit Sub
End If
End Sub
[/vba]

Книги замечательно открываются по выбору в ячейке Y2. Но вот как дело заходит до запуска макроса в книге:

[vba]
Код
Application.Run "iFileName!Executive.cont_ & k &": Workbooks(iFileName).Close True
[/vba]
Компилятор ругается на часть кода:
[vba]
Код
Application.Run "iFileName!Executive.cont_ & k &"
[/vba]
Пишет: Не удалось найти "iFileName.htm" Проверьте правильность ввода имени и расположение файла
При этом если вставить жестко заданные имя файла и макроса:
[vba]
Код
Application.Run "26_8.xlsm!Executive.cont_26_8": Workbooks("26_8.xlsm").Close True
[/vba]
то все работает.
Вопрос: как запустить макрос из модуля Executive с учетом выбора его имени и имени файла?

Автор - Leviven
Дата добавления - 26.08.2020 в 11:51
Nic70y Дата: Среда, 26.08.2020, 11:54 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
Application.Run "iFileName!Executive.cont_ & k &"
[vba]
Код
Application.Run "iFileName!Executive.cont_" & k &"
[/vba]кавычка пропущена


ЮMoney 41001841029809

Сообщение отредактировал Nic70y - Среда, 26.08.2020, 11:55
 
Ответить
Сообщение
Application.Run "iFileName!Executive.cont_ & k &"
[vba]
Код
Application.Run "iFileName!Executive.cont_" & k &"
[/vba]кавычка пропущена

Автор - Nic70y
Дата добавления - 26.08.2020 в 11:54
Leviven Дата: Среда, 26.08.2020, 12:01 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Nic70y, Пробовал так. Тогда компилятор сам ставит кавычку в конце строки и выделяет ее. Пишет тоже самое:
[vba]
Код
Application.Run "iFileName!Executive.cont_" & k & ": Workbooks(iFileName).Close True"
[/vba]
 
Ответить
СообщениеNic70y, Пробовал так. Тогда компилятор сам ставит кавычку в конце строки и выделяет ее. Пишет тоже самое:
[vba]
Код
Application.Run "iFileName!Executive.cont_" & k & ": Workbooks(iFileName).Close True"
[/vba]

Автор - Leviven
Дата добавления - 26.08.2020 в 12:01
Nic70y Дата: Среда, 26.08.2020, 12:27 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
а, ну да сразу не обратил внимания[vba]
Код
Application.Run "iFileName!Executive.cont_" & k : Workbooks(iFileName).Close True
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщениеа, ну да сразу не обратил внимания[vba]
Код
Application.Run "iFileName!Executive.cont_" & k : Workbooks(iFileName).Close True
[/vba]

Автор - Nic70y
Дата добавления - 26.08.2020 в 12:27
Leviven Дата: Пятница, 28.08.2020, 08:39 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Nic70y, не работает. И даже так почему-то не работает:[vba]
Код
Application.Run " & k & .xlsm!Executive.cont_ & k": Workbooks(" & k & .xlsm").Close True
[/vba]
 
Ответить
СообщениеNic70y, не работает. И даже так почему-то не работает:[vba]
Код
Application.Run " & k & .xlsm!Executive.cont_ & k": Workbooks(" & k & .xlsm").Close True
[/vba]

Автор - Leviven
Дата добавления - 28.08.2020 в 08:39
Nic70y Дата: Пятница, 28.08.2020, 10:44 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
И даже так почему-то не работает
ну так точно работать не будет.
в кавычках должен быть текст,
переменная в кавычках становить просто текстом.
сложновато без файлов...
[vba]
Код
Workbooks(k &  ".xlsm")
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщение
И даже так почему-то не работает
ну так точно работать не будет.
в кавычках должен быть текст,
переменная в кавычках становить просто текстом.
сложновато без файлов...
[vba]
Код
Workbooks(k &  ".xlsm")
[/vba]

Автор - Nic70y
Дата добавления - 28.08.2020 в 10:44
Leviven Дата: Пятница, 28.08.2020, 11:36 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Nic70y, Вот этот код не отрабатывает. Запускает вторую часть макроса:[vba]
Код

Sub PRB()
k = Range("Y2").Value
iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest"
iFileName = Dir(iPath & k & ".xlsm")
If iFileName <> "" Then
Application.ScreenUpdating = False
Workbooks.Open (iFileName)
Application.Run " & k & .xlsm!Executive.cont_ & k": Workbooks(" & k & .xlsm").Close True
Else
MsgBox "ЗАВЕРШЕНО"
Range("O11").Interior.Color = 13395711

Exit Sub
End If
End Sub
[/vba]

А этот работает только, если напрямую указать макрос (без выбора). Пробовал по-разному: закомментированные строки - варианты проб:
[vba]
Код

'
Sub zp()
k = Range("Y2").Value
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest\" & [Y2] & ".xlsm")
Application.Run "27_9.xlsm!Executive.cont_27_9": Workbooks("27_9.xlsm").Close True

'ЭТИ СТРОКИ НЕ РАБОТАЮТ

' СТРОКА - k = Range("Y2").Value ТОЖЕ НЕ РАБОТАЕТ

'Application.Run " & k & .xlsm!Executive.cont_" & k: Workbooks(" & k & ".xlsm).Close True

' ТАК ТОЖЕ НЕ РАБОТАЕТ
'Application.Run "[Y2] & .xlsm!Executive.cont_ & [Y2]": Workbooks([Y2] & ".xlsm").Close True
End Sub
[/vba]

Во вложении оба файла. Запускать с Obnova.xls.
К сообщению приложен файл: Obnova.xls (53.0 Kb) · 27_9.xlsm (13.9 Kb)
 
Ответить
СообщениеNic70y, Вот этот код не отрабатывает. Запускает вторую часть макроса:[vba]
Код

Sub PRB()
k = Range("Y2").Value
iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest"
iFileName = Dir(iPath & k & ".xlsm")
If iFileName <> "" Then
Application.ScreenUpdating = False
Workbooks.Open (iFileName)
Application.Run " & k & .xlsm!Executive.cont_ & k": Workbooks(" & k & .xlsm").Close True
Else
MsgBox "ЗАВЕРШЕНО"
Range("O11").Interior.Color = 13395711

Exit Sub
End If
End Sub
[/vba]

А этот работает только, если напрямую указать макрос (без выбора). Пробовал по-разному: закомментированные строки - варианты проб:
[vba]
Код

'
Sub zp()
k = Range("Y2").Value
Workbooks.Open ("D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest\" & [Y2] & ".xlsm")
Application.Run "27_9.xlsm!Executive.cont_27_9": Workbooks("27_9.xlsm").Close True

'ЭТИ СТРОКИ НЕ РАБОТАЮТ

' СТРОКА - k = Range("Y2").Value ТОЖЕ НЕ РАБОТАЕТ

'Application.Run " & k & .xlsm!Executive.cont_" & k: Workbooks(" & k & ".xlsm).Close True

' ТАК ТОЖЕ НЕ РАБОТАЕТ
'Application.Run "[Y2] & .xlsm!Executive.cont_ & [Y2]": Workbooks([Y2] & ".xlsm").Close True
End Sub
[/vba]

Во вложении оба файла. Запускать с Obnova.xls.

Автор - Leviven
Дата добавления - 28.08.2020 в 11:36
Nic70y Дата: Суббота, 29.08.2020, 11:17 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
переменная в кавычках становить просто текстом

[vba]
Код
Application.Run k &  ".xlsm!Executive.cont_" & k : Workbooks(k &  ".xlsm").Close True
[/vba]
проверил, работает
[vba]
Код
'iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest"
iPath = ThisWorkbook.Path
'iFileName = Dir(iPath & k & ".xlsm")
iFileName = iPath & "\" & k & ".xlsm"
If iFileName <> "" Then
Application.ScreenUpdating = False
Workbooks.Open (iFileName)
'Application.Visible = False
Application.Run k & ".xlsm!Executive.cont_" & k: Workbooks(k & ".xlsm").Close True
[/vba]


ЮMoney 41001841029809

Сообщение отредактировал Nic70y - Суббота, 29.08.2020, 11:29
 
Ответить
Сообщение
переменная в кавычках становить просто текстом

[vba]
Код
Application.Run k &  ".xlsm!Executive.cont_" & k : Workbooks(k &  ".xlsm").Close True
[/vba]
проверил, работает
[vba]
Код
'iPath = "D:\METOD\ДВИЖЕНИЕ\2020\Data\Digest"
iPath = ThisWorkbook.Path
'iFileName = Dir(iPath & k & ".xlsm")
iFileName = iPath & "\" & k & ".xlsm"
If iFileName <> "" Then
Application.ScreenUpdating = False
Workbooks.Open (iFileName)
'Application.Visible = False
Application.Run k & ".xlsm!Executive.cont_" & k: Workbooks(k & ".xlsm").Close True
[/vba]

Автор - Nic70y
Дата добавления - 29.08.2020 в 11:17
Leviven Дата: Понедельник, 31.08.2020, 13:58 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 38
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Nic70y, Работает! Спасибо огромное!
 
Ответить
СообщениеNic70y, Работает! Спасибо огромное!

Автор - Leviven
Дата добавления - 31.08.2020 в 13:58
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Выбор места запуска кода по значению в ячейке (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!