Книга как переменная excel

Я знаю, что это может возникнуть как тривиальный вопрос, но я не могу объявить workbook или worksheet как переменную в VBA. У меня есть следующий код, но я не могу понять, что я делаю неправильно, это должно быть прямо. Обычно у меня нет проблем с объявлением переменных, таких как Dim i As Integer и т.д.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheet("name")

    wb.ws.Select

End Sub

Когда я запускаю вышеуказанный код, я получаю ошибку type missmatch.

4b9b3361

Ответ 1

Используйте Листы, а не Лист и последовательно активируйте их:

Sub kl()
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = Sheets("Sheet1")
    wb.Activate
    ws.Select
End Sub

Ответ 2

Если рабочий лист, который вы хотите получить, существует во время компиляции в ThisWorkbook (то есть в книге, содержащей код VBA, на который вы смотрите), то самый простой и наиболее надежный способ ссылаться на этот Worksheet объект должен использовать свое кодовое имя:

Debug.Print Sheet1.Range("A1").Value

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

Sheet1 properties

Свойство Name ссылается на «имя вкладки», которое пользователь может изменить по прихоти; свойство (Name) относится к кодовому имени рабочего листа, и пользователь не может его изменить, не обращаясь к редактору Visual Basic.

VBA использует это кодовое имя для автоматического объявления объектной переменной global-scope Worksheet, которую ваш код будет использовать в любом месте, чтобы ссылаться на этот лист, бесплатно.

Другими словами, если лист существует в ThisWorkbook во время компиляции, нет необходимости объявлять для него переменную — переменная уже существует!


Если рабочий лист создается во время выполнения (внутри ThisWorkbook или нет), вам необходимо объявить и назначить для него переменную Worksheet.

Используйте свойство Worksheets объекта Workbook для его получения:

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)

Dim ws As Worksheet
Set ws = wb.Worksheets(nameOrIndex)

Важные примечания…

  • И имя и индекс рабочего листа могут быть легко изменены пользователем (случайно или нет), , если структура рабочей книги не защищена. Если рабочая книга не защищена, вы просто не можете предположить, что только имя или индекс предоставит вам конкретный рабочий лист, который вам нужен, — всегда полезно проверить формат листа (например, проверить, что ячейка A1 содержит определенный текст, или что там таблица с определенным именем, которая содержит некоторые заголовки столбцов).

  • Использование коллекции Sheets содержит объекты Worksheet, но также может содержать экземпляры Chart и полдюжины более старых типов листов, которые не являются листами. Присвоение ссылки Worksheet из любого Sheets(nameOrIndex) возвращает, рискует выбросить ошибку времени несовпадения типа по этой причине.

  • Не квалифицировать коллекцию Worksheets — это неявная ссылка ActiveWorkbook, то есть коллекция Worksheets вытягивается из любой рабочей книги, которая активна в момент выполнения команды. Такие неявные ссылки делают код слабым и подверженным ошибкам, особенно если пользователь может перемещаться и взаимодействовать с пользовательским интерфейсом Excel во время работы кода.

  • Если вы не хотите активировать определенный лист, вам не нужно вызывать ws.Activate, чтобы сделать 99% того, что вы хотите сделать с листом. Просто используйте вместо этого переменную ws.

Ответ 3

Третье решение:
Я бы установил ws на лист книги wb, так как использование Sheet("name") всегда относится к активной книге, которая может измениться по мере развития вашего кода.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    'be aware as this might produce an error, if Shet "name" does not exist
    Set ws = wb.Sheets("name")
    ' if wb is other than the active workbook
    wb.activate
    ws.Select

End Sub

Ответ 4

Попробуйте изменить имя переменной, поскольку иногда она сталкивается с другими модулями /subs

 Dim Workbk As Workbook
 Dim Worksh As Worksheet

Но попробуйте

 Set ws = wb.Sheets("name")

Я не могу вспомнить, работает ли это с Sheet

Ответ 5

У меня была такая же проблема. Я использовал Worksheet вместо Worksheets, и он был разрешен. Не уверен, какая разница между ними.

Ответ 6

Dim ws as Object

Set ws = Worksheets("name")

