Страницы: 1 2 3 4 След.
RSS
Знаете ли Вы, что..., Пара трюков в VBA :)
 
Для показа пары трюков мне нужны будут три модуля: модуль класса Student, модуль класса Students и стандартный модуль CollectionTest.

Класс Student:
Код
Private m_Id As Long

Property Get Id() As Long
      Id = m_Id
End Property

Property Let Id(studId As Long)
    m_Id = studId
End Property


Класс Students:
Код
Private colStudents As Collection

Private Sub Class_Initialize()
    Set colStudents = New Collection
End Sub

' Добавляет студента в коллекцию
Public Function Add(stud As Student)
    colStudents.Add stud, CStr(stud.Id)
End Function

' Возвращает количество студентов в коллекции
Public Property Get Count() As Long
    Count = colStudents.Count
End Property

' Возвращает коллекцию студентов
Public Property Get Items() As Collection
    Set Items = colStudents
End Property

' Возвращает студента из коллекции по его ключу
' или порядковому номеру в коллекции
Public Property Get Item(vItem As Variant) As Student
    Set Item = colStudents(vItem)
End Property

' Удаляет студента из коллекции
Public Sub Remove(vItem As Variant)
    colStudents.Remove vItem
End Sub


Стандартный модуль CollectionTest:
Код
Sub WorkWithDefaultProperty()

    Dim st As Student
    Dim sts As Students

    Set sts = New Students   'Создаём новую коллекцию студентов
    Set st = New Student      'Создаём студента
    st.Id = 55

    sts.Add st  'Добавляем студента в коллекцию
End Sub


Trick #1. Свойство по умолчанию.

Все вы знаете, что в VBA есть объекты со свойствами по умолчанию (Default). Например, свойство Item у Worksheets является свойством по умолчанию, что означает, что мы может вместо Worksheets.Item(1) написать просто Worksheets(1).
При выборке студента из коллекции Students было бы очень удобно писать так (продолжая код в CollectionTest):
Код
MsgBox sts(1).Id

вместо
Код
MsgBox sts.Item(1).Id

Но так не получится, IntelliSense нам ничего не показывает:


А теперь вот что необходимо для создания свойства по умолчанию:
1. В Project Explorer нажимаем правую кнопку мыши на модуле Students и выбираем "Remove Students".
2. В появившемся окне на вопрос "Do you want to export Students before removing it?" отвечаем "Yes" и сохраняем его.
3. Открываем сохранённый модуль блокнотом (или другим текстовым редактором). Наше свойство Item выглядит так:
Код
Public Property Get Item(vItem As Variant) As Student    Set Item = colStudents(vItem)End Property

Теперь между Public Property Get и Set Item вставляем строку Attribute Item.VB_UserMemId = 0. В итоге должно получиться:
Код
Public Property Get Item(vItem As Variant) As Student
Attribute Item.VB_UserMemId = 0
    Set Item = colStudents(vItem)
End Property

4. Сохраняем изменения.
5. Импортируем изменённый модуль обратно в VBE либо через "Правая кнопка мыши -> Import File", либо через drag'n'drop.
Теперь можно писать так:
Код
MsgBox sts(1).Id

Вот что теперь показывает IntelliSense:


А вот что показывает Object Browser:



Trick #2. Настоящая коллекция
На настоящий момент коллекция Students - не настоящая коллекция. Нельзя создать итерацию всех студентов в коллекции:
Код
Sub IterateCollection()
    
    Dim st As Student
    Dim sts As Students
    
    Set sts = New Students
    
    ' Добавляем трёх студентов
    Set st = New Student
    st.Id = 11
    sts.Add st
    
    Set st = New Student
    st.Id = 22
    sts.Add st
    
    Set st = New Student
    st.Id = 33
    sts.Add st
    
    ' Не работает!!!
    For Each st In sts
        MsgBox st.Id
    Next
    
End Sub


Чтобы данный код заработал, необходимо изменить класс Students. Выполняем те же действия, что и в Trick #1, только теперь необходимо в класс добавить следующую функцию (colStudents - коллекция; соответственно, необходимо вставить свою переменную):
Код
Public Function NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
    Set NewEnum = colStudents.[_NewEnum]
End F unction


Для теста снова запустите процедуру IterateCollection.
There is no knowledge that is not power
 
