Я пытаюсь писать меньше кода, изучая, как использовать метод ООП. Для меня это было немного тяжело, и я застрял. Я хотел бы знать, как я смогу проанализировать имя строки моей пользовательской формы. В моем модуле md_AddCountry есть следующие коды.
`Sub Select_AddDonor_Country()
Dim showsql As New cls_DBConPath
With showsql
.colname = "country_Name"
.sqlst = "Select country_Name From ccf_country;"
.formname = "frmAddDonor.cmbAddDonr_Country"
.DBConPath
Set showsql = Nothing
End With
End Sub`
у меня есть следующие коды в моем модуле класса под названием cls_DBConPath
`Option Explicit
Private psqlSt As String
Private pcolumnName As String
Private pform As Object
Private pformName As String
Public Property Get colname() As String
colname = pcolumnName
End Property
Public Property Let colname(Value As String)
pcolumnName = Value
End Property
Public Property Get sqlst() As String
sqlst = psqlSt
End Property
Public Property Let sqlst(Value As String)
psqlSt = Value
End Property
Public Property Get formname() As String
formname = pformName
End Property
Public Property Let formname(Value As String)
pformName = Value
End Property
Public Property Get form() As Object
form = pform
End Property
Public Property Let form(Value As Object)
pform = Value
End Property`
`Sub DBConPath()
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim dbPath As String
Dim fName As Object
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
'On Error GoTo ErrHandler
dbPath = frmCCFDashboard.DBAddress.Caption
Set con = New ADODB.Connection
con.Open dbPath
Set rs = con.Execute(sqlst)
While rs.EOF = False
UserForms.Add(formname).AddItem rs.Fields(colname).Value
UserForms.Add(formname).AddItem rs.Fields(colname).Value
rs.MoveNext
Wend
End Sub `
Я продолжаю получать сообщение об ошибке «Требуется объект» всякий раз, когда пытаюсь проанализировать имя моей пользовательской формы в методе, который я создал выше. Я буду признателен, если вы, ребята, поможете мне разобрать мою пользовательскую форму в этом методе.
Пожалуйста, простите меня, если мои коды кажутся вам странными. Я пытаюсь научиться использовать класс, и у меня это полный рот. Я все еще понимаю концепцию
🤔 А знаете ли вы, что...
SQL поддерживает сортировку данных с использованием оператора ORDER BY.
Я не уверен, полностью ли я понимаю конечную цель вашего кода.
Судя по тому, что я читаю в вашей подпрограмме md_AddCountry Select_AddDonor_Country, цель состоит в том, чтобы передать строковые ссылки на класс с этими свойствами, а затем выполнить метод запроса sql с использованием этих свойств и отобразить результаты в элементах управления пользовательских форм с другими свойствами, определенными в строительство объектов.
Кажется, вы также хотите, чтобы объект был создан и очищен с помощью оператора with, и у вас есть некоторое свойство объекта формы, которое, как я предполагаю, предназначено для установки в качестве формы для отображения содержимого. Я также хочу предположить, что вы делаете этот модуль общедоступным, чтобы его можно было запускать с помощью кнопки макросов на ленте разработчика Excel.
Хорошая новость: вы не за горами! После освоения классы могут оказаться очень мощными, и попробовать ООП в VBA очень полезно. Это мой первый ответ SA! Мы все делаем что-то новое. Надеюсь, я правильно использую этот раздел ответов.
'md_AddCountry
Sub Select_AddDonor_Country()
With New cls_DBConPath 'you don't need to new the class if you are disposing it
.colname = "country_Name"
.sqlst = "Select country_Name From ccf_country;"
.formname = "frmAddDonor.cmbAddDonr_Country"
set .form = new frmAddDonor 'if you want to pass the userform to your class
.DBConPath
.form.show 'if you want to show your new prepopulated form
End With
End Sub
'cls_DBConPath
Option Explicit
Private psqlSt As String
Private pcolumnName As String
Private pform As Object
Private pformName As String
Public Property Get colname() As String
colname = pcolumnName
End Property
Public Property Let colname(Value As String)
pcolumnName = Value
End Property
Public Property Get sqlst() As String
sqlst = psqlSt
End Property
Public Property Let sqlst(Value As String)
psqlSt = Value
End Property
Public Property Get formname() As String
formname = pformName
End Property
Public Property Let formname(Value As String)
pformName = Value
End Property
Public Property Get form() As Object 'objects need to be set'
set form = pform
End Property
Public Property Set form(Value As Object) 'objects need to be set
set pform = Value
End Property
Sub DBConPath()
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim dbPath As String
Dim fName As Object
'Set con = CreateObject("ADODB.Connection") 'you don't need to set here
Set rs = CreateObject("ADODB.Recordset")
'On Error GoTo ErrHandler
dbPath = frmCCFDashboard.DBAddress.Caption
Set con = New ADODB.Connection 'if you set down here
con.Open dbPath
Set rs = con.Execute(sqlst)
Dim control_name as string
control_name = split(formname, ".")(1) 'split takes a delimiter and creates an
'array; (1) takes the 2nd item of the
'zero based array; (0) would get the
'formname
While rs.EOF = False
form.Controls(control_name).AddItem rs.Fields(colname).Value '*
'UserForms.Add(formname).AddItem rs.Fields(colname).Value 'not sure why the
rs.MoveNext 'second one
Wend
End Sub
* Я заменил Userforms.Add (который, я думаю, используется для динамического добавления пользовательской формы. Если это ваша цель, приведенный выше ответ не является правильным) на form.Controls. При этом используется недавно созданная пользовательская форма, ранее переданная в класс, которая еще не была показана, но существует в памяти. Затем передайте control_name в коллекцию Controls и добавьте значение этого поля!
Гораздо проще использовать существующую (пустую) пользовательскую форму для чего-то подобного. Убедитесь, что форма содержит элементы управления (и их код), которые являются общими для задач, которые должна выполнять форма (например, заголовок, кнопки «ОК/Отмена», кнопки выбора записи и т. д.). Добавьте все остальное во время выполнения. Это означает, что любой код событий, необходимый для добавленных элементов управления во время выполнения, должен помещаться в отдельные классы, экземпляры которых создаются при добавлении этих элементов управления.
Если разница между тем, что должно быть в форме в разных обстоятельствах, не очень велика, рассмотрите возможность размещения в форме всего и скрытия ненужного. Упрощает написание кода событий, и у вас появляется больше событий для работы. Не ООП, но иногда ограничения языка вынуждают делать менее элегантные вещи.