Excel vba воспринимать текстовую переменную как список
Перейти к содержимому

Excel vba воспринимать текстовую переменную как список

Excel vba воспринимать текстовую переменную как список

Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите восстановить пароль

Поиск по форуму
Расширенный поиск
К странице.

Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение — создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова — «Помогите», «Нужна помощь», «Срочно», «Пожалуйста».
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос — одна тема
Прочитайте правила и заново правильно создайте тему.

Добрый день. У меня два вопроса.

Первый: Подскажите, пожалуйста, как правильно прописать (программно), что значение ячейки есть список (Данные – Проверка — Список).

И второй вопрос относительно выделения ячеек в цикле.
Есть цикл:
Do While i < 27
nn = "C" + Trim(Str(i))
Range (nn).Select
Loop

Судя по реакции Excel, это полная нелепица… и nn просто не имеет права быть строковой переменной. Дайте совет знатока, как через Range () правильно выделять ячейки в цикле.

как правильно прописать (программно), что значение ячейки есть список

Запустите макрос test, а потом посмотрите, что получилось в указанных ячейках.

второй вопрос относительно выделения ячеек в цикле

Вот только зачем выделять ячейки в цикле .
Визуальные эффекты при работе макроса нужны?

Для работы с ячейками их совсем не обязательно выделять.
Что Вы пытаетесь сделать при помощи этого кода?

__ Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов

EducatedFool
Посмотреть профиль
Найти ещё сообщения от EducatedFool
Do While i < 27
nn = "C" + Trim(Str(i))
Range (nn).Select
Loop
Судя по реакции Excel, это полная нелепица

не согласен с последним утверждением, для экселя — это вполне нормальный код. Вот смысл этого цикла и корректность его выполнения действительно вызывают сомнения. 2 ошибки указал EducatedFool. Реакция эксель, видимо, была таковой: остановка выполнения по ошибке 1004. Не известно значение i на входе в цикл, но можно предположить, что оно равно 0. Если это так, то 1004 ошибка — самая правильная реакция на ваш код.

и nn просто не имеет права быть строковой переменной

абосолютно ошибочное утверждение. еще как может. Выполните цикл подправленный EducatedFool и увидите это. Только результатом работы этого цикла будет поочередно отмеченные ячейки начиная с С1 и заканчивая С27. У меня возникло предположение, что вы хотели отметить 27 первых ячеек колонки С. Это можно было сделать одной строкой Range("C1:C27").Select. Можете убедиться, что переданная в Range строка "C1:C5" приводит к правильному выполнению метода Select.

Дайте совет знатока, как через Range () правильно выделять ячейки в цикле.

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

Могу ли я установить имя переменной с текстовым полем? VBA Эксель

Могу ли я установить имя переменной с помощью TextBox (Vba Excel)? Мне нужно ввести новую группу продуктов так, как я пишу название группы в TextBox и нажимаю кнопку команды. Код должен взять строку из текстового поля и установить эту строку как имя нового созданного массива.

Вы пробовали что-нибудь? Пожалуйста, поделитесь своими усилиями

Ни за что. Но зачем вам менять имя переменной?

@FunThomas: Нет, это неправда. Вы можете создавать переменные во время выполнения. К сожалению, это нигде не задокументировано (или, по крайней мере, я нигде об этом не читал)

На самом деле я не хочу менять имя переменной. Я просто хочу создать новую переменную (или массив) во время выполнения. Мне нужно проверить, существует ли уже строка в текстовом поле в списке переменных, и если нет, то создать новую переменную с именем этой строки в текстовом поле.

Использовать коллекцию или словарь?

@ Siddharth Rout: Вы можете создавать объекты, но Создайте переменная, которая держит этого объекта? И это добавляется в таблицу символов во время выполнения? Как бы вы получили доступ к этому в своем коде (без ошибки компиляции)? Мой мозг слишком мал, чтобы даже понять все последствия.

Формы c голосовым вводом в React с помощью Speechly

Flatpickr: простой модуль календаря для вашего приложения на React

Что такое cURL в PHP? Встроенные функции и пример GET запроса

Ответы 2