Цитата
Знаете ли Вы, что...
да, знаем  :)

ты бы файл приложил )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Выкладываю файл (там, кстати, ещё и интерфейс + ProgressBar).
There is no knowledge that is not power
 
Для тех, кто добрался до классов, это вряд ли секрет  ;)  
Но для новичков может быть интересно еще и это:

3. Как добавить описание, например для Item:
Attribute Item.VB_Description = "Returns a specific member of a Collection object either by index or key"

Описание отображается в Object Browser, если стать на элемент, в данном случае - Item.
Описание можно добавить и  в Object Browser по клику правой кнопки на Item.

4. Иногда можно встретить: Attribute NewEnum.VB_MemberFlags = "40" для того, чтобы в VB NewEnum стал скрытым, но в VBA это игнорируется
Изменено: ZVI - 23.01.2013 13:56:54
 
Trick #3. Создание экземпляров класса за пределами текущей книги
По умолчанию, классы в VBA могут быть или Private, или PublicNotCreatable. Но как мы знаем, VBA имеет свои корни в VB6, а там 6 возможностей создания экземпляров. В частности, 5-MultiUse.
Следующий код позволит создавать экземпляры классы за пределами текущей книги:
Код
Application.VBE.ActiveVBProject.VBComponents("clsMyClass").Properties("Instancing") = 5 'Multi-Use
Изменено: Johny - 04.03.2014 13:49:05
There is no knowledge that is not power
 
Спасибо, полезная инфа
Правда никак не могу настроить себя на подробное изучение модулей класса :)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Цитата
Johny пишет:
И ещё:
Код
 VBE.ActiveVBProject.VBComponents("clsMyClass").Properties("Instancing") = 5 'Multi-Use 

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

Ещё бы знать, насколько это стабильно будет работать...
Вот здесь написано:
Цитата
Для VB6 это свойство будет иметь 6 разных значений:


1 - Private : Экземпляры этого класса не могут быть созданны извне.Более того они извне не видны Вы можете создавать и использовать такие обьекты только изнутри проекта, в которм "сидит" этот класс модуль.


2 - PublicNotCreatable : Экземпляры этого класса тоже не могут быть созданны извне , однако они могут быть использованы если уже созданы "изнутри".


3 - SingleUse : Вы можете использовать CreateObject function или ключевое слово New для создания экземпляров этого класса. При этом каждый новый элемент класса будет стартовать в отдельном "рабочем пространстве" Это свойство не появляется, если вы создаете ActiveX DLL. Обратите внимание вы таки можете насоздавать хоть сотню экземпляров этого класса.


4 -GlobalSingleUse : Префикс Global означает , что использовать этот тип класса можно без дополнительный обьявлений. В остальном это то же самое что и 3


5 - MultiUse : Да, именно, вы можете создавать и использовать экземпляры этого класса отовсюду, при этом допустимо, что одна физическая копия обьекта в памяти будет обслуживать все созданные экземпляры. Некоторые проблемы, связанные с использованием этого свойства(отказ в корректной работе при определенных настройках DCOM ) я расcматривал в статье о настройке DCOM компонентов


6 - GlobalMultiUse : Префикс Global означает , что использовать этот тип класса можно без дополнительный обьявлений, т.е класс создается автоматически, вы можете сразу использовать его свойства и методы как глобальные функции. . В остальном это то же самое что и 5
 
Цитата
EducatedFool пишет:
6 - GlobalMultiUse : Префикс Global означает , что использовать этот тип класса можно без дополнительный обьявлений, т.е класс создается автоматически, вы можете сразу использовать его свойства и методы как глобальные функции. . В остальном это то же самое что и 5
а вот это интересно  :)  Получается, можно создавать что-то вроде пронстранств имен?

только не работает нифига  :D Это 4 -GlobalSingleUse и это 6 - GlobalMultiUse
Изменено: nerv - 24.01.2013 21:18:21
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
EducatedFool пишет:
Эх, как же долго я искал вариант с использованием модулей класса одного файла в другом...
Где ж вы раньше были)))
Я это давно знал, только лично мне это было не нужно - вот и подзабыл, конечно.  :)  
А теперь когда решил написать эту тему, то и вспомнил про Instancing.  :)  

Вот ещё пара трюков.

