Страницы: 1
RSS
Синтаксис оператора: With objectExpression: как записать объект переменной
 
Синтаксис оператора:
Цитата
With objectExpression  
[ statements ]  
End With
Как записать что бы objectExpression = MyVar
т.е. что бы операция выглядела следующим образом
Код
With MyVar  
...
End With

где MyVar это переменная состоящая из нескольких текстовых символов и имеет ограниченное число значений
 
Цитата
Олег_Архипка написал:
состоящая из нескольких текстовых символов
Цитата
Олег_Архипка написал:
objectExpression = MyVar
оператор with используется к обьектам. Судя по вашому вопросу, ваша переменная - текст.
пример использования
Код
dim rng as worksheet
set rng=ActiveSheet
with rng
   .Range("A1")=1
   .Range("A2")=2
end with
Изменено: ivanok_v2 - 24.10.2018 18:24:08
 
Именно так, как сделать что бы блок With производил операции именно с нужным в данный момент объектом, MyVar как раз соответствует названию объекта
 
Вас в таком варианте объяснений никто не понимает. Что в Вашем понимании "нужный объект"? Как понять какой именно является нужным в тот или иной момент? Конструкции WIth вообще параллельно что за объект - она просто запоминает к нему ссылку и подставляет её перед точкой.
Если опираться на Ваше описание, то совершенно непонятно какие сложности у Вас с применением.
Код
Set MyVar = нужный_объект
With MyVar
    .какое_то_свойство_или_метод
End With
Изменено: Дмитрий(The_Prist) Щербаков - 24.10.2018 18:32:08
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Например, цикл по отдельным листам книги
Код
ShtName = array("янв", "фев", "мар", "и пр.")
For i=LBound(ShtName) to UBound(ShtName)
  With WorkSheets(ShtName(i))
  ...
  End With
next

 
Я понимаю, вы предлагаете вначале записать значение переменной MyVar в ячейку и уже от туда значение попадет к оператору With.
А без ячейки возможно это осуществить только средствами VBA?  
 
Цитата
Олег_Архипка написал:
предлагаете вначале записать значение переменной MyVar в ячейку
кто Вам это предлагает? Вам просто примеры приводят, т.к. от Вас минимум информации о том, что и как у Вас в эту MyVar вообще попадает.
Цитата
Олег_Архипка написал:
MyVar как раз соответствует названию объекта
как это понимать? MyVar - это название объекта? А что за объект такой? Откуда он берется и почему от него только название в текстовом виде?
Изменено: Дмитрий(The_Prist) Щербаков - 24.10.2018 18:37:51
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Олег_Архипка написал:
предлагаете вначале записать значение переменной MyVar в ячейку и уже от туда значение попадет к оператору With
а где именно вам ето предложено?

with нужен для упрощения кода.
дабы не писать одно и тоже несколько раз
 
Дмитрий(The_Prist) Щербаков, мне тоже так казалось: напишу MyVar=today и все будет работать как будто With today .... и перед точкой буд то бы везде today но ничего подобного не происходит не хочет
 
Олег_Архипка, если сработает Set MyVar = today, тогда будет работать и With today.
Другое использование оператора With - с переменной пользовательского типа. См. F1 - Type Statement.
А с переменными простых типов With не работает, это совершенно не нужно.
 
Прошу извинить если не смог сразу изложить точно проблему. Попробую еще раз.
У меня записан некий перечень операций. Все операции используют только переменные одного объекта. Допустим сам объект называется aaa переменные которые заданы как глобальные с помощью оператора Type имеют соответственно следующие названия aaa.today   aaa.yesterday ... Но таких объектов несколько десятков bbb  ccc ... И по некоторым из них нужно произвести точно такие же операции. Все операции записаны в отдельном модуле в процедуре между With ...  и End With для того что бы все операции были произведены только с привлечением переменных нужного в данный момент объекта. Сам объект, нужный в данный момент со всеми переменными определяет некая другая переменная которая по сути выполняет роль индикатора: если MyVar = "aaa" значит нужно запустить весь процесс с переменными объекта aaa, по завершению MyVar может принять значение "ccc" и тогда все вычисления должны быть выполнены с переменными объекта ccc
 
Код
Set Obj_ = Range("A1:A100")

With Obj_...
 
Цитата
ivanok_v2 написал:а где именно вам ето предложено?
Код
dim rng as worksheet
set rng=ActiveSheet
with rng
  .Range("A1")=1
  .Range("A2")=2
end with
 