при объявлении рабочего листа в качестве рабочего листа вместо ojbect У меня возникли проблемы с работой с OptionButtons (Active X) на этом листе (я думаю, это будет и с любым элементом Active-X. Когда объявлено как объект, все работает нормально.

Ответ 7

Много ответов выше! вот мой прием:

Sub kl()

    Dim wb As Workbook
    Dim ws As Worksheet

    Set ws = Sheets("name")
    Set wb = ThisWorkbook

With ws
    .Select
End With

End Sub

ваша первая (возможно, случайная) ошибка, так как мы все упомянули «Лист»… должны быть «Листы»

Этот блок полезен, потому что если вы установите значение wb на что-либо, кроме текущей книги, оно правильно выполнит

Ответ 8

к вашему удивлению, вам нужно объявить переменную для рабочей книги и рабочего листа в Excel 2007 или более поздней версии. Просто добавьте однострочное выражение.

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.select
End Sub

Удалите все остальное и наслаждайтесь.
Но зачем выбирать лист? выбор листов теперь старомодный для расчета и манипуляции.
Просто добавьте формулу, подобную этой

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.range("cell reference").formula = "your formula"
'OR in case you are using copy paste formula, just use 'insert or formula method instead of ActiveSheet.paste e.g.:
   ws.range("your cell").formula
'or
   ws.colums("your col: one col e.g. "A:A").insert
'if you need to clear the previous value, just add the following above insert line
   ws.columns("your column").delete

End Sub

Ответ 9

пожалуйста помоги. У меня есть пользовательские формы в моих двух книгах. сделать передачу данных. но не позволяйте пользовательской форме на пути к месту. книга должна быть открытой или закрытой. как ты будешь благодарен

Частный Sub CommandButton6_Click()

Dim listesatiripersonel As Variant Dim ebtpersonelsonsatir As String

listesatiripersonel = ListBox1.ListIndex + 1

Dim x As Рабочая тетрадь ‘Bu kitap Dim y As Рабочая тетрадь’ Veri aktarma yapacağım kitap

Set x = Workbooks («PERSONEL KAYIT.xlsm») Set y = Workbooks.Open (Имя файла: = («C:UsersismailDesktopuretim_takipMAKİNELEREBT_100.xlsm»))

x.Sheets(«PERSONEL_KAYIT»). Диапазон («A» & listesatiripersonel, «N» & listesatiripersonel). Выберите Selection.Copy

ebtpersonelsonsatir = Workbooks («EBT_100.xlsm»). Sheets («ebtpersonel»). Range («A565536»). End (xlUp).Row y.Sheets(«EBTPERSONEL»). Range («A» & ebtpersonelsonsatir). Выберите Selection.PasteSpecial

y.Save y.Close

Application.WindowState = xlMaximized End Sub

 

Доброго времени суток!  

  Для того, чтобы можно было работать с двумя открытыми книгами, мне необходимо 2-е переменные «Книга1» и «Книга2» (Книга1 — рабочая книга, Книга2 — любая открытая из которой черпаем информацию).  

  Вот начало кода:  
set Книга1 = ThisWorkbook  
set Книга2 =    

  Подскажите пожалуйста, что нужно написать после равно?!  

  Знаю, что можно так:  
iFile = Dir(SelectedItem, vbDirectory)  
но в данном случае не подходит.  

  P.S. Возможно снова неправильно описал свою проблему, поэтому прошу задавать вопросы, буду исправляться.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

 

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

  set Книга1 = ThisWorkbook  
set Книга2 = GetAnotherWorkbook  

  Сама функция GetAnotherWorkbook  
— здесь:

http://excelvba.ru/code/GetAnotherWorkbook

 

Hugo, там все красиво, но там и названия книг известны, у меня же, имя 2-й книги — неизвестно. :(  

  А мне ее, допустим, потом нужно закрыть макросом, без всяких поисков и т.д., например:  
Книга2.Close False

 

Ещё раз перечитал название темы, и понял, что нифига не понял…  

  Что в вашем понимании «открытая книга из проводника»?  
Какая разница, как и откуда она открыта?  
Или её только предстоит открыть?  
А, может, надо отобразить диалоговое окно выбора файла?  
Код для диалогового окна есть здесь:

http://excelvba.ru/code/GetFileOrFolderPath

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Если открытых книг только две, то:  
Public Sub qwe()  
Set Книга1 = ThisWorkbook  
For Each wb In Workbooks  
If wb.Name <> ThisWorkbook.Name Then  
Set Книга2 = wb  
Next  
End Sub  
ТО Hugo: пример от EducatedFool идеально подходил для Ольги. Тут другой случай. Мы втроем не понимаем чего точно хочет автор.

Я сам — дурнее всякого примера! …

 

EducatedFool, Вы все правильно поняли в своем первом посте.  

  «Какая разница, как и откуда она открыта?» — никакой.  

  «А, может, надо отобразить диалоговое окно выбора файла?» — не нужно :)  

  Спасибо большое за ответы и примеры! Буду пробовать. ;)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Забыл(с коленки писал)  
после  
Set Книга2 = wb  
добавить  
End If

Я сам — дурнее всякого примера! …

 

KuklP, спасибо Вам!  

  P.S. можно после «Then» поставить ;)

 