Тrick #4
Чтобы быть независимым от Option Base, нужно писать так:
Код
Dim i As Integer, s As String, arr As Variant
.....
arr = Array(1, 2, 3, 4)
.....
s = arr(i + LBound(arr) - 1)


Тrick #5
Чтобы нижняя граница массива была всегда 0 независимо от Option Base, нужно писать так:
Код
Dim arr As Variantarr = VBA.Array(1, 2, 3, 4)
Изменено: Johny - 30.01.2013 08:18:23
There is no knowledge that is not power
 
Цитата
Johny пишет:
Тrick #2
Чтобы нижняя граница массива была всегда 0 независимо от Option Base, нужно писать так:
Код
 Dim arr As Variant
arr = VBA.Array(1, 2, 3, 4)
случайно в голову пришло на одном из форумов

Код
Option Base 1

Sub io()
    x = A(1, 2, 3, 4, 5)
End Sub

' финт ушами
Function A(ParamArray param())
    A = param()
End F unction
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
EducatedFool пишет:
Эх, как же долго я искал вариант с использованием модулей класса одного файла в другом...
Где ж вы раньше были)))

Ещё бы знать, насколько это стабильно будет работать...
Игорь, вполне можно обойтись стабильным штатным способом
при свойстве модуля класса Instancing = 2 (PublicNotCreatble)
Пример с комментариями приложен.
Нужно скопировать 2 файли из архива в любую папку, загрузить книгу ZVI_Slave_Workbook.xls
а книга ZVI_Class_Workbook.xls с классом загрузится сама.
Кнопка Run запустит код Test, который работает с модулем класса
Изменено: ZVI - 28.01.2013 08:14:39
 
Цитата
ZVI пишет:
Игорь, вполне можно обойтись стабильным штатным способом
Ну уж про этот способ я писать не стал, так как думал, что:
Цитата
ZVI пишет:
Для тех, кто добрался до классов, это вряд ли секрет
There is no knowledge that is not power
 
Johny, я и себя часто отношу к новичкам - учиться никогда не поздно и интересно.
Ваша тема про классы очень полезна, так как существует стойкое предубеждение, что работать с классами сложно. Из-за этого на форуме редко приводятся решения с использованием модулей классов, за исключением встроенных модулей (классов) книги и листов. Поэтому, чем больше публикаций с примерами простыми или сложными по теме «классы – это не просто, а очень просто», тем лучше.
Изменено: ZVI - 28.01.2013 18:08:30
 
Цитата
ZVI пишет:
так как существует стойкое предубеждение, что работать с классами сложно
скорее неудобно
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
Код
' Стандартный модуль в книге с модулем класса
' Эта функцимя вызывается вместо Set x = New clsPublicNotCreatible
' Функция доступна извне, т.е. из кода других книг
Public Function GetNewInstance() As clsPublicNotCreatible
  Set GetNewInstance = New clsPublicNotCreatible
End F unction

Владимир, спасибо за совет
Я как-то не додумался использовать такой способ для создания экземпляров классов из других книг

Но теперь, зная про Instancing = 5, и этой проблемы нет.
 
Цитата
nerv пишет:
скорее неудобно
Александр, с моей точки зрения вот несколько элементов удобства:
1. Технология IntelliSense вместе с инкапсуляцией - не нужно заглядывать в модуль и фильтровать в уме необходимые свойства, методы, функции, процедуры, события, все они уже отфильтрованы в IntelliSense
2. Поддержка системных (Excel & Office) событий
3. Поддержка пользовательских событий
4. Возможность наследования интерфейса другого класса с помощью Implements
5. Возможность создания экземпляров классов

Уточните, пожалуйста, по сравнению с чем в VBA Вы видите неудобства и какие именно.
Изменено: ZVI - 29.01.2013 09:17:26
 
Цитата
ZVI пишет:
Поэтому, чем больше публикаций с примерами простыми или сложными по теме «классы – это не просто, а очень просто», тем лучше.
Эту тему можно развить дальше.
Например, использование классов для отслеживания событий таких объектов, как, например, Application и Chart.
Все мы знаем, что по умолчанию нельзя отслеживать события Application. Но с помощью класса это возможно.
Для этого нужно сделать следующее:

