Beste mede-forum leden,
Ik heb voor mijn gevoel het gehele internet afgezocht naar DE oplossing, en telkens leek deze binnen handbereik maaaaaaaaar... HELAAS!
Wat ik wil is een "Form maken at Runtime", zodat ik niet 100 verschillende Forms hoef aan te maken in mijn VBProject. De UserForm wordt d.m.v. code aangepast met toegewezen variabelen.
Dit alles is geen probleem, het probleem zit 'm in de ListView die ik wil gebruiken in mijn Form.
Bij het vullen hiervan krijg ik elke keer de melding: "Fout 394 tijdens uitvoering: Property is write-only".
Als ik exact dezelfde Form maak in de VBE, dan lukt het wel om de ListView te vullen en krijg ik dus GEEN foutmelding.
Voor een beter beeld, eerst de CODE om het form met de juiste variabelen te maken:
Tweede CODE, het maken van de UserForm:
Derde CODE, om het database-bestand te openen en uit te lezen:
Vierde CODE, om elke regel in het database-bestand te schrijven in de ListView:
Iemand enig idee hoe ik mijn probleem kan oplossen?
Nogmaals... als ik in designtime het Form maak en dan de Derde & Vierde CODE gebruik werkt het wel, het zit 'm dus waarschijnlijk in code bij het maken van de ListView.
Alvast heel veel dank!
Groeten,
dProd
Tags: UserForm Runtime ListView VBA Excel MSComctlLib.ListView write-only property
Ik heb voor mijn gevoel het gehele internet afgezocht naar DE oplossing, en telkens leek deze binnen handbereik maaaaaaaaar... HELAAS!
Wat ik wil is een "Form maken at Runtime", zodat ik niet 100 verschillende Forms hoef aan te maken in mijn VBProject. De UserForm wordt d.m.v. code aangepast met toegewezen variabelen.
Dit alles is geen probleem, het probleem zit 'm in de ListView die ik wil gebruiken in mijn Form.
Bij het vullen hiervan krijg ik elke keer de melding: "Fout 394 tijdens uitvoering: Property is write-only".
Als ik exact dezelfde Form maak in de VBE, dan lukt het wel om de ListView te vullen en krijg ik dus GEEN foutmelding.
Voor een beter beeld, eerst de CODE om het form met de juiste variabelen te maken:
Code:
Private Sub CallTheForm()
MakeUserForm "Personeelsgegevens", "Medewerkers", clsIni.IBUITENMDW, "101;60;60;100"
End Sub
Tweede CODE, het maken van de UserForm:
Code:
Public Sub MakeUserForm(frmName As String, pageName As String, strSelection As String, ColumnWidth As String)
Dim TempForm As Object
Dim NewMultiPage As MSForms.MultiPage
Dim NewLabel As MSForms.Label
Dim NewListView As MSComctlLib.ListView
Dim NewButton As MSForms.CommandButton
Application.VBE.MainWindow.Visible = False
Set TempForm = ThisWorkbook.VBProject.VBComponents.Add(3)
With TempForm
.Properties("Caption") = frmName
.Properties("Width") = 369.75
.Properties("Height") = 283.5
End With
Set NewMultiPage = TempForm.designer.Controls.Add("Forms.MultiPage.1")
NewMultiPage.Pages.Remove (1)
With NewMultiPage
.Height = 228
.Width = 354
.Left = 6
.Top = 6
.Pages(0).Caption = pageName
End With
Set NewLabel = NewMultiPage.Pages(0).Controls.Add("Forms.Label.1")
With NewLabel
.Height = 2
.Left = 12
.Top = 11.05
.Width = 252
.SpecialEffect = fmSpecialEffectSunken
End With
Set NewLabel = NewMultiPage.Pages(0).Controls.Add("Forms.Label.1")
With NewLabel
.Caption = "Databasegegevens"
.Height = 12
.Left = 270
.Top = 6
.Width = 72.05
End With
Set NewLabel = NewMultiPage.Pages(0).Controls.Add("Forms.Label.1")
With NewLabel
.Caption = "De volgende personen zijn in opgenomen in uw personeelsbestand:"
.Height = 12
.Left = 8
.Top = 24
.Width = 330
End With
Set NewListView = NewMultiPage.Pages(0).Controls.Add("MSComctlLib.ListViewCtrl.2")
With NewListView
.BorderStyle = ccFixedSingle
.Gridlines = True
.Height = 138
.Left = 6
.Sorted = True
.Top = 36
.Width = 336
.FullRowSelect = True
End With
Set NewButton = NewMultiPage.Pages(0).Controls.Add("Forms.CommandButton.1")
With NewButton
.Caption = "Wijzigen"
.Height = 19
.Left = 6
.Top = 180
.Width = 72
End With
Set NewButton = NewMultiPage.Pages(0).Controls.Add("Forms.CommandButton.1")
With NewButton
.Caption = "Toevoegen..."
.Height = 19
.Left = 192
.Top = 180
.Width = 72
End With
Set NewButton = NewMultiPage.Pages(0).Controls.Add("Forms.CommandButton.1")
With NewButton
.Caption = "Verwijderen"
.Height = 19
.Left = 270
.Top = 180
.Width = 72
End With
Set NewButton = TempForm.designer.Controls.Add("Forms.CommandButton.1")
With NewButton
.Caption = "OK"
.Default = True
.Height = 19
.Left = 288
.Top = 240
.Width = 72
End With
Dim strUsedPath As String
If clsIni.CLOCAL Then strUsedPath = clsIni.LOCALDIR
If clsIni.CSERVER Then strUsedPath = clsIni.CSERVERDIR
strUsedPath = strUsedPath & "\" & clsIni.CINPUTDIR & "\" & strSelection
GetValuesFromDBFile strUsedPath, NewListView, ColumnWidth
NewListView.View = lvwReport
If NewListView.ListItems.Count = 0 Then
frmPGEGEVENS.btnVERWIJDEREN.Enabled = False
frmPGEGEVENS.btnWIJZIGEN.Enabled = False
End If
VBA.UserForms.Add(TempForm.Name).Show
ThisWorkbook.VBProject.VBComponents.Remove TempForm
End Sub
Derde CODE, om het database-bestand te openen en uit te lezen:
Code:
Public Function GetValuesFromDBFile(FileToRead As String, _
objToFill As Object, _
ColumnWidth As String)
Dim FileNum As Integer
Dim strTmp As String
Dim aTmp() As String
Dim lRow As Long
Close
FileNum = FreeFile
Open FileToRead For Input As #FileNum
While Not EOF(FileNum)
Line Input #FileNum, strTmp
aTmp = Split(strTmp, ";")
WriteValuesToDBObject aTmp, lRow, objToFill, ColumnWidth
lRow = lRow + 1
Wend
Close
End Function
Vierde CODE, om elke regel in het database-bestand te schrijven in de ListView:
Code:
Private Sub WriteValuesToDBObject(strValue() As String, _
rowID As Long, _
objToFill As Object, _
ColumnWidth As String)
Dim i As Integer
Dim objListItem As Object
Dim aColumnWidth() As String
aColumnWidth = Split(ColumnWidth, ";")
'eerste row in database zijn column values...
If rowID = 0 Then
For i = 0 To UBound(strValue)
objToFill.ColumnHeaders.Add , , strValue(i), aColumnWidth(i)
Next i
Else
'alles daarna is input voor de ListView...
For i = 0 To UBound(strValue)
If i = 0 Then
[COLOR="red"]Set objListItem = objToFill.ListItems.Add(, , strValue(i))[/COLOR] 'FOUTMELDING!
Else
objListItem.SubItems(i) = strValue(i)
End If
Next i
End If
End Sub
Iemand enig idee hoe ik mijn probleem kan oplossen?
Nogmaals... als ik in designtime het Form maak en dan de Derde & Vierde CODE gebruik werkt het wel, het zit 'm dus waarschijnlijk in code bij het maken van de ListView.
Alvast heel veel dank!
Groeten,
dProd
Tags: UserForm Runtime ListView VBA Excel MSComctlLib.ListView write-only property
Laatst bewerkt: