[VBA] UserForm problemen

Pagina: 1
Acties:
  • 268 views sinds 30-01-2008
  • Reageer

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 20-08 23:09
Het leek me handig om mn geschreven macro in een userform te verwerken, Ik vraag me echter af hoe je dit kan opstarten, is het daarvoor perse nodig om excel ook op te starten of kan je er een exe file van maken? Verder vroeg ik me af of je er ook een chart in kan verwerken (of indirect per gif).

En als laatste lukt het me niet om de variabele onder mn Save as en Load file buttons door te geven aan de button waaronder de eigenlijke bewerking start. Ik heb op msdn gezocht maar ik kan er maar weinig over vinden. Mn variabelen worden gewoon in de ene sub geset, ik heb geprobeerd alles public te maken, maar ook dat werkt niet. Alvast bedankt :)

Verwijderd

als je een exe wil hebben, moet je in de gewone visual basic programmaomgeving werken, anders dien je inderdaad excel nog op te starten (maar de fullfledged vb form is verschillend van de vba userform).
in de userform kan je voor charts (vanaf excel 2000 dacht ik) een chart control toevoegen (web components of zoiets).
om variabelen van de ene naar de andere knop te kunnen doorgeven, moeten ze op moduleniveau in de userform geplaatst worden, best met scope private, tenzij je ze voor het hele project wil toegankelijk maken. in dat geval plaatst je ze op moduleniveau en public, en zijn ze toegankelijk zolang de userform nog geladen is met de syntax userformname.publiekevariabele.

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 22:59
Als je ze volledig publiek wilt maken, declareer dan in je module (als in macromodule) als public en geef ze een waarde in je userform. Dan houden variabelen hun inhoud vast zolang er "iets" loopt.

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 20-08 23:09
hmm, ik was al bang voor normale visual basic omgeving. Helaas werken ze hier op het werk nog met excel 97 (webcomponents heb ik al wel mee gewerkt, alleen moest daarvoor ook iis draaien meen ik).

Met de variabelen begrijp ik het nog steeds niet helemaal, ik heb gewoon een module:
code:
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
29
30
31
32
33
34
35
36
37
38
39
40
Public Sub Fileconversion()
'
' fileconversion Macro
' Macro recorded 9/16/2005 by gerbertf
'
'
    Columns("A:A").ColumnWidth = 20
    Columns("C:C").ColumnWidth = 20
    Columns("B:B").ColumnWidth = 20

Dim uitbestand As Workbook
Dim naarbestand As Workbook
Dim uitbestandnaam As String
Dim naarbestandnaam As String

uitbestandnaam = Application.GetOpenFilename(, , "Maxima uit")
naarbestandnaam = Application.GetSaveAsFilename(, , , "Opslaan in")
Set uitbestand = Workbooks.Open(uitbestandnaam)
Set naarbestand = Workbooks.Add

MsgBox "File conversion starts now."

naarbestand.Worksheets(1).Cells(1, 1).Value = uitbestand.Worksheets(1).Cells(3, 1)
naarbestand.Worksheets(1).Cells(2, 1).Value = uitbestand.Worksheets(1).Cells(4, 1)
naarbestand.Worksheets(1).Cells(3, 1).Value = uitbestand.Worksheets(1).Cells(5, 1)

naarbestand.Worksheets(1).Cells(1, 2).Value = uitbestand.Worksheets(1).Cells(3, 2)
naarbestand.Worksheets(1).Cells(2, 2).Value = uitbestand.Worksheets(1).Cells(4, 2)
naarbestand.Worksheets(1).Cells(3, 2).Value = uitbestand.Worksheets(1).Cells(5, 2)

For i = 1 To 250 'aantal kolommen
    'Worksheets(1) pakt je eerste tabblad. Je kan er ook Worksheets("PietjePuk") van maken als je die moet hebben
   naarbestand.Worksheets(1).Cells((i + 15), 1).Value = Application.WorksheetFunction.Max(uitbestand.Worksheets(1).Range(uitbestand.Worksheets(1).Cells(26, i), uitbestand.Worksheets(1).Cells(5026, i)))
Next i

naarbestand.SaveAs naarbestandnaam
uitbestand.Close
'naarbestand.Close
'
End Sub


En verder drie knoppen:
code:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Public Sub CommandButton1_Click()

'
' fileconversion Macro
' Macro recorded 9/16/2005 by gerbertf
'
'
    Columns("A:A").ColumnWidth = 20
    Columns("C:C").ColumnWidth = 20
    Columns("B:B").ColumnWidth = 20

MsgBox "File conversion starts now."

naarbestand.Worksheets(1).Cells(1, 1).Value = uitbestand.Worksheets(1).Cells(3, 1)
naarbestand.Worksheets(1).Cells(2, 1).Value = uitbestand.Worksheets(1).Cells(4, 1)
naarbestand.Worksheets(1).Cells(3, 1).Value = uitbestand.Worksheets(1).Cells(5, 1)

naarbestand.Worksheets(1).Cells(1, 2).Value = uitbestand.Worksheets(1).Cells(3, 2)
naarbestand.Worksheets(1).Cells(2, 2).Value = uitbestand.Worksheets(1).Cells(4, 2)
naarbestand.Worksheets(1).Cells(3, 2).Value = uitbestand.Worksheets(1).Cells(5, 2)

For i = 1 To 250 'aantal kolommen
    'Worksheets(1) pakt je eerste tabblad. Je kan er ook Worksheets("PietjePuk") van maken als je die moet hebben
   naarbestand.Worksheets(1).Cells((i + 15), 1).Value = Application.WorksheetFunction.Max(uitbestand.Worksheets(1).Range(uitbestand.Worksheets(1).Cells(26, i), uitbestand.Worksheets(1).Cells(5026, i)))
Next i

naarbestand.SaveAs naarbestandnaam
uitbestand.Close
'naarbestand.Close
'
End Sub

Private Sub CommandButton2_Click()

Dim naarbestand As Workbook
Dim naarbestandnaam As String
Set naarbestand = Workbooks.Add
naarbestandnaam = Application.GetSaveAsFilename(, , , "Opslaan in")

End Sub

Private Sub CommandButton3_Click()

Dim uitbestand As Workbook
Dim uitbestandnaam As String
Set uitbestand = Workbooks.Open(uitbestandnaam)
uitbestandnaam = Application.GetOpenFilename(, , "Maxima uit")

End Sub


Het zal waarschijnlijk allemaal wat noobish zijn, maar ik heb nog niet zoveel gewerkt met vb en heb er helaas ook geen goed boek over, en vind het op internet lastig in duidelijke stappen te vinden.

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 22:59
Als je 't ding zo maakt:
code:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Public uitbestand As Workbook
Public naarbestand As Workbook
Public uitbestandnaam As String
Public naarbestandnaam As String

Public Sub Fileconversion()
'
' fileconversion Macro
' Macro recorded 9/16/2005 by gerbertf
'
'
    Columns("A:A").ColumnWidth = 20
    Columns("C:C").ColumnWidth = 20
    Columns("B:B").ColumnWidth = 20



uitbestandnaam = Application.GetOpenFilename(, , "Maxima uit")
naarbestandnaam = Application.GetSaveAsFilename(, , , "Opslaan in")
Set uitbestand = Workbooks.Open(uitbestandnaam)
Set naarbestand = Workbooks.Add

MsgBox "File conversion starts now."

naarbestand.Worksheets(1).Cells(1, 1).Value = uitbestand.Worksheets(1).Cells(3, 1)
naarbestand.Worksheets(1).Cells(2, 1).Value = uitbestand.Worksheets(1).Cells(4, 1)
naarbestand.Worksheets(1).Cells(3, 1).Value = uitbestand.Worksheets(1).Cells(5, 1)

naarbestand.Worksheets(1).Cells(1, 2).Value = uitbestand.Worksheets(1).Cells(3, 2)
naarbestand.Worksheets(1).Cells(2, 2).Value = uitbestand.Worksheets(1).Cells(4, 2)
naarbestand.Worksheets(1).Cells(3, 2).Value = uitbestand.Worksheets(1).Cells(5, 2)

For i = 1 To 250 'aantal kolommen
    'Worksheets(1) pakt je eerste tabblad. Je kan er ook Worksheets("PietjePuk") van maken als je die moet hebben
   naarbestand.Worksheets(1).Cells((i + 15), 1).Value = Application.WorksheetFunction.Max(uitbestand.Worksheets(1).Range(uitbestand.Worksheets(1).Cells(26, i), uitbestand.Worksheets(1).Cells(5026, i)))
Next i

naarbestand.SaveAs naarbestandnaam
uitbestand.Close
'naarbestand.Close
'
End Sub

Public Sub CommandButton1_Click()

'
' fileconversion Macro
' Macro recorded 9/16/2005 by gerbertf
'
'
    Columns("A:A").ColumnWidth = 20
    Columns("C:C").ColumnWidth = 20
    Columns("B:B").ColumnWidth = 20

MsgBox "File conversion starts now."

naarbestand.Worksheets(1).Cells(1, 1).Value = uitbestand.Worksheets(1).Cells(3, 1)
naarbestand.Worksheets(1).Cells(2, 1).Value = uitbestand.Worksheets(1).Cells(4, 1)
naarbestand.Worksheets(1).Cells(3, 1).Value = uitbestand.Worksheets(1).Cells(5, 1)

naarbestand.Worksheets(1).Cells(1, 2).Value = uitbestand.Worksheets(1).Cells(3, 2)
naarbestand.Worksheets(1).Cells(2, 2).Value = uitbestand.Worksheets(1).Cells(4, 2)
naarbestand.Worksheets(1).Cells(3, 2).Value = uitbestand.Worksheets(1).Cells(5, 2)

For i = 1 To 250 'aantal kolommen
    'Worksheets(1) pakt je eerste tabblad. Je kan er ook Worksheets("PietjePuk") van maken als je die moet hebben
   naarbestand.Worksheets(1).Cells((i + 15), 1).Value = Application.WorksheetFunction.Max(uitbestand.Worksheets(1).Range(uitbestand.Worksheets(1).Cells(26, i), uitbestand.Worksheets(1).Cells(5026, i)))
Next i

naarbestand.SaveAs naarbestandnaam
uitbestand.Close
'naarbestand.Close
'
End Sub

Private Sub CommandButton2_Click()

Set naarbestand = Workbooks.Add
naarbestandnaam = Application.GetSaveAsFilename(, , , "Opslaan in")

End Sub

Private Sub CommandButton3_Click()


Set uitbestand = Workbooks.Open(uitbestandnaam)
uitbestandnaam = Application.GetOpenFilename(, , "Maxima uit")

End Sub

Zal het al wat beter werken. Als je Dim(ensioneert) binnen een macro zal Excel de waarde "vergeten" zodra de macro gedaan is. Als je binnen de module Dimensioneert zal excel de waarde onthouden.

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 22:59
Overigens, wat probeer je eigenlijk te bereiken met de macro's onder knop 2 en 3? Het komt me een beetje loos over.

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 20-08 23:09
onkl schreef op maandag 19 september 2005 @ 16:08:
Overigens, wat probeer je eigenlijk te bereiken met de macro's onder knop 2 en 3? Het komt me een beetje loos over.
hehe, eigenlijk wel he, ik was gewoon nieuwsgierig, en het leek me mooi om een interface te gebruiken.

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 22:59
Als je variabelen over de runtime heen wilt bewaren (eerst knopje 1, koffie drinken, dan knopje 2) en je wilt dat excel variabelen bewaart, dan is het vaak het makkelijkst gewoon een cel in je werkblad te vullen. Eventueel kan je een verborgen werkblad nemen.
't kan wel galanter, maar dat loont eigenlijk de moeite niet.

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 20-08 23:09
tnx, het enige probleem is dat ik me nu afvraag hoe ik het beste de macro kan runnen. Gewoon een standaard sheet aanmaken met een knop die de module runt, of iets maken waardoor ik mn userform zie. Hoe kan ik dit het beste aanpakken?

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 22:59
Geen idee, ik weet wel dat het onderwerp Userforms aan *kuch* wat verandering onderhevig is geweest sinds Excel 97(zijn effectief afgeschaft en "from scratch" opnieuw ontworpenZ). Als je wilt dat je vehikel het ook doet in Excel 2000 lijken mij knoppen in je werkblad een geslaagdere manier.

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 20-08 23:09
onkl schreef op maandag 19 september 2005 @ 16:39:
Geen idee, ik weet wel dat het onderwerp Userforms aan *kuch* wat verandering onderhevig is geweest sinds Excel 97(zijn effectief afgeschaft en "from scratch" opnieuw ontworpenZ). Als je wilt dat je vehikel het ook doet in Excel 2000 lijken mij knoppen in je werkblad een geslaagdere manier.
Bedankt voor de info, dan doe ik het gewoon op die manier!

Verwijderd

welke veranderingen? userforms zijn volledig gelijk voor de office versies 97-2003.

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 20-08 23:09
Ik heb nu wat buttons op mn sheet geplaatst, en de handelingen voor het openen en opslaan doe ik gewoon met 1 knop. Nadat de macro is doorlopen plaatst hij op het standaard sheet een grafiek met wat resultaten van de fileconversie.

Nu heb ik nog een knop aangemaakt waarmee ik graag naar het aangemaakte bestand toe wil gaan (het hoeft niet worden geopend aangezien het nog open staat). Maar als ik dit gebruik:

code:
1
2
3
4
5
Private Sub CommandButton1_Click()

naarbestand.Activate

End Sub


werkt het niet, ik kan wel de variabele daarin 'setten', maar dan heb ik er niets aan. Het zou ook mooi zijn als ik mn net aangemaakte grafiek kon aanklikken om doorgestuurd te worden. :)

[ Voor 9% gewijzigd door DarkShadow op 20-09-2005 13:09 ]

Pagina: 1