1. Создаём класс, в котором мы будем слушать события. Обзовём его EventsTracker. Создадим в нём переменную типа Excel.Application с ключевым словом WithEvents:
Код
Public WithEvents ExcelApp As Excel.Application


2. Создаём стандартный модуль. Обзвоём его TrackEvents и создадим в нём две процедуры для запуска прослушки событий (ListenToApplicationEvents) и для прекращения прослушки (StopListeningToApplicationEvents), а также переменную типа EventsTracker:
Код
Public AppEvents As EventsTracker

Sub ListenToApplicationEvents()
    If AppEvents Is Nothing Then Set AppEvents = New EventsTracker
    Set AppEvents.ExcelApp = Excel.Application
End Sub

Sub StopListeningToApplicationEvents()
    Set AppEvents.ExcelApp = Nothing
End Sub


3. Теперь идём в класс EventsTracker и в окне кода в левом комбобоксе (Object) выбираем переменную ExcelApp и в левом комбобоксе (Procedure) выбираем нужное событие (например, SheetActivate, как показано на скриншоте).


Вот и все шаги. То же самое и для Chart: добавляем в класс (EventsTracker) переменную типа Excel.Chart и в стандартный модуль (TrackEvents) добавляем также две процедуры.
Класс EventsTracker:
Код
Public WithEvents ExcelChart As Excel.Chart

Стандартный модуль TrackEvents:
Код
Public AppEvents As EventsTracker

Sub ListenToChartEvents()
    If AppEvents Is Nothing Then Set AppEvents = New EventsTracker
    ' Внедрённая диаграмма
    'Set AppEvents.ExcelChart = Sheets(3).ChartObjects(1).Chart
    ' Диаграмма-лист
    Set AppEvents.ExcelChart = ChartSales
End Sub

Sub StopListeningToChartEvents()
    Set AppEvents.ExcelChart = Nothing
End Sub


Отслеживание событий возможно для следующих объектов (библиотека Excel):
1. Application
2. Chart
3. OLEObject (два события: Got_Focus и Lost_Focus)
4. QueryTable (два события: BeforeRefresh и AfterRefresh)
5. Workbook
6. Worksheet

Вот ещё один пример использования классов. В какой-то теме я уже выкладывал этот файл.
Итак, имеем 4 Label и 4 TextBox. Задача - по двойному клику очистить соответствующий TextBox (имена следующей структуры: txtAddress = lblAddress). Без класса мы будем писать 4 одинаковые (по структуре) процедуры Label_DblClick.
Используя класс, мы привяжем все Label'ы к одной процедуре.

1. Вставляем следующий код в форму (опрос всех элементов управления, определяем Label и добавляем в коллекцию):
Код
Private colLabels As New Collection

Private Sub UserForm_Initialize()
    
    Dim ctl As MSForms.Control
    Dim lblEvents As LabelEvents

    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.Label Then
            Set lblEvents = New LabelEvents
            Set lblEvents.Lbl = ctl
            Set lblEvents.Form = Me
            colLabels.Add lblEvents
        End If
    Next

End Sub


2. Создаём класс LabelEvents и вставляем этот код:
Код
Public WithEvents Lbl As MSForms.Label
Public Form As MSForms.UserForm

Private Sub lbl_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    Dim sField As String
    Dim sTextBoxName As String

    sField = Lbl.Name
    sTextBoxName = "txt" & Right(sField, Len(sField) - 3)
    
    With Form.Controls(sTextBoxName)
        .Text = ""
        .SetFocus
    End With
    
End Sub


Всё готово! Запускаем форму и два раза жмём на Label'ы.  :)
Изменено: Johny - 29.01.2013 10:13:18
There is no knowledge that is not power
 
Цитата
ZVI пишет:
4. Возможность наследования интерфейса другого класса с помощью Implements

Владимир. Я так понимаю, это опечатка? :)
There is no knowledge that is not power
 
Цитата
Johny пишет:
Цитата
ZVI пишет:
4. Возможность наследования интерфейса другого класса с помощью Implements

Владимир. Я так понимаю, это опечатка?  :)  
Нет, не опечатка, там второе слово есть "интерфейса"  :)  
Ничего, кроме интерфейса другого класса, к сожалению, не наследуется в VBA и VB6.
Изменено: ZVI - 29.01.2013 15:01:40
 