В общем, делать это не рекомендуется. Однако вы можете запрограммировать свой собственный класс, чтобы затем удерживать свои GroupName и Data . Обычно я использую collections в качестве контейнеров данных, а не массивов. Тогда класс MyClass будет выглядеть так:

Это выглядит довольно сложно, но на самом деле очень просто. У вас есть инкапсуляция с использованием закрытого типа TModel . Там вы храните данные. Используя Property Get и Property Let , вы можете получить и передать свою собственность класса. Это может быть использовано как это в Module .

Таким образом, каждая переменная типа MyClass имеет имя и данные.

Lucas Raphael Pianegonda

I just want to create a new variable (or array) at runtime.

Считается, что это невозможно. Но это. Это нигде не задокументировано (по крайней мере, я нигде не читал).

Логика:

Мы просто запрограммируем редактор VBA во время выполнения для создания нового массива. Подробнее о программировании редактора VBA можно прочитать на сайте Чипа Программирование редактора VBA.

Примечание

  1. Убедитесь, что вы установили ссылку на Microsoft Visual Basic For Applications Extensibility 5.3
  2. Я не занимаюсь обработкой ошибок. Не стесняйтесь включать это в свой код.

В приведенном ниже коде мы создадим массив MyArray и измерим его, чтобы сказать размер 5

Код

Когда вы запускаете код, создается новый модуль, и в этот модуль вводится некоторый код. Затем этот код снова вызывается во время выполнения. Приведенный ниже код не существует, когда вы запускаете код.

Хе-хе, мне это нравится. А затем поставить On error resume next при проверке, существует ли уже переменная. И, конечно же, удалите модуль в конце. Отладка невозможна (выдает ошибку) — никто не сможет понять ваш код.

Такие вопросы вдохновляют меня на создание блогов на моем сайте. Создал запись в блоге на Создать новую переменную/объект во время выполнения 😀

Использование переменных в под процедурах Excel в Visual Basic для приложений

В этой статье описано, как использовать переменные Microsoft Excel под процедурах в Microsoft Visual Basic для приложений.

Дополнительные сведения

Переменные в под процедуре

Мощной функцией языков программирования является возможность хранить данные в переменной, чтобы содержимое переменной можно было использовать или менять позже. В этом документе обсуждается следующее использование переменных в Visual Basic:

Как объявляются переменные.

Процедуры и проекты, которые могут использовать переменную.

Время жизни переменной.

Объявление переменной в макросе

Самый простой способ объявить переменную в макросах — использовать отчет Dim. В следующей строке две переменные объявлялись как integers(integers).

Dim x As Integer, y As Integer

Если для переменных x и y заданы целые числа, вы указываете Visual Basic выделить достаточно памяти для переменной целого числа (по 2 на x и y) и что данные, хранимые в x или y, являются целым числом в период между -32768 и 32767.

ПРИМЕЧАНИЕ: Если вы объявляете несколько переменных с помощью одной выписки Dim, необходимо указать тип данных для каждой переменной.

Если не указать тип данных для каждой переменной, как в следующем коде Visual Basic, то переменная y будет настроена как переменная с типом данных типа integer. Переменная x будет иметь тип типа variant:

Dim x, y As Integer

Дополнительные сведения см. в приведенной ниже таблице Variant.

Чтобы выполнить проверку переменной, выполните следующие действия:

Сохраните и закроите все открытые книги, а затем откройте новую книгу.

Запустите редактор Visual Basic (нажмите ALT+F11).

В меню Вставка выберите пункт Модуль.

Введите следующий код:

Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox «значение x — » & x & _
Chr(13) & «значение y — » & y
End Sub

Запустите Variable_Test макрос. Вы получаете следующее сообщение: the value of x is 10

the value of y is 100

Нажмите кнопку ОК.

В макро Variable_Test изменить следующую строку:

Запустите Variable_Test макрос.

Вы получите ошибку во время запуска, так как «ошибка» не является integer, и вы пытаетесь назначить это строковую величину для переменной x.

Сводка по типам данных

Это распространенные типы данных переменных:

распространенные типы данных переменных

тип данных Variant

