Переменные в имени листа excel

 

Юрий М, Спасибо огромное! то, чего не доставало самостоятельно нашел на других форумах благодаря знакомым уже пользователям (Ikki), итак мой кусок кода теперь выглядит сл. образом (для информации другим гостям этого форума):

Код
Set WBA = ThisWorkbook
    Set WS1 = ActiveSheet
    Set WS2 = Choose(Right(WS1.CodeName, 2), _
    Month_01, _
    Month_02, _
    Month_03, _
    Month_04, _
    Month_05, _
    Month_06, _
    Month_07, _
    Month_08, _
    Month_09, _
    Month_10, _
    Month_11, _
    Month_12)

само-собой это лишь малая часть кода, но теперь можно переименовывать листы в книге пользователям без опаски сбить код, обновленный код протестил, работает как часики.
Hugo, тоже огромное спасибо, но я еще «очень новичок» в VBA, и многого еще не понимаю и не знаю, но желание разбираться есть, так что разбираться буду. Не совсем понял в вашем коде, что и куда, как дойду знаниями до нужного уровня разберусь )). Быть может я не совсем ясно задачу поставил, суть в том что (на примере того же декабря) у меня в «АО 12» собраны и отсортированы из общей базы («12») нужные мне данные в зависимости от той недели за которую я составляю отчет, но не все данные для работы кода есть на данном листе, чтобы излишне не грузить книгу формулами (вес ее увеличивается с каждой формулой) мне проще часть данных взять с активного листа («АО 12»), а недостающие данные взять с исходного листа соответствующего месяца («12») и потом все это перенести в другую книгу-шаблон отчета именно поэтому я и хотел присвоить переменной WS1 свойства и методы активного листа, а WS2 ориентируясь на два последних знака активного листа определить нужный мне месяц и также присвоить все свойства и методы, чтобы обращаться уже к переменным а не к листам в коде.. Мне остается потом уже в автоматически сохраненном отчете в нужное мне место и с нужным мне именем добавить немного данных с внутренней программы и все, то что раньше я копипастил вручную с двух листов, распределял где профильное где общее в течение часа, теперь у меня делается автоматически в течение нескольких секунд и корректируется еще в течение 5-10 минут. ))) Чего-то я отвлекся… В общем спасибо всем за помощь! Не раз уже убеждался что форум полезный, спасибо и создателю этого сайта!

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

1

Присвоение переменной имени книги и листа

17.11.2013, 19:04. Показов 52495. Ответов 34


Студворк — интернет-сервис помощи студентам

Есть файл (Расчет.xls). В нем 3 листа(Лист1, Лист2, Лист3). Как при открытии файла присвоить переменной (F) имя файла и имя нужного листа для использования в range(F.cells(….))



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,147

17.11.2013, 19:09

2

вариантов несколько. Некоторые из них?

Visual Basic
1
2
3
4
Dim F As Worksheet
Set F = Worksheets("Отчёт") '
Set F = Worksheets(1) '
Set F = Лист1 '



0



ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 19:11

 [ТС]

3

Цитата
Сообщение от Alex77755
Посмотреть сообщение

вариантов несколько. Некоторые из них?

Visual Basic
1
2
3
4
Dim F As Worksheet
Set F = Worksheets("Отчёт") '
Set F = Worksheets(1) '
Set F = Лист1 '

Мне надо F=Файл(«Расчет»)+Worksheets(«Лист1»)’ так можно?
На случай если открыты несколько файлов



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 19:17

4

Так нельзя.
Так можно:

Visual Basic
1
set F=activeworkbook.Worksheets("Лист1")



1



ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 19:23

 [ТС]

5

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Так нельзя.
Так можно:

Visual Basic
1
set F=activeworkbook.Worksheets("Лист1")

А VBA не перепутает книги, например если открыто 2 файла и в каждом есть свой код на VBA

Добавлено через 4 минуты
Я хочу при открытии Расчет.xls через код присвоить переменной F=имя_файла+имя_листа



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 19:23

6

Вопрос был «Как при открытии файла присвоить переменной» — так что смотрите сами не перепутайте
А вообще обычно делают так — при открытии присваивают переменной открываемую книгу. И в общем этой одной переменной далее можно и обойтись.
Но чтоб сократить код — можно например лист тоже загнать в переменную:

Visual Basic
1
2
Set wb = Workbooks.Open(filename, False, True)
set sh=wb.sheets("очень длинное название из 32 символов")



1



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 19:59

 [ТС]

7

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Set wb = Workbooks.Open(filename, False, True)

По моему это не совсем то, что я хотел. Я хотел, чтобы при открытии книги переменной присваивалось имя этой же книги: wb=имя_книги.xls

Добавлено через 18 минут
Сам разобрался
Set wb = Application.ActiveWorkbook



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 20:16

8

Ещё за час до того, как Вы разобрались, было написано:

Visual Basic
1
set F=activeworkbook.Worksheets("Лист1")



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 20:22

 [ТС]

9

В Вашем примере указывается непосредственно «Лист1». Я же хотел, чтобы VBA сам получал имя файла и имя листа и присваивал это переменной. Set F = Application.ActiveWorkbook.Sheets(1)



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 20:34