Я как-то обратил внимание на фразу «любая открытая из которой черпаем информацию» — значит название известно. Это кидать информацию можно в любую, а вот черпать имхо надо знать, откуда :)  
Ну хоть по названию листа что-то вроде (код vbs):  
==  
Dim objExcel  

  ActivateExcel  

  Set excelSheet1 = GetSheet(objExcel, «Example1 Sheet Name»)  

  excelSheet1.cells(1,1).value = 10 ‘тест  

  msgbox excelSheet1.cells(1,1).value ‘проверка  

  Private Function ActivateExcel()  
On Error resume next    
Set objExcel = GetObject(, «Excel.Application»)  
If objExcel Is Nothing Then  
Set objExcel = CreateObject(«Excel.Application»)  
   Exit Function  
Else  
   Exit Function  
End If  
End Function  

  ‘The GetSheet method returns an Excel Sheet according to the sheetIdentifier  
‘ExcelApp — the Excel application which is the parent of the requested sheet  
‘sheetIdentifier — the name or the number of the requested Excel sheet  
‘return Nothing on failure  
Function GetSheet(ExcelApp, sheetIdentifier) ‘As Excel.worksheet  
   On Error Resume Next  
   Set GetSheet = ExcelApp.Worksheets.Item(sheetIdentifier)  
   On Error GoTo 0  
End Function

 

Может я плохо пояснил, но слово «любая» на мой взгляд — неизвестная :)  

  А за пример спасибо!

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Это там выше вчера я был :)  
Погоди, как из неизвестной данные тянуть? Значит и данные неизвестно какие? Тогда зачем они?  
Имхо хоть как-то, но эта книга выше по коду будет обозначена.

 

Hugo, неизвестно только название книги, вот и все, данные известны ;)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=ТолькоУчусь}{date=15.06.2010 12:29}{thema=}{post}Hugo, неизвестно только название книги, вот и все, данные известны ;){/post}{/quote}  
Если открыто больше двух книг, то(мой пост14.06.2010, 17:48) Set Книга2 = wb присвоится последней открытой книге. Если же делать проверку по данным в книгах с однотипными данными, то тут «на кого Бог пошлет». Нужен какой-то признак(дата например, в определенной ячейке) по которому выбирать. А у Вас получается: пойди туда, не знаю куда, принеси то…

Я сам — дурнее всякого примера! …

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

ммм, типа такого тогда?  

  Sub tt()  
For Each wb In Workbooks  
Debug.Print wb.FullName  
Next  
End Sub  

  Там внутри сделать поиск известных данных по листам этих wb…  
Что-то общая задача пока неясна — чего сделать-то надо?

 

Hugo, есть Книга1 (основаная, где расположен код программы), название ее Пользователи могут менять на какое-угодно, назавем ее так: Книга1 = х. Для внесения данных в «x» нужно открыть другую книгу, Книга2 = y. Название «y» тоже не известно. Вот.  

  Надеюсь так понятнее? :)

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

:) ненамного.    
Вот это «нужно открыть другую книгу» как будет происходить? Если файл выбирает юзер — открывайте кодом диалог, выбор юзера закрепляете в set. Если файл надо открыть кодом без участия юзера — ну тут уж что-то надо знать, не открывать же подряд все файлы на машине и в сети :)

 

Hugo, ну если не намного, лучше удалить эту тему, а то совсем опозорился, объяснять не умею :)  

  Да и в принципе все понял и тему закрыли модераторы, спасибо за помощь! ;)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=ТолькоУчусь}{date=15.06.2010 04:18}{thema=}{post}Hugo, ну если не намного, лучше удалить эту тему, а то совсем опозорился, объяснять не умею :)  
Да и в принципе все понял{/post}{/quote}  
ТолькоУчусь, ну зачем Вы так? Никто же не отказывает Вам в помощи. Никто не опозорился. Наука задавать вопрос, это тоже наука. От Вас требуется только одно — определитесь, по какому признаку искать(выбирать) нужную Вам книгу. Последняя открытая из диалога? Тогда мой макрос подходит. Или какая-то(любая) из открытых? Тогда признак, иначе как — силой мысли?

Я сам — дурнее всякого примера! …

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

#20

16.06.2010 00:35:41

