Страницы: 1 2 След.
RSS
Присвоение переменной имени листа VBA
 
Прошу прощения за дурацкий вопрос (перешерстил уже кучу форумов), как правильно реализовать присвоение имя листа переменной?
Что бы не прописывать каждый раз длинное название
Ниже привел код, что то в нем не работает. Может кто подскажет как правильно записать его?
Код
Dim x, y As Sheets
    Set x = Sheets("Основные_данные")
    Set y = Sheets("Ввод_пробега")
x.Cells(5, 3) = y.Cells(1,1)
Изменено: Alex6656 - 25.01.2016 00:47:59
 
Код
Sub tt()
Dim x As Worksheet
Dim y As Worksheet
    Set x = Sheets("Основные_данные")
    Set y = Sheets("Ввод_пробега")
    x.Cells(5, 3) = y.Cells(1, 1)
End Sub
 
Правильнее работать не с видимым именем листа, а с внутренним, которое видно в проекте VBA. Надежнее. Видимое имя пользователь может поменять.
 
Kuzmich, Спасибо все работает. Истина была где то рядом))
 
Цитата
vikttur написал: Надежнее. Видимое имя пользователь может поменять.
А внутреннее бывает меняет сам Эксель (если открыть файл под другой локалью). Рекомендую это дело предварить и поменять его самостоятельно на что-то своё.
 
Цитата
Hugo написал:
А внутреннее бывает меняет сам Эксель
Игорь, вот тут не понял. Если лист уже создан - то ничего не поменяется. Для вновь создаваемых - да. Но ведь тут как я понял такой задачи и нет...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Вот сейчас открыл что-то скачанное с форума - вижу в редакторе Sheet1(Лист1). Вот как это имя использовать в коде?...
А если переименовать например в  MyName1 -то ОК, так и останется, и не будет проблем с кириллицей.
Вот например этот файл посмотрите:
http://planetaexcel.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=169436&action=down...
У меня кодовое имя листа "Осеменение" Sheet1.
Office 365 ProPlus
Изменено: Hugo - 25.01.2016 12:13:04
 
Да, действительно, у меня Лист1.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
При использовании в коде переименовываю всегда. Что-нибудь по смыслу, номер... Пример: wsInsem, ws0
 
Цитата
Hugo написал: А если переименовать например в  MyName1 -то ОК, так и останется, и не будет проблем с кириллицей.
Hugo: Спасибо за ценный совет
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Вообще, раньше если книга была создана в англ.локали - у меня открывалась книга с английскими названиями: Sheet1,Sheet2. Т.е. ничего не менялось на русские. Наблюдал это не один десяток раз прямо здесь же на форуме. А файл Игоря открылся с русскими кодовыми именами.
Сейчас проверил: создал книгу в русской локали, ничего не делал. Сохранил, закрыл. Сменил язык по умолчанию на англ. Открыл - лист так и остался называться Лист1. Теперь уже в англ.локали создал новую книгу с одним листом. Кодовое имя - Sheet1. Сохранил, закрыл. Сменил локаль на рус. Открыл - лист так и остался называться Sheet1.
В чем подвох? Никаких изменений в проект и на лист не вносил. Создал, сохранил, закрыл.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Не раз замечал. Иногда в книге и Sheet, и Лист. Видимо, создавались в разных локалях.
 
Сейчас проверил десяток последних примеров с форумов - большинство с этой проблемой: кодовое английское, видимое русское Sheet1(Лист1). Но не все, есть и Лист1(Лист1).
Недавно на форуме видел файл созданный в какой-то третьей локали (может немецкой или французской) - так там вообще кодовое имя светило неведомыми символами, но было похоже кажется на Sheet1.
Зашёл в редакторе в правку имени - сразу исправилось.
Файл про осеменение - это не мой файл :)
Но ведь очевидно что на этом одном файле разные кодовые имена в зависимости от локали открывающего.
А смесь в одном файле листов и шитов может появиться если какой-то лист копировали или переносили (проверил - получилось). В таком случае макрос вообще может отработать непрогнозируемо - лист ведь будет, но возможно не тот.
Так что я если использую кодовое имя - то всегда сперва его меняю сам, чтоб всюду работало.
 
Цитата
Hugo написал:
в зависимости от локали открывающего
но ведь по сути даже из твоих слов следует, что зависит не от локали открывающего, а от локали создавшего.
Я не спорю, что лучше давать свое имя. Но факт в том, что если даже кодовое имя создано самим Excel в момент создания листа - это имя не изменится при открытии на другом ПК, независимо от локали. Другой вопрос - не везде все кодировки могут быть распознаны, поэтому правильнее будет сказать так: сразу даем кодовое имя нужному листу на английском и с ним работаем.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Думаю что сли бы зависело от локали создавшего - все бы видели так, как видит этот создавший.
Я представляю так - Эксель хранит "умолчательное" имя в каком-то своём внутреннем виде, и показывает его в зависимости от локали открывающего. А если переименовать - то показывает во что переименовали.
 
Получал файлы из Германии: вижу Лист1(Sheet1)
 