10

В чём принципиальная разница? Лист могут переименовать? Так могут же и передвинуть!



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 20:45

 [ТС]

11

Цитата
Сообщение от Hugo121
Посмотреть сообщение

В чём принципиальная разница? Лист могут переименовать? Так могут же и передвинуть!

В таком случае можно ли при загрузке книги запретить переименование и перемещение листов?



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 20:50

12

При загрузке? Вы им запретите это делать до сохранения!
Ну раз там такие тупые сотрудники, что просто сказать — не работает, то используйте кодовое имя листа — такой пример тоже выше уже упоминался.
Только вот я бы не использовал Лист1 — это имя у меня на работе например превратится в Sheets1. Я бы дал листу своё имя, т.е. изменил родное на другое.



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 21:02

 [ТС]

13

Цитата
Сообщение от Hugo121
Посмотреть сообщение

При загрузке? Вы им запретите это делать до сохранения!
Ну раз там такие тупые сотрудники, что просто сказать — не работает, то используйте кодовое имя листа — такой пример тоже выше уже упоминался.
Только вот я бы не использовал Лист1 — это имя у меня на работе например превратится в Sheets1. Я бы дал листу своё имя, т.е. изменил родное на другое.

В моей книге идет «онлайн» расчет, При работе на 1м листе идет выборка данных со 2-го и наоборот. Если в процессе работы переименовать или переместить листы, то это вызовет «kernel panic» . Вот бы запретить переименование и перемещение сразу после открытия. Как бы «защита от дурака». А как они называются — это не важно. Да и еще как запретить открывать другие книги при открытой этой?



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 21:11

14

Линейкой по пальцам. Думаю самое простое и надёжное
Вот это «сразу после открытия» как понимать? «Сразу» это сколько?
Вообще запретить можно защитой книги.
Запретить открывать другие думаю можно макросом — при открытии книг проверять — если открыта «эта», то новые закрывать. Но Ведь они могут быть открыты уже ранее…
В общем, я бы решал всё комплексно и как-то иначе что-ли… Увеличил например зарплату и уровень сотрудников

P.S. Вообще правильно написанному макросу другие книги не помеха.



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 21:19

 [ТС]

15

Сразу это Workbook_Open()
Мне до ПРАВИЛЬНОГО — как до Марса пешком



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 21:22

16

Ну просто старайтесь нигде не использовать selection и activate — и уже будет намного надёжнее. И быстрее.
И вот эти объектные переменные — тоже хорошо.



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 21:25

 [ТС]

17

Как это правильно оформить
If IsNumeric(ячейка_в_которую_вводится_значение.Value ) = False Then ячейка_в_которую_вводится_значение.Value = 0



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 21:29

18

Visual Basic
1
If not IsNumeric(ячейка_в_которую_вводится_значение.Value) Then ячейка_в_которую_вводится_значение.Value = 0

Хотя и Ваш вариант рабочий, но я обычно пишу Not.



0



ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

17.11.2013, 21:38

 [ТС]

19

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Visual Basic
1
If not IsNumeric(ячейка_в_которую_вводится_значение.Value) Then ячейка_в_которую_вводится_значение.Value = 0

Хотя и Ваш вариант рабочий, но я обычно пишу Not.

Так на что заменить (ячейка_в_которую_вводится_значение)



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.11.2013, 21:43

20

Я например так сделал:

Visual Basic
1
Set ячейка_в_которую_вводится_значение = [a1]

Хотя конечно сомнительно, что тут нужна переменная, но бывает что и нужна…



0



You’re saying this works?

Sheets("Blank (2)").name = sname

Then, do this:

With Sheets("Blank (2)")
    .Name = sname
    .Activate
    .Select
End With

The idea is to grab a reference to the worksheet you’re working with, instead of constantly fetching the object from the Sheets collection every time.

Alternatively:

Dim target As Worksheet
Set target = ThisWorkbook.Worksheets("Blank (2)")
target.Name = sname
target.Activate
target.Select

Note that the Sheets collection, unqualified as you’ve used it, implicitly refers to the active workbook. Assuming that active workbook is the same workbook the code is written in, it’s best to qualify the call with ThisWorkbook, and to use the Worksheets collection instead — because the Sheets collection can contain non-worksheet objects (e.g. charts).

Lastly, I doubt there’s any need to .Select anything here. Read more about avoiding .Select and .Activate here.

Обращение к рабочим листам Excel из кода VBA. Переименование листов, скрытие и отображение с помощью кода VBA Excel. Свойства Worksheets.Name и Worksheets.Visible.

Обращение к рабочим листам

Рабочий лист (Worksheet) принадлежит коллекции всех рабочих листов (Worksheets) книги Excel. Обратиться к листу можно как к элементу коллекции и, напрямую, по его уникальному имени.

Откройте редактор VBA и обратите внимание на вашу книгу в проводнике, где уникальные имена листов указаны без скобок, а в скобках — имена листов, отображаемые на ярлычках в открытой книге Excel. Уникальные имена листов отсортированы по алфавиту и их расположение по порядку не будет соответствовать их индексам (номерам), если листы перемещались по отношению друг к другу. Индексы листов смотрите по порядку расположения ярлычков в открытой книге. Переместили листы — изменились их индексы.