Цитата
ZVI пишет:
Нет, не опечатка, там второе слово есть "интерфейса":)

А я думал, что Implements переводится как "применение", а Inheritance как "наследование" (чего в VBA/VB6 нет).
Подправь меня, если я не прав. :)
There is no knowledge that is not power
 
to Johny, про то, что с помощью модулей классов можно отслеживать действия app и удобно работать с элементами управления на форме - я думаю это никому не секрет :)
Хотелось бы узнать для чего еще можно и/или нужно использовать в "повседневном-программировании" модули класса
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Цитата
Johny пишет:
А я думал, что Implements переводится как "применение", а Inheritance как "наследование" (чего в VBA/VB6 нет).
Подправь меня, если я не прав.  :)  
Перевод –то правильный, но сути не меняет, чтобы применить интерфейсы нужно их сначала наследовать.
inheritance было бы неправдой, так как сам объект не наследуется.
В статье, которую цитировал Игорь (EducatedFool), тоже об этом упоминается: "вы не наследуете обьект - вы наследуете его интерфейсы".

Кратно про Implements.

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

А кодировщики в своём модуле класса в начале кода пишут Implements clsPC,
После этого, если в комбобоксе слева вверху выбрать clsPC, то в комбобоксе справа появится список наследованных из clsPC интерфейсов свойств, методов и функций, выбор которых вставляет пустую заготовку кода в реализуемый модуль класса. То есть, аналогично тому, что мы видим в модулях листов, книги или форм.

Использование Implements имеет смысл при разработке не одного, а нескольких классов на основе единого класса интерфейсов.

Когда-то мне понравилась веселенькая статья Using the Implements keyword с классами про блондинок.
Тогда я перенес код из статьи в книгу, которую и прилагаю.
Изменено: ZVI - 30.01.2013 14:31:05
 
Владимир, я прекрасно знаю разницу между Implements и Inherits, поэтому интерфейс не наследуется, а применяется.
Изменено: Johny - 31.01.2013 07:58:38
There is no knowledge that is not power
 
Цитата
ZVI пишет:
Александр, с моей точки зрения вот несколько элементов удобства:
1. Технология  IntelliSense  вместе с инкапсуляцией - не нужно заглядывать в модуль и фильтровать в уме необходимые свойства, методы, функции, процедуры, события, все они уже отфильтрованы в IntelliSense
2. Поддержка системных (Excel & Office) событий
3. Поддержка пользовательских событий
4. Возможность наследования интерфейса другого класса с помощью Implements
5. Возможность создания экземпляров классов

Уточните, пожалуйста, по сравнению с чем в VBA Вы видите неудобства и какие именно.
1. Любая нормальная IDE должна это делать. Разве не так?
2, 3 не понял каким образом это относиться к удобству
4. само собой разумеется
5. зачем модуль класса, если нельзя создать экземпляр?

Не хотелось бы сравнивать, т.к. оно не сравнимо в принципе и на данный момент я могу сопоставлять разве что с javascript. В частности, раз, два. Я говорю о том, что:
а) классы на мой взгляд не так удобны, как прототипы
б) создание объектов на ходу без модулей класса рулит :D

Вот пример
Там существует объекты:

formula, кот. в себе содержит

formula.patterns = {};
formula.patterns.string = 'some';
formula.patterns.name = 'some';
formula.patterns.range = 'some';
formula.patterns.noise = 'some';

formula.styles = {};
formula.styles.rewind();
formula.styles.prev();
formula.styles.next();

formula.Unit - конструктор, созданные объекты которого, наследуют функции cut и paste, а также "уникальные" поля patterns, mark и items.

// создан через конструктор
formula.strings = {};
formula.strings.cut(); // "наследует" от конструктора. При этом не копирует, а только использует.
formula.strings.paste(); // "наследует" от конструктора. При этом не копирует, а только использует.
formula.strings.patterns = {};
formula.strings.patterns.cut = regexp;
formula.strings.patterns.paste = regexp;
formula.strings.mark = 'some';
formula.strings.items = array;

// создан через конструктор
formula.noise = {};
formula.noise.cut(); // "наследует" от конструктора. При этом не копирует, а только использует.
formula.noise.paste(); // "наследует" от конструктора. При этом не копирует, а только использует.
formula.noise.patterns = {};
formula.noise.patterns.cut = regexp;
formula.noise.patterns.paste = regexp;
formula.noise.mark = 'some';
formula.noise.items = array;