Если не указать тип данных при объявлении переменной или вообще не объявлять переменную, Visual Basic автоматически определяет тип данных переменной типа переменной. Ниже следующую информацию о преимуществах переменных, объявленных в качестве этого типа данных:

Переменные могут содержать строку, дату, время, boolean или числовую величину.

Переменные могут автоматически преобразовывать содержащиеся в них значения.

Недостатком является то, что для переменных требуется не менее 16байт памяти. 16 bytes of memory can be significant in large procedures or in complex modules.

Чтобы узнать, как это работает в макросе Variable_Test, выполните следующие действия:

Измените код макроса Variable_Test на:

Запустите Variable_Test макрос.

Вы не получите сообщение об ошибке, так как вы можете назначить что-либо переменным x и y.

ПРИМЕЧАНИЕ: Вы также можете не использовать следующую строку, и макрос будет по-прежнему работать, так как переменные x и y будут рассматриваться как типы данных Variant:

Область действия переменной

Когда вы объявляете переменную, она может быть видна другими макросами в том же модуле, в других модулях или в других проектах. Такое доступность переменной в модулях называется областью действия. Область действия может быть трех типов: на уровне процедуры, на уровне частного модуля и на уровне общего модуля. Область действия зависит от того, как и где объявлять переменные или переменные.

Область на уровне процедуры

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

Чтобы убедиться, что переменная с областью на уровне процедуры не видна за пределами процедуры, в которой она объявлена, выполните указанные ниже действия.

Вставка нового модуля в проект.

Введите в этот модуль оба макроса:
Sub Macro1() Dim x As Integer x = 10 MsgBox «x, as seen by Macro1 is » & x ‘next line runs Macro2 Macro2 End Sub Macro2() MsgBox «x, as seen by Macro2 is » & x End Sub

Запустите Макрос1, и вы получите следующее сообщение:

x, as seen by Macro1 is 10

Нажмите кнопкуОК, и вы получите следующее сообщение:

x, as seen by Macro2 is

Нажмите кнопку ОК.

Макрос2 не отображает значение переменной x, так как переменная x является локальной для параметра Macro1.

Объем личных и общедоступных модулей

Вы можете определить переменные в разделе объявлений модуля (в верхней части модуля, над всеми под процедурами) и настроить область действия переменной с помощью открытой выписки, затемной или закрытой выписки. Если перед переменной поместить открытое заявление, переменная будет доступна всем макросам во всех модулях проекта. Если перед переменной поместить перед переменной утверждение Dim или Private, переменная будет доступна только макросам в модуле, в котором она объявлена.

Чтобы увидеть разницу между общедоступным заявлением и заявлением Dim, выполните следующие действия:

Сохраните и закроите все открытые книги, а затем откройте новую книгу.

Запустите редактор Visual Basic редактора.

Вставка модуля в проект.

Вставка другого модуля в проект.

Введите следующий код в этот модуль:

Sub Macro2() x = x * 3
MsgBox x
End Sub

Запустите Macro_1a макрос в первом модуле.

С переменной x, объявленной как «Public x As Integer», все три макроса в проекте имеют доступ к значению x. В первом окне сообщения отображается значение 10. Во втором поле сообщения отображается значение 20 (поскольку x умножается на 2 в Macro_1b). В третьем окне сообщения отображается значение 60 (поскольку значение x было изменено на 20 в Macro_1b а затем умножено на 3 в Макросе2).

Измените строку объявления в первом модуле из:

Public x As Integer

Dim x As Integer

Запустите Macro_1a макрос.

Если переменная x объявлена как «Dim x As Integer», только макрос в первом модуле имеет доступ к значению x. В первом поле сообщения отображается значение 10, во втором — 20 (поскольку x умножается на 2 в Macro_1b), а в третьем — значение 0 (так как в Макросе2 не отображается значение x, а в макросе 2 используется неинициализированное значение нуля).

Измените строку объявления в первом модуле из:

Dim x As Integer

Private x As Integer

Запустите Macro_1a макрос.

Те же поля сообщений отображаются с использованием области Private statement, как при использовании statement Dim. Переменная x имеет ту же область действия, что и модуль, где она объявлена.