ТолькоУчусь, зря Вы злитесь — действительно непонятно Ваше объяснение про любую другую книгу, название которой неизвестно. Например, четвёртую в списке, отсортированном по названию. Такое может быть? А вдруг там нет нужных данных? Ведь Вы, пробегая глазами по списку файлов, каким-то образом для себя определяете — ВОТ ЭТУ открыть нужно. Вот Вас и «пытают»… А уж привязать её к переменной — дело техники.  
Или Вас не интересует наличие/отсутствие там данных, а разговор в «в принципе»?  
Наподобие вот этого: «Как открытую и активную в данный момент книгу …?»

Адрес другой книги в формуле в виде переменных

Константин

Дата: Вторник, 13.11.2012, 10:49 |
Сообщение № 1

Добрый день, коллеги.

Возникла следующая проблема — даже дилемма возможно или нет — мне кажется реально, но видимо руки кривоваты.
Есть таблица, в которую необходимо подтягивать статистические данные из другой книги. Во второй книге Ноябрь.xlsx все данные разбиты по датам — каждая дата на отдельном листе и лист имеет название в виде даты, например, 1.11, 2.11, 3.11.
Задача:
на данный момент формула подтягивания выглядит вот так:

Code

='[Ноябрь.xlsx]1.11′!$F102

. То есть из книги ноябрь с листа 1.11 подтягиваем значение ячейки F102. Необходимо сделать следующее: в А1 прописано название месяца, в B1 — число месяца (11) в ячейке, например, I1 число месяца (1). Как подставить в формулу эти значения, чтобы не переписывать формулу для каждого дня, месяца?

 

Ответить

Константин

Дата: Вторник, 13.11.2012, 10:53 |
Сообщение № 2

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

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

Сообщений: 11


Репутация:

0

±

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


Прикрепляю исходный файл.

К сообщению приложен файл:

__46_.xlsx
(14.9 Kb)

 

Ответить

Serge_007

Дата: Вторник, 13.11.2012, 10:56 |
Сообщение № 3

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Можно использовать ДВССЫЛ(), но тогда для работы надо будет что бы открыты были обе книги


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Константин

Дата: Вторник, 13.11.2012, 11:02 |
Сообщение № 4

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

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

Сообщений: 11


Репутация:

0

±

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


Serge_007, как я понял из справки в любом случае файл должен быть открыт, даже если на другую книгу прописать абсолютный адрес через формулу. допустим в ячейку А1 поместить путь С:\…Ноябрь.xlsx? А можно ли ее использовать для прописания пути к файлу в функции ИНДЕКС и ПОИСКПОЗ? будет ли она там работать?

 

Ответить

Serge_007

Дата: Вторник, 13.11.2012, 11:05 |
Сообщение № 5

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Quote (Константин)

в любом случае файл должен быть открыт

Нет, это не так. С открытым файлом работает ЛЮБАЯ функция листа допускающая ссылку, с закрытым — только некоторые


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Константин

Дата: Вторник, 13.11.2012, 11:31 |
Сообщение № 6

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

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

Сообщений: 11


Репутация:

0

±

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


Serge_007, почему то выдает ошибку ССЫЛКА, хотя по шагам вычисления путь получается верный.

в нижней ячейке я прописал формулу при открытом файле, в ячейке I3 прописана формула с абсолютной ссылкой. В любом случае выдается ошибка ССЫЛКА. с чем может быть связано? могу выложить файл с которым работаю.

 

Ответить

Serge_007

Дата: Вторник, 13.11.2012, 11:51 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Нужны два файла-примера на десяток строк


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Константин

Дата: Вторник, 13.11.2012, 11:58 |
Сообщение № 8

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

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

Сообщений: 11


Репутация:

0

±

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


1-й файл это та таблица в которую необходимо все импортировать из файла два.
В файле 1 в ячейке I3 должно быть прописано =ДВССЫЛ($D$1&»[«&$B$1&»]»&J$1&».»&$C$1&»‘!»&$A3) — сейчас стоит другое для показа ссылки

Сообщение отредактировал КонстантинВторник, 13.11.2012, 11:59

 

Ответить

Serge_007

Дата: Вторник, 13.11.2012, 12:43 |
Сообщение № 9

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Вот как это должно выглядеть:

Сами файлы во вложении

К сообщению приложен файл:

4839527.rar
(36.2 Kb)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Константин

Дата: Вторник, 13.11.2012, 13:00 |
Сообщение № 10

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

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

Сообщений: 11


Репутация:

0

±

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


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

 

Ответить

Serge_007

Дата: Вторник, 13.11.2012, 13:06 |
Сообщение № 11

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Quote (Константин)

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

Можно. Вместо названия файла Константин_2 используйте ссылку на ячейку, в которой записано требуемое название файла