// создан через конструктор
formula.data = {};
formula.data.cut(); // "наследует" от конструктора. При этом не копирует, а только использует.
formula.data.paste(); // "наследует" от конструктора. При этом не копирует, а только использует.
formula.data.patterns = {};
formula.data.patterns.cut = regexp;
formula.data.patterns.paste = regexp;
formula.data.mark = 'some';
formula.data.items = array;

// расширен методом
formula.data.wrap();

formula.brackets = {};
formula.brackets.wrap();

не считая вспомогательных. Элементарно пальцы устанут модули класса набирать. Программирование на языках высокого уровня - насквозь ООП. Почему бы не упростить жизнь кодеру?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Цитата
Johny пишет:
Владимир, я прекрасно знаю разницу между Implements и Inherits, поэтому интерфейс не наследсуется, а применяется.
"Я знаю и поэтому" - непробиваемый довод  :)
Никого не хочу убеждать, тем более переубеждать, спорьте лучше с другими авторами, вот пара ссылок на публикации на английском с их цитатами.
В первой, кстати, хороший пример применения Implemets

1. Use interface inheritance by using the Implements keyword
Visual Basic 6 and earlier versions do not allow true inheritance. However, they allow interface inheritance where one class defines a public interface and then other classes implement it.

2. Using the Implements Statement The interface is defined as an abstract interface, and concrete classes inherit the interface using the Implements statement.
Изменено: ZVI - 30.01.2013 18:45:11
 
Цитата
nerv пишет:
Не хотелось бы сравнивать, т.к. оно не сравнимо в принципе и на данный момент я могу сопоставлять разве что с javascript.
...
Элементарно пальцы устанут модули класса набирать. Программирование на языках высокого уровня - насквозь ООП. Почему бы не упростить жизнь кодеру?
Добрый вечер, Александр!
Согласен, сравнивать языки программирования - неблагодарное дело, я думал. что Вы имели ввиду неудобства работы с классами в VBA по сравнению с работой со стандартными модулями VBA. Плюсанул Ваши примеры :)  

VB6 и VBA, действительно, уж очень древние, и IDE их из прошлого века, и не позволяют реализовать ООП в чистом виде. Но VBA легко осваивают и широко используют непрограммисты, которых не счесть, поэтому VBA так долго поддерживается и, очевидно, еще долго будет существовать.

JavaScript и VB.NET - для программистов по образованию или призванию, это хороший вектор развития, но по всей видимости, он никогда не будет таким популярным как VBA, потому что эти языки используют в основном только программисты для тех самых непрограммистов, которые многое могут и сами сделать в VBA  :)
Изменено: ZVI - 30.01.2013 20:26:00
 
Цитата
ZVI пишет:
JavaScript и VB.NET - для программистов по образованию или призванию, это хороший вектор развития, но по всей видимости, он никогда не будет таким популярным как VBA, потому что эти языки используют в основном только программисты для тех самых непрограммистов, которые многое могут и сами сделать в VBA

А могут ли эти "непрограммисты" на VBA сделать exe-файл? Как можно вообще сравнивать VBA и VB.NET, когда у них и специализация-то разная?
There is no knowledge that is not power
 
Цитата
Johny пишет:
А могут ли эти "непрограммисты" на VBA сделать exe-файл?
Как можно вообще сравнивать VBA и VB.NET, когда у них и специализация-то разная?
1. Вопрос ведь риторический?  :)  
exe сделать не смогут, но на популярность VBA это не повлияло
2. Никак, конечно. Языки программирования не сравнивались, высказано мое личное мнение о том, для кого они, и о популярности.
Изменено: ZVI - 31.01.2013 09:26:20
 
Цитата
Johny пишет:
А могут ли эти "непрограммисты" на VBA сделать exe-файл?

А это как посмотреть.
Сделал я файл на VBA, отладил, затем перетащил код в VB6 и скомпилировал в exe.

В чем я делал файл?  :)
 
Цитата
RAN пишет:
В чем я делал файл?

В VB6.  :D
There is no knowledge that is not power
Страницы: 1 2 3 4 След.
Наверх