Игорь, выкладываю два файла - имена говорят за себя. Один создан в русской локали, второй в английской. Посмотри на кодовые имена и скажи: у тебя они в обоих файлах на англ или в "EnSheets.xls" - на англ, а в "RuSheets.xls" - на рус?

Тут в чем твое противоречие: ты сам пишешь:
Цитата
Hugo написал:
Недавно на форуме видел файл созданный в какой-то третьей локали (может немецкой или французской) - так там вообще кодовое имя светило неведомыми символами
если бы было как ты говоришь и зависело от локали открывшего - то ты бы и увидел Sheet1, а не неведомые символы, на него похожие. Разве не так? И для этого я специально написал:
Цитата
The_Prist написал:
Другой вопрос - не везде все кодировки могут быть распознаны
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
На этих двух файлах у меня всё корректно - в англ. всё на англ., в рус. всё на рус.
Так что бывает по разному, поздравляю - тебе повезло с версией Экселя :)
Думаю это зависит от этого.
 
Да я же не спорю. Просто само по себе должно быть именно так. И хочется понять: действительно ли может быть иначе и если да - то от чего это зависит. Чисто из спортивного интереса.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Юрий М написал: Получал файлы из Германии: вижу Лист1(Sheet1)
вероятно у него была английская локаль.
Интересно скачать что-то с немецкого форума - никто навскидку не даст линк? :)
P.S. где можно качнуть пример без регистрации :)
Изменено: Hugo - 25.01.2016 15:12:15
 
Цитата
Hugo написал: вероятно у него была английская локаль.
Игорь, я ТимВьювером заходил - видел, что интерфейс на немецком.
 
Ну значит точно твой Эксель подставил русское кодовое.
Или может тот файл не на немеччине создан.
Изменено: Hugo - 25.01.2016 15:01:08
 
Цитата
Юрий М написал: я ТимВьювером заходил
А книга была при тебе создана? Или ты её уже с такими именами увидел?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дим, я видел книгу, которая была создана на той стороне. Без моего участия (не при мне), конечно ) Затем я получил её по почте.
 
Для ясности - где я говорил про локаль, я подразумевал локализацию офиса, т.к. локаль у меня всюду раньше была одинаковая, а офисы разные.
 
Я тоже про локаль офиса.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Всем привет, мой вопрос будет все-таки в тему, поэтому пишу здесь.
У меня раньше в книге было 24 листа (12 месяцев и 12 автоотчетов по месяцу) назывались они попарно "12" и "АО 12" (на примере декабря). Раньше у меня для каждого листа был прописан свой код, по которому я работал с двумя парными листами, сейчас же когда я сделал книгу на новый год мне показалось неудобным хранить 12 идентичных кодов и я немного перепилил его под один общий, теперь мой код ориентируется с какого активного листа я его запускаю (по кнопке) и с какого парного ему листа-месяца подтянуть недостающие данные.
Пример куска кода:
Код
Set WBA = ThisWorkbook
Set WS1 = ActiveSheet
Set WS2 = Choose(Right(WS1.Name, 2), _
    WBA.Sheets("01"), _
    WBA.Sheets("02"), _
    WBA.Sheets("03"), _
    WBA.Sheets("04"), _
    WBA.Sheets("05"), _
    WBA.Sheets("06"), _
    WBA.Sheets("07"), _
    WBA.Sheets("08"), _
    WBA.Sheets("09"), _
    WBA.Sheets("10"), _
    WBA.Sheets("11"), _
    WBA.Sheets("12"))
Теперь вопрос, если использовать внутреннее имя листа (codename) как присвоить его переменной, или как присвоить переменной все свойства и методы листа по его внутреннему имени? Дело в том, что начальник просит теперь внедрить мою книгу в отдел всем коллегам, т.к. делать недельный отчет за час или за 5 минут есть существенная разница, а я боюсь того момента что хоть я и предупрежу всех не переименовывать листы книги, кто-нибудь да забудет и переименует (можно конечно поставить защиту, но хотелось бы код перепилить, вдруг еще что вылезет?)
Изменено: GeorgeDark - 26.01.2016 04:43:02
 
Код
Dim Sht1 As Worksheet
    Set Sht1 = MySheet_01 'Где "MySheet_01" - кодовое имя листа

 
GeorgeDark, я бы присваивал это всё примерно так:
Код
Sub tt()
Dim d As Object
Set d = CreateObject("scripting.dictionary")
Set d.Item(Sheet1) = Sheet2
MsgBox ActiveSheet.Name & " в паре с " & d.Item(ActiveSheet).Name
End Sub
Sheet1 и Sheet2 - это мои кодовые имена, код выполняю на активном листе Sheet1.
Работать будет только под Windows (если подключена стандартная библиотека Scrrun.dll)
Изменено: Hugo - 26.01.2016 10:13:34
 
Юрий М, Спасибо огромное! то, чего не доставало самостоятельно нашел на других форумах благодаря знакомым уже пользователям (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 минут. ))) Чего-то я отвлекся... В общем спасибо всем за помощь! Не раз уже убеждался что форум полезный, спасибо и создателю этого сайта!
Страницы: 1 2 След.
Наверх