Quote (Константин)

вписал в нужную ячейку название месяца и сразу выгрузились данные

Непонятно зачем это, если месяц есть в названии ЛИСТов, с которых мы берём дни в формуле


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Pamix

Дата: Вторник, 12.08.2014, 07:03 |
Сообщение № 12

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

Ранг: Прохожий

Сообщений: 1


Репутация:

0

±

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


Excel 2003

Serge_007, Приветствую, ситуация подобная, но файлы нет возможности держать открытыми. Какими можно воспользоваться функции, чтобы не открывать второй файл?
[moder]Читаем Правила форума, создаём свою тему[/moder]

 

Ответить

5 / 5 / 2

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

Сообщений: 362

1

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

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


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

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



0



Alex77755

11482 / 3773 / 677

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

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

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



Глобальная переменная в проекте VBA Excel. Объявление глобальной переменной в модуле проекта VBA и обращение к ней из других модулей того же проекта.

Объявление глобальной переменной

Глобальная переменная — это переменная, которая объявлена в одном из модулей проекта VBA и доступна для использования во всех остальных модулях.

Чтобы переменная стала глобальной, она должна быть объявлена в начале модуля перед первой процедурой (раздел Declarations) с помощью оператора Public. Этот способ работает во всех модулях проекта VBA Excel.

Допускается объявление глобальной переменной с помощью оператора Global, но такой способ считается устаревшим и на сайте разработчиков уже не упоминается. Объявить глобальную переменную с оператором Global можно только в стандартном модуле.

Пример объявления глобальных переменных в любом модуле проекта VBA:

Public myGlobVar1 ‘по умолчанию — As Variant

Public myGlobVar2 As String

Public myGlobVar3 As Double

Объявление глобальных переменных

Объявление глобальных переменных

Обращение к глобальной переменной

Примеры обращения к глобальной переменной, объявленной в разных типах модулей проекта VBA Excel. Актуально для обращения из модуля любого типа данного проекта.

Переменная в стандартном модуле

Если глобальная переменная (myGlobVar) объявлена в стандартном модуле (Module1) с уникальным именем, не повторяющимся в других модулях, к ней можно обращаться из других модулей по одному имени (в примере — из модуля формы):

Private Sub CommandButton1_Click()

    myGlobVar = «Глобальная переменная»

    TextBox1.Text = myGlobVar

End Sub

Стандартное обращение с указанием имени модуля (Module1), в котором объявлена глобальная переменная (myGlobVar):

Private Sub CommandButton1_Click()

    Module1.myGlobVar = «Глобальная переменная»

    TextBox1.Text = Module1.myGlobVar

End Sub

Переменная в модуле книги

Глобальная переменная (myGlobVar), объявленная в модуле книги, доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:

Sub Primer1()

    ThisWorkbook.myGlobVar = «Глобальная переменная»

    MsgBox ThisWorkbook.myGlobVar

End Sub

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

Обращение к глобальной переменной (myGlobVar), объявленной в модуле рабочего листа (Лист1), из других модулей по имени листа (в проводнике проекта находится без скобок слева от имени ярлыка):

Sub Primer2()

    Лист1.myGlobVar = «Глобальная переменная»

    MsgBox Лист1.myGlobVar

End Sub

По имени ярлыка (в проводнике проекта находится в полукруглых скобках справа от имени листа):

Sub Primer3()

    Worksheets(«Лист1»).myGlobVar = «Глобальная переменная»

    MsgBox Worksheets(«Лист1»).myGlobVar

End Sub

Переменная в модуле формы

Глобальная переменная (myGlobVar), объявленная в модуле формы (UserForm1), доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:

Sub Primer4()

    UserForm1.myGlobVar = «Глобальная переменная»

    MsgBox UserForm1.myGlobVar

End Sub

Переменная в личной книге макросов

Обращение к глобальной переменной (myGlobVar), объявленной в модуле ЭтаКнига проекта VBAProject (PERSONAL.XLSB) из модуля проекта VBA обычной книги Excel:

Sub Primer5()

    Workbooks(«PERSONAL.XLSB»).myGlobVar = «Глобальная переменная»

    MsgBox Workbooks(«PERSONAL.XLSB»).myGlobVar

End Sub

Мне не удалось получить доступ из проекта VBA текущей книги Excel к глобальной переменной, объявленной в стандартном модуле личной книги макросов.


Понравилась статья? Поделить с друзьями:
  • Книга истории полей в excel скачать бесплатно
  • Книга закрывает другую excel
  • Книга ms excel для чего служит
  • Книга microsoft word 2019
  • Книга доходов усн в формате word