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

Вход

Регистрация

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

 

= Мир MS Excel/Создание гибкого кода для меняющегося файла - Мир MS Excel

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

Excel 2013
Здравствуйте!
На основании файла "macros", создаются отдельные "калькуляторы" (по шаблону) по каждому подразделению
Ежемесячно столбцы в "macros" меняются и приходится переписывать ссылки на столбцы.
Например, Range("bd" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value, т.е из столбца"u" переставить данные в "калькулятор" в столбец "bd". И так как вид файла постоянно меняется, приходится переписывать номера столбцов вручную. Если, например, в файле "macros" в строке 7 написать контрольные значения ("C16", "E16", "F16" и т.д.) или кодовые слова, как поменять имена столбцов на адреса в этих ячейках с кодовыми словами, и в дальнейшем только менять эти кодовые слова, чтобы не переписывать макрос?
Заранее благодарю!!
К сообщению приложен файл: 3394400.rar (45.9 Kb)


Сообщение отредактировал bob3 - Вторник, 17.02.2015, 17:44
 
Ответить
СообщениеЗдравствуйте!
На основании файла "macros", создаются отдельные "калькуляторы" (по шаблону) по каждому подразделению
Ежемесячно столбцы в "macros" меняются и приходится переписывать ссылки на столбцы.
Например, Range("bd" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value, т.е из столбца"u" переставить данные в "калькулятор" в столбец "bd". И так как вид файла постоянно меняется, приходится переписывать номера столбцов вручную. Если, например, в файле "macros" в строке 7 написать контрольные значения ("C16", "E16", "F16" и т.д.) или кодовые слова, как поменять имена столбцов на адреса в этих ячейках с кодовыми словами, и в дальнейшем только менять эти кодовые слова, чтобы не переписывать макрос?
Заранее благодарю!!

Автор - bob3
Дата добавления - 17.02.2015 в 17:28
Wasilich Дата: Вторник, 17.02.2015, 18:18 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
приходится переписывать номера столбцов вручную
и
в файле "macros" в строке 7 написать контрольные значения ("C16", "E16", "F16" и т.д.)
Так все-таки, номера столбцов или имена. Если номера то, почему в строке 7 их не прописать, если имена C, E, F то, почему с номером строки 16? %)
Если правильно понял, то наверное так.
в В7 пишем имя колонки- bd, в макросе задаем переменную
[vba]
Код
Dim k1$
k1=Range("B7")
[/vba]А в коде
[vba]
Код
Range("bd" & ko + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value
[/vba]"bd" меняем на переменную k1 [vba]
Код
Range(k1 & ko + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value
[/vba]и так для остальных колонок. Меняя в В7 имя колонки, в коде через переменную оно тоже будет меняться.
Наверное так.


Сообщение отредактировал Wasilic - Вторник, 17.02.2015, 18:50
 
Ответить
Сообщение
приходится переписывать номера столбцов вручную
и
в файле "macros" в строке 7 написать контрольные значения ("C16", "E16", "F16" и т.д.)
Так все-таки, номера столбцов или имена. Если номера то, почему в строке 7 их не прописать, если имена C, E, F то, почему с номером строки 16? %)
Если правильно понял, то наверное так.
в В7 пишем имя колонки- bd, в макросе задаем переменную
[vba]
Код
Dim k1$
k1=Range("B7")
[/vba]А в коде
[vba]
Код
Range("bd" & ko + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value
[/vba]"bd" меняем на переменную k1 [vba]
Код
Range(k1 & ko + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value
[/vba]и так для остальных колонок. Меняя в В7 имя колонки, в коде через переменную оно тоже будет меняться.
Наверное так.

Автор - Wasilich
Дата добавления - 17.02.2015 в 18:18
Manyasha Дата: Вторник, 17.02.2015, 18:29 | Сообщение № 3
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
bob3, сделала двумя способами:
1) В столбце В7 ссылка на ячейку, следующий код получает номер столбца
[vba]
Код
Sub test()
     r1 = Mid(Range("B7").Formula, 2, Len(Range("B7").Formula) - 1)
     c1 = Range(r1).Column
     Debug.Print "В В7: формула", r1, "столбец", c1
End Sub
[/vba]
2) Намного проще, как сказал Wasilic проставить номера столбцов, если боитесь сбиться при подсчете вручную можно так:
Код
=СТОЛБЕЦ(E16)
(см. формулу в С7)
К сообщению приложен файл: macros2.xlsm (28.4 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеbob3, сделала двумя способами:
1) В столбце В7 ссылка на ячейку, следующий код получает номер столбца
[vba]
Код
Sub test()
     r1 = Mid(Range("B7").Formula, 2, Len(Range("B7").Formula) - 1)
     c1 = Range(r1).Column
     Debug.Print "В В7: формула", r1, "столбец", c1
End Sub
[/vba]
2) Намного проще, как сказал Wasilic проставить номера столбцов, если боитесь сбиться при подсчете вручную можно так:
Код
=СТОЛБЕЦ(E16)
(см. формулу в С7)

Автор - Manyasha
Дата добавления - 17.02.2015 в 18:29
doober Дата: Вторник, 17.02.2015, 18:29 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Можно так.
Маркировку сделаете сами по примеру
Маркировка столбцов калькулятора разбита на две части,первый символ
К сообщению приложен файл: macros.xlsm (30.6 Kb)


 
Ответить
СообщениеМожно так.
Маркировку сделаете сами по примеру
Маркировка столбцов калькулятора разбита на две части,первый символ

Автор - doober
Дата добавления - 17.02.2015 в 18:29
bob3 Дата: Вторник, 17.02.2015, 22:18 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Прошу прощения, если что-то не понимаю или плохо объясняю, я пока только учусь.
В макросе прописала адреса столбцов, например:
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("b" & i).Value
Это значит, что на основании макроса у меня создается отдельный файл "калькулятор", в столбец "с" которого "фио" из столбца "b" в файле "macros" и также аналогично проставляются таб.номер,оклад и т.д. Файл "macros" в ежемесячном режиме меняется, т.е. колонки могут быть в других местах, а не как в этом месяце. Поэтому хотелось бы в файле "macros", например в строке №7 прописать какие-нибудь значения, которые бы соответствовали колонкам "фио", "таб.номер" и т.д., чтобы в дальнейшем, просто эти значения ставить напротив столбцов с новым расположением, но не менять в макросе соответствие.
Как-то так...

Фрагмент:

[vba]
Код
Windows(file2).Activate
Sheets("svod").Activate
Range("b9").Select
Range(ActiveCell, ActiveCell.End(xlDown)).Select
counter5 = Selection.Rows.Count
k = 1
For i = 9 To counter5 + 8
If Range("b" & i).Text Like "*акансия" Or Range("f" & i).Value = 0 Then
'MsgBox ("")
i = i + 1
End If
Range("g9").Select
prova = Right(Range("g" & i).Text, 4)
If k = 0 Then
Windows(file3).Activate
ActiveWorkbook.SaveAs p1 & Left(file3, Len(file3) - 4) & "_" & prova & ".xls"
file3 = ActiveWorkbook.Name

Windows(file2).Activate
Range("b" & i).Select
stroka = Selection.Row
Windows(file3).Activate
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("b" & i).Value 'fio
'Range("d" & otrab(k, 1) + 18).Value = "Клиентский менеджер СБ Премьер"
Range("e" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("c" & i).Value 'tabel
Range("f" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("d" & i).Value
Range("g" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("f" & i).Value
Range("h" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("s" & i).Value
Range("i" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("o" & i).Value
Range("j" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("p" & i).Value
Range("k" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("r" & i).Value
Range("l" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("q" & i).Value
Range("ab" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("n" & i).Value
Range("ac" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("k" & i).Value
Range("bc" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("x" & i).Value
Range("bd" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value
Range("be" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("v" & i).Value
[/vba]
[moder]Оформляйте коды тегами (кнопка #)[/moder]
 
Ответить
СообщениеПрошу прощения, если что-то не понимаю или плохо объясняю, я пока только учусь.
В макросе прописала адреса столбцов, например:
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("b" & i).Value
Это значит, что на основании макроса у меня создается отдельный файл "калькулятор", в столбец "с" которого "фио" из столбца "b" в файле "macros" и также аналогично проставляются таб.номер,оклад и т.д. Файл "macros" в ежемесячном режиме меняется, т.е. колонки могут быть в других местах, а не как в этом месяце. Поэтому хотелось бы в файле "macros", например в строке №7 прописать какие-нибудь значения, которые бы соответствовали колонкам "фио", "таб.номер" и т.д., чтобы в дальнейшем, просто эти значения ставить напротив столбцов с новым расположением, но не менять в макросе соответствие.
Как-то так...

Фрагмент:

[vba]
Код
Windows(file2).Activate
Sheets("svod").Activate
Range("b9").Select
Range(ActiveCell, ActiveCell.End(xlDown)).Select
counter5 = Selection.Rows.Count
k = 1
For i = 9 To counter5 + 8
If Range("b" & i).Text Like "*акансия" Or Range("f" & i).Value = 0 Then
'MsgBox ("")
i = i + 1
End If
Range("g9").Select
prova = Right(Range("g" & i).Text, 4)
If k = 0 Then
Windows(file3).Activate
ActiveWorkbook.SaveAs p1 & Left(file3, Len(file3) - 4) & "_" & prova & ".xls"
file3 = ActiveWorkbook.Name

Windows(file2).Activate
Range("b" & i).Select
stroka = Selection.Row
Windows(file3).Activate
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("b" & i).Value 'fio
'Range("d" & otrab(k, 1) + 18).Value = "Клиентский менеджер СБ Премьер"
Range("e" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("c" & i).Value 'tabel
Range("f" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("d" & i).Value
Range("g" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("f" & i).Value
Range("h" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("s" & i).Value
Range("i" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("o" & i).Value
Range("j" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("p" & i).Value
Range("k" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("r" & i).Value
Range("l" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("q" & i).Value
Range("ab" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("n" & i).Value
Range("ac" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("k" & i).Value
Range("bc" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("x" & i).Value
Range("bd" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("u" & i).Value
Range("be" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("v" & i).Value
[/vba]
[moder]Оформляйте коды тегами (кнопка #)[/moder]

Автор - bob3
Дата добавления - 17.02.2015 в 22:18
Manyasha Дата: Вторник, 17.02.2015, 23:13 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Смотрите макрос test в приложенном файле. Вариант конечно не самый надежный, но, при условии, что имена в шапке не будут меняться должен работать.
Принцип действия: ищу в шапке ячейку со значением ФИО и запоминаю ее столбик, в примере сделала только для двух строчек (ФИО и табельный номер), результат на листе 2.

В Вашем рабочем макросе нужно будет добавить (это только для ФИО и таб номера, для остальных - по аналогии)
[vba]
Код
Rows("8:8").Select
fio = Cells.Find("фио", , , xlWhole).Column
tNum = Cells.Find("Табельный номер", , , xlWhole).Column
[/vba]
и изменить строчки
[vba]
Код
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("b" & i).Value 'fio
Range("e" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("c" & i).Value 'tabel
[/vba]
на
[vba]
Код
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Cells(i, fio).Value 'fio
Range("e" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Cells(i, tNum).Value 'tabel
[/vba]

Попробуйте поменять столбики местами, результат на листе 2 должен быть неизменным.
К сообщению приложен файл: macros3.xlsm (33.9 Kb)


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Вторник, 17.02.2015, 23:16
 
Ответить
СообщениеСмотрите макрос test в приложенном файле. Вариант конечно не самый надежный, но, при условии, что имена в шапке не будут меняться должен работать.
Принцип действия: ищу в шапке ячейку со значением ФИО и запоминаю ее столбик, в примере сделала только для двух строчек (ФИО и табельный номер), результат на листе 2.

В Вашем рабочем макросе нужно будет добавить (это только для ФИО и таб номера, для остальных - по аналогии)
[vba]
Код
Rows("8:8").Select
fio = Cells.Find("фио", , , xlWhole).Column
tNum = Cells.Find("Табельный номер", , , xlWhole).Column
[/vba]
и изменить строчки
[vba]
Код
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("b" & i).Value 'fio
Range("e" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Range("c" & i).Value 'tabel
[/vba]
на
[vba]
Код
Range("c" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Cells(i, fio).Value 'fio
Range("e" & otrab(k, 1) + 18).Value = Workbooks(file2).Sheets("svod").Cells(i, tNum).Value 'tabel
[/vba]

Попробуйте поменять столбики местами, результат на листе 2 должен быть неизменным.

Автор - Manyasha
Дата добавления - 17.02.2015 в 23:13
Hugo Дата: Вторник, 17.02.2015, 23:16 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Ужасы какие... :)
Вот тут
[vba]
Код
Windows(file2).Activate
Range("b" & i).Select
stroka = Selection.Row
[/vba]
Почему бы не обойтись без этих трёх строк, селектов, активаций и stroka? Чем не нравится i?
А по фрагменту так это вообще лишнее...

Вместо сотни
otrab(k, 1) + 18
можно поместить это в одну переменную и использовать её - и короче, и быстрее.
Workbooks(file2).Sheets("svod") тоже можно написать один раз, используя with.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеУжасы какие... :)
Вот тут
[vba]
Код
Windows(file2).Activate
Range("b" & i).Select
stroka = Selection.Row
[/vba]
Почему бы не обойтись без этих трёх строк, селектов, активаций и stroka? Чем не нравится i?
А по фрагменту так это вообще лишнее...

Вместо сотни
otrab(k, 1) + 18
можно поместить это в одну переменную и использовать её - и короче, и быстрее.
Workbooks(file2).Sheets("svod") тоже можно написать один раз, используя with.

Автор - Hugo
Дата добавления - 17.02.2015 в 23:16
doober Дата: Среда, 18.02.2015, 03:40 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Игорь,я и убрал эти лишние строки из кода,порядка 30 штук.
Применил два словаря.
ТС даже код не анализировал мой, а может и не смотрел


 
Ответить
СообщениеИгорь,я и убрал эти лишние строки из кода,порядка 30 штук.
Применил два словаря.
ТС даже код не анализировал мой, а может и не смотрел

Автор - doober
Дата добавления - 18.02.2015 в 03:40
bob3 Дата: Воскресенье, 22.02.2015, 21:25 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Огромное вам всем спасибо!!
 
Ответить
СообщениеОгромное вам всем спасибо!!

Автор - bob3
Дата добавления - 22.02.2015 в 21:25
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Создание гибкого кода для меняющегося файла (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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