Обращение к рабочему листу в коде VBA Excel:

‘По уникальному имени

УникИмяЛиста

‘По индексу

Worksheets(N)

‘По имени листа на ярлычке

Worksheets(«Имя листа»)

  • УникИмяЛиста — уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить его невозможно.
  • N — индекс листа от 1 до количества всех листов в книге, соответствует порядковому номеру ярлычка этого листа в открытой книге Excel.
  • Имя листа — имя листа, отображаемое в проводнике редактора VBA в скобках, с помощью кода VBA изменить его можно.

Количество листов в рабочей книге Excel определяется так:

‘В активной книге

Worksheets.Count

‘В любой открытой книге,

‘например, в «Книга1.xlsm»

Workbooks(«Книга1.xlsm»).Worksheets.Count

Переименование листов

В VBA Excel есть некоторые особенности в наименовании листов, так как у рабочего листа есть два свойства, связанных с именем: (Name) и Name. Откройте окно «Properties» в редакторе VBA, нажав клавишу «F4», и выделите любой лист в проводнике. Вы увидите, что в окне «Properties» свойству (Name) в скобках соответствует в проводнике уникальное имя листа без скобок, а свойству Name без скобок соответствует изменяемое имя листа в скобках. Оба имени в окне «Properties» можно редактировать.

С помощью кода VBA Excel можно редактировать только имя листа Name, отображаемое на ярлычке листа и в проводнике без скобок. Для этого используется свойство рабочего листа Worksheets.Name со следующим синтаксисом:

expression.Name

где expression — переменная, представляющая собой объект Worksheet. Смена имени осуществляется путем присвоения нового значения свойству Worksheets.Name.

Допустим, у нас есть лист с уникальным именем (Name) — Лист1, индексом — 1 и именем Name — МойЛист, которое необходимо заменить на имя — Реестр.

Лист1.Name = «Реестр»

Worksheets(1).Name = «Реестр»

Worksheets(«МойЛист»).Name = «Реестр»

Скрытие и отображение листов

Для скрытия и отображения рабочих листов в VBA Excel используется свойство Worksheet.Visible со следующим синтаксисом:

expression.Visible

где expression — переменная, представляющая собой объект Worksheet. Свойству Worksheet.Visible могут присваиваться следующие значения:

  • False — лист становится невидимым, но он будет присутствовать в списке скрытых листов, и пользователь сможет его отобразить с помощью инструментов рабочей книги Excel.
  • xlVeryHidden — лист становится супер невидимым и его не будет в списке скрытых листов, пользователь не сможет его отобразить. Актуально для Excel 2003-2016.
  • True — лист становится видимым.

Аналоги присваиваемых значений:

  • False = xlHidden = xlSheetHidden = 1
  • xlVeryHidden = xlSheetVeryHidden = 2
  • True = xlSheetVisible = -1 (константа xlVisible вызывает ошибку)

Примеры:

Лист1.Visible = xlSheetHidden

Лист2.Visible = 1

Worksheets(Worksheets.Count).Visible = xlVeryHidden

Worksheets(«МойЛист»).Visible = True

Как создать, скопировать, переместить или удалить рабочий лист с помощью кода VBA Excel, смотрите в этой статье.

Группа: Пользователи

Ранг: Новичок

Сообщений: 32


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Добрый день.
Я хочу, чтобы пользователю макроса, который я пишу, открывалось какое-то диалоговое окно с различными уточняющими вопросами:
один из них — на каком листе находятся такие-то данные.
Пользователь кликает на нужный лист и макрос продолжает работу.
Application.Inputbox в этом как-то не очень хочет помогать — ему не достаточно выбора только листа, все время на что-нибудь ругается в зависимости от различных type:=

Для примера, как я это вижу:

[vba]

Код

Option Explicit
Public strData as String ‘Переменная для наименования листов в книге

‘Переменные для листов
Public shtData1 as Worksheet
Public shtData2 as Worksheet
Public shtData3 as Worksheet

‘—-Еще куча разных переменных, не относящихся к посту

Public Sub Links_Values()

strData = ‘Здесь вызывается диалог с пользователем, где он кликает на один из листов в текущей книге
Set shtData1 = Thisworkbook.Worksheets(strData)
strData = ‘Здесь вызывается диалог с пользователем, где он кликает на один из листов в текущей книге
Set shtData2 = Thisworkbook.Worksheets(strData)
strData = ‘Здесь вызывается диалог с пользователем, где он кликает на один из листов в текущей книге
Set shtData2 = Thisworkbook.Worksheets(strData)

‘—-Дальнейшее выполнение макроса

End Sub

[/vba]

Возможен такой вариант и с помощью чего это можно осуществить?

Понравилась статья? Поделить с друзьями:
  • Переменные в excel 2016
  • Переменные в excel 2007
  • Переменные vba excel это
  • Переменные excel 2010 все
  • Переменное значение числа excel