Цитата
Олег_Архипка написал:
MyVar может принять значение "ccc" и тогда все вычисления должны быть выполнены с переменными объекта ccc
Ну так и работайте со свойствами (переменными в вашем понимании) этого объекта. Наверное, неплохо было бы прочитать про ООП и понять как объекты работают. with просто упрощает синтаксис доступа к членам объекта.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Олег_Архипка написал:
переменные которые заданы как глобальные с помощью оператора Type имеют соответственно следующие названия aaa.today   aaa.yesterday ... Но таких объектов несколько десятков bbb  ccc ...
На втором десятке сообщений из словесного тумана начинают проступать контуры проблемы  :D
Почему бы не создать массив переменных пользовательского типа?
А "операции", которые "записаны в отдельном модуле в процедуре между With ...  и End With", должны быть в процедуре, не обязательно в отдельном модуле, и этой процедуре можно передавать тот или другой элемент массива пользовательского типа.
 
Цитата
Казанский написал:
если сработает Set MyVar = today, тогда будет работать и With today
aaa.today aaa.yesterday и пр. aaa. ... это все переменные одного объекта имеющего название aaa, переменные заданы в отдельном модуле следующим образом
Код
Type vars
today As Byte
yesterday As Byte
...
End Type

В другом модуле все объекты со всеми переменными объявлены глобально
Код
Public aaa As vars
Public bbb As vars
Public ccc As vars
...

В третьем модуле записана основная процедура расчетов, она должна происходить только с переменными типа aaa. ...   либо только с переменными типа bbb. ... и так далее.
Код
With aaa
...
End With

или
Код
With bbb
...
End With

Прописать в модуле двадцать одинаковых блоков с aaa, bbb, ccc, и т.д. плохая идея т.к. блок имеет большой код вычислений. Вот я и пытаюсь найти способ как автоматически в зависимости от текущей необходимости подставлялись нужные три буковки после слова With

Это наверное можно решить с помощью ячейки, пусть в ячейку Range ("A1") автоматически будут прописываться три нужные буквы, тогда
With WorkSheets.Range("A1")
...
End With
В операциях будут участвовать все переменные с нужными на данный момент буквами впереди перед точкой.
Но как это сделать без привлечения таблицы excel только средствами VBA?  
Изменено: Олег_Архипка - 24.10.2018 21:19:29 (до писал)
 
Цитата
Олег_Архипка написал:
Прописать в модуле двадцать одинаковых блоков с aaa, bbb, ccc, и т.д. плохая идея
а не приходила идея написать в модуле 1 процедуру:
Код
Sub Пересчитать(v as vars)
  with v
  end with
End Sub

Sub Main
  dim aaa as vars, bb as vars ...
  Пересчитать aaa
  Пересчитать bbb
End sub

Пересчитать записываете 1 раз  и можете через нее прогнать хоть тысячу переменных типа vars
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
а не приходила идея написать в модуле 1 процедуру
Спасибо что подсказали, в моем случае все немного иначе, но в вашем решении я кажется увидел то что мне может подойти. Не судите строго я с VBA впервые познакомился лишь пару месяцев назад. А вам огромное спасибо, без подсказки очень тяжело начинающим.
 
Еще раз спасибо Игорю Гончаренко! Теперь все работает.
Решение действительно оказалось простым. Задавая процедуру, содержащую основной процесс вычислений, нужно указать в скобках аргумент название не имеет значение причем тип ему задать пользовательский тот самый, который указан в Type у меня например этот список называется vars (переменные). Все переменные должны быть уже заданы посписочно, у меня они заданы глобально перед процедурой
Код
Public aaa As vars
Public bbb As vars
Public ccc As vars
...
Public MyVar

Sub Dis ()
MyVar = "aaa"   т.е. любое нужное в данный момент значение, которое указывается автоматически а не в ручную как здесь 
If MyVar = "aaa" Then
Vsepuchkom aaa
ElseIf MyVar = "bbb" Then
Vsepuchkom bbb
...
End If
End Sub

В другом модуле:

Public Sub Vsepuchkom (tribukvi As vars)
With tribukvi
...
End With
End Sub
Изменено: Олег_Архипка - 25.10.2018 01:24:57
 
Олег_Архипка, Вы правда ничего не слышали про массивы? Почитайте какой-нибудь букварь по VBA/VBS. И про коллекцию тоже. Код может выглядеть так
Код
Public aaa(1 To 100) As vars
Public MyVar
Public MyCol As Collection 'в коллекции сопоставлены пары "aaa"-1, "bbb"-2 и т.д.

Sub Dis()
MyVar = "aaa" '   т.е. любое нужное в данный момент значение, которое указывается автоматически а не в ручную как здесь
Vsepuchkom aaa(MyCol(MyVar)) 'передать в процедуру элемент массива с номером, который соответствует тексту в MyVar
End Sub
 
'В другом модуле: - можно и в этом
 
Public Sub Vsepuchkom(tribukvi As vars)
With tribukvi
'...
End With
End Sub
Страницы: 1
Наверх