ПРИМЕЧАНИЕ: Если вы хотите ограничить область действия переменной модулем, в котором она объявлена, используйте privatestatement вместо dim. Оба этих эффекта будут одинаковыми, но при использовании закрытой выписки область действия будет более четкой.

Срок жизни переменной

Время, в течение которого переменная сохраняет значение, называется сроком жизни. Значение переменной может изменяться в течение ее жизненного времени, но при этом сохраняется значение. Кроме того, если переменная теряет область действия, она теряет значение.

Инициализация значения переменной

При запуске макроса все переменные инициализируются со значением. Числовая переменная инициализирована до нуля, строка переменной длины — в нулевую строку («»), а строка фиксированной длины заполняется кодом ASCII 0. Переменные Variant инициализируются как пустые. Пустая переменная представлена нулем в числовом контексте и пустой строкой («») в строковом контексте.

Переменные уровня процедуры

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

Чтобы продемонстрировать работу переменных на уровне процедуры, выполните указанные ниже действия.

Вставка нового модуля в проект.

В этом модуле введите оба макроса:

Sub Macro1()
‘set x as a procedure level variable
Dim x As Integer
MsgBox «инициализированное значение x — » & x
x = 10
MsgBox «x is » & x
‘следующая строка запускает Макрос2
Макрос2
MsgBox «x is still » & x
End Sub
Sub Macro2()
MsgBox «x, as seen by Macro2 is » & x
End Sub

Вы получаете следующее сообщение:

the initialized value of x is 0

Нажмите кнопкуОК, и вы получите сообщение:

Нажмите кнопкуОК, и вы получите следующее сообщение:

x, as seen by Macro2 is

Нажмите кнопку ОК.

Макрос2 не отображает значение переменной x, так как переменная x является локальной для параметра Macro1. Вы получите следующее сообщение:

Нажмите кнопку ОК.

Запуск макроса1.

Вы получаете те же сообщения, что и в шагах 3–6, так как как макрос1 перестал работать на шаге 6, значение переменной x было потеряно. Таким образом, при повторном повторе макроса 1 в шаге 7 в первом сообщении будет показано значение x в качестве нуля (инициализированное значение).

Статическое ключевое слово

Если переменная на уровне процедуры объявлена с помощью статического ключевого слова, переменная сохраняет значение до сброса проекта. Таким образом, если у вас есть статическая переменная, то при следующем вызове процедуры статическая переменная инициализирована до последнего значения.

Чтобы узнать, как работает статическое ключевое слово, выполните следующие действия:

Вы получите сообщение: the initialized value of x is 0

Нажмите кнопкуОК, и вы получите сообщение:

Нажмите кнопку ОК.

Запустите Макрос1, и вы получите следующее

сообщение: the initialized value of x is 10

Нажмите кнопкуОК, и вы получите следующее сообщение:

Нажмите кнопку ОК.

Значения, которые отображаются в сообщениях, во второй раз отличаются, так как переменная x объявляется как статическая переменная, а значение переменной сохраняется после первого запуска макроса Macro1.

ПРИМЕЧАНИЕ: Если у вас есть переменная уровня модуля, ее время существования будет таким же, как если бы она была статической переменной на уровне процедуры.

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

Запустите Макрос1, и вы получите следующее сообщение:

the initialized value of x is 0

Нажмите кнопку ОК, и вы получите следующее сообщение:

Нажмите кнопку ОК,

Запустите Макрос1, и вы получите сообщение:

the initialized value of x is 10

Нажмите кнопку ОК.

Вы получаете следующее сообщение:

Нажмите кнопку ОК.

Значения, которые отображаются в сообщениях, во второй раз отличаются, так как переменная x объявлена как статическая переменная и сохраняет значение после первого запуска макроса Macro1.

Сброс проектов для сброса переменных

Если вы хотите сбросить значение статической переменной или переменной на уровне модуля, нажмите кнопку Сброс на
Стандартная панель инструментов или нажмите кнопку Сброс в меню Выполнить.

Если вы сделаете это для проекта Macro1, а затем повторно запроизводили макрос1,значение переменной x инициализировано до нуля, и вы получите первое сообщение:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *