Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
15 / 4 / 0
Регистрация: 11.08.2012
Сообщений: 157
Excel

Процедурное создание переменной своего типа

13.06.2021, 22:26. Показов 3202. Ответов 7
Метки нет (Все метки)

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

Не хватает знаний и понимания как сделать такую штуку:
На лист в ячейки вводятся некие исходные данные, например A1=Vasya, A2=Petya, A3=Misha и т.д. Количество данных переменное и неизвестно заранее. Есть пользовательский тип данных, пусть будет Student. Определяю количество введенных данных, пусть их будет 3. Для каждой из 3 позиций считываю содержимое ячейки ("Vasya", "Petya", "Misha"). Вопрос: как из программы создать переменную типа Student с именем "Vasya", "Petya", "Misha"? То есть зная заранее количество и имя переменных я их втупую могу забить Dim Vasya As Student и т.д., а когда я не знаю ни количества, ни имени - не понимаю как сделать.

Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.06.2021, 22:26
Ответы с готовыми решениями:

Объявление переменной своего типа
Есть код #include <iostream> #include <iomanip> //#include "complexz" using namespace std; int main(){ double a,b,c,d; ...

Как присвоить переменной своего класса переменную встроенного типа
Подскажите пожалуйста?!Как присвоить переменной своего класса переменную встроенного класса? class String { char *string; int...

Создание своего типа
Доброго времени суток! Немножко нубская проблема, но никогда не делал типы в С# Как в С# создать свой тип? Вот например есть...

7
 Аватар для Narimanych
2751 / 1725 / 779
Регистрация: 23.03.2015
Сообщений: 5,449
13.06.2021, 22:57
iskan13,

Как вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Type Student
name  As String
surname As String
dob As Date
End Type
 
 
Sub MMM()
Dim Vasya As Student
Vasya.name = "Вася"
Vasya.surname = "Пупкин"
Vasya.dob = 5 / 31 / 1980
End Sub
0
349 / 190 / 108
Регистрация: 01.04.2020
Сообщений: 537
13.06.2021, 22:57
Работа с массивом данных вам не подходит? Зачем надо для каждой строки с данными создавать свою переменную?
0
15 / 4 / 0
Регистрация: 11.08.2012
Сообщений: 157
13.06.2021, 23:11  [ТС]
Narimanych, я как раз и говорю, что я не могу объявить переменную руками, как вы написали
Цитата Сообщение от Narimanych Посмотреть сообщение
Dim Vasya As Student
так как я не знаю ни имени, ни количества этих переменных до запуска программы. Поэтому такой вариант не подходит.

elixi, я специально сильно утрировал задачу, в действительности мой тип переменной содержит порядка 20 индивидуальных значений, к которым удобнее обращаться по имени переменной, чем по индексу массива =) отсюда и вопрос.

Нужно что-то такое:
Visual Basic
1
2
3
4
5
6
Sub createStudent()
  studentCount=Worksheets("Данные").Cells(1, 1).End(xlDown).Row
  for i=1 to studentCount
    [создать переменную типа Student c именем Worksheets("Данные").Cells(studentCount, 1).Value]
  Next
End Sub
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12219 / 5061 / 813
Регистрация: 07.08.2010
Сообщений: 14,920
Записей в блоге: 4
14.06.2021, 07:30
Цитата Сообщение от iskan13 Посмотреть сообщение
я специально сильно утрировал задачу, в действительности мой тип переменной содержит порядка 20 индивидуальных значений
скорей всего обработка состоит
- справка по конкретному студенту(например Васе)
- получить список двоешников(без разницы кто-это)

вряд ли понадобятся данные типа Вася+Петя

поэтому применила бы перечисление(подзабыла синтаксис, давно не использовала)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
enum stydent
fam =11   ''номер столбца в таблице, можно не по порядку
surname=12
zachetka=1
....
end enum
 
'далее обычная обработка 
 
msgbox cells(nstroka,stydent.fam)
'изменив индекс только в перечислении - изменятся индексы и в коде
Добавлено через 20 минут
iskan13,
type удобно, если множество расчетных полей и неудобно прописывать формулами или они с разных листов
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Type Student
name  As String   '' из табл
surname As String  '' из табл
fullname as string  '' расчетные
fio as string  '' расчетные
dob As Date  '' из табл
wozrast as long  '' расчетные
End Type
''''''''''''''''''''''''''''''''''' 
 Sub createStudent()
  studentCount=Worksheets("Данные").Cells(1, 1).End(xlDown).Row
  for i=2 to studentCount
    mmm j
  Next
End Sub
''''''''''''''''''''''''''''''''
Sub MMM(nstroka)
Dim st As Student
'информация с листа по строке
st.name = cells(nstroka,11)
st.surname =cells(nstroka,12)
'все расчеты  по строке в одном месте  -----это не формулы
st.fullname=st.surname & " " & st.name
st.fio=st.surname & " " & mid(st.name,1,1) & "." 
st.dob = cells(nstroka,25)
st.wozrast=datediff("yyyy",st.dob,date())
debug.print st.fio,st.dob,st.wozrast
End Sub
0
sleep
 Аватар для I can
4914 / 4551 / 837
Регистрация: 13.04.2015
Сообщений: 9,675
14.06.2021, 09:27
Цитата Сообщение от iskan13 Посмотреть сообщение
как из программы создать переменную типа Student с именем "Vasya", "Petya", "Misha"?
Можно сделать поиск в массиве по имени, тогда не придётся изобретать велосипеды.
Пример
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Type Student
    name As String
    age As Integer
End Type
 
Dim stud() As Student
 
Private Sub main()
    ReDim stud(1 To 3)
    stud(1).name = "Vasia"
    stud(1).age = 19
    stud(2).name = "Petia"
    stud(2).age = 21
   
    MsgBox GetStudByName("Vasia").age  '   выдаст 19
    
End Sub
 
 
Private Function GetStudByName(studName As String) As Student
    Dim i As Integer
    For i = 1 To UBound(stud)
        If studName = stud(i).name Then GetStudByName = stud(i)
    Next i
End Function
0
15 / 4 / 0
Регистрация: 11.08.2012
Сообщений: 157
14.06.2021, 10:46  [ТС]
shanemac51, вы все правильно поняли, все поля в моем типе расчетные, а не просто содержащие данные из ячейки. Поэтому использую свой тип. Еще раз подчеркну, что пример с Васями и Student'ами - не более чем максимальное упрощение и абстракция. Так или иначе вопрос не в том, где удобнее хранить данные, а в том, возможно ли реализовать сабж =)

I can, ваш вариант наиболее подходит под мое описание, в принципе вопрос обращения по имени решается небольшой функцией (GetStudByName), единственное, что при каждом обращении к переменной будет прогоняться эта функция, по идее это не должно сильно тормозить выполнение программы. В целом для моей задачи это решение подходит.

Вы говорите "не придется изобретать велосипеды" - я как человек малоопытный и решающий задачи по мере их поступления и своих знаний имею очень скромное представление о многообразии стандартных функций и методов VBA. И не пытаюсь ничего изобрести, как раз наоборот, хочу выяснить у более опытных товарищей, можно ли реализовать то или иное решение с минимальным количеством костылей и велосипедов =) Ведь как правило "все придумано до нас", я тут не космические корабли на Марс запускаю, так что возможно ответ где-то на поверхности, нужен просто совет, куда копать.

Поэтому все-таки хочу уточнить: возможно ли создание переменной внутри программы с именем, заданным в другой переменной или функцией? По сути не важно, пользовательский это тип или один из стандартных, интересует в принципе идея.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
14.06.2021, 12:32
iskan13, то, что Вы хотите, на самом деле не может быть правильным. Предлагаю другой подход: читаете наименование с листа, заполняете структуру и заносите ее в коллекцию или словарь под соотв. ключом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2021, 12:32
Помогаю со студенческими работами здесь

Создание своего типа в powershell
Возможно ли в PS создание собственных типов и использование их. т.е - сначала объявляешь тип, - при вызове процедуры указываешь...

Создание своего типа данных
Здравствуйте, Коллеги! Пытаюсь создать свой тип данных, но уперся в проблему, которую не понимаю. Прошу объясните, почему так и как...

Приведение переменной типа object к переменной производного типа в приложенном коде
Добрый день! Столкнулся с проблемой. Есть обработчик события. Обработчик события общий для двух издателей, но издатели разного типа(Пусть...

Создание процедуры для записи переменной типа RECORD
Задача создать процедуру сохранения данных в файл, собранных из объектов на форме. При поиске пользовался данной подсказкой...

Динамическое создание переменной определенного типа с заданным именем
Я пытался использовать перегрузку (String, String) метода Activator.CreateInstance: dynamic h =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru