[VB6] BAS-module

Pagina: 1
Acties:

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
Ik ben mijn programma wat aan het opkuisen door een aantal routines in BAS modules te gooien. Excel en Mail functies bijvoorbeeld.

nu heb ik bijvoorbeeld in mijn modExcel.bas
code:
1
2
3
4
5
6
7
8
9
option explicit

Dim moExcel As Excel.Application
Dim moReportFile As Excel.Workbook
Dim moSheet As Excel.Worksheet

Public Sub ExcelOpenen()
  ...
End Sub

De functie kan ik oproepen, met IntelliSense en alles...
Maar er blijven Compile errors: Variable not defined :|

Wat doe ik hier verkeerd, wat zie ik over het hoofd waar ze me in de lessen niet op attent hebben gemaakt? In de MSDN vind ik niet zoveel over modules...

Verwijderd

Probeer wat meer code te laten zien. Waarschijnlijk zit de fout ergens in je subroutine.

Verwijderd

ja pcies

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
nee, ik denk echt dat het die variabelen zijn...
de foutmelding is "Compile errors: Variable not defined" en moReportFile wordt geselecteerd... Op dat moment zijn al 3 externe funties gepasseerd, zonder fouten...

Verwijderd

maar als je de functies runt dan moeten die foutmeldingen ook al boven water komen volgens mij en niet pas bij het compileren :?

[ Voor 16% gewijzigd door Verwijderd op 14-01-2003 16:00 ]


Verwijderd

Hij is waarschijnlijk zijn referentie kwijt,daar weet ie niet wat Excel.Workbook betekent.

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
kijk, wat code uit mijn interne code:

code:
1
2
3
4
5
6
7
8
  ExcelOpenen
  'Excel-file openen (template: empty.xls)
  XLSOpenen drvProcess.Path & "\" & sSelected
  'Excel-file opslaan onder andere naam
  XLSSaveAs drvProcess.Path & "\Processed_" & sSelected
  
  iRow = 2
  Do While (moReportFile.Sheets("ChangeOwner").Cells(iRow, 1).Value <> "")


op die moReportFile blijft ie hangen. Er zijn dus al 3 functies gepasseerd die in dezelfde module staan als de declaraties

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
Verwijderd schreef op 14 January 2003 @ 16:01:
Hij is waarschijnlijk zijn referentie kwijt,daar weet ie niet wat Excel.Workbook betekent.
nochtans werkt de intellisense als ik de declaratie van excel.workbook opnieuw probeer in de module...

Verwijderd

Zijn de variabelen wel geldig binnen de functie? Zouden deze niet private moeten zijn?

Verwijderd

Tja,
dan ligt aan de regel waar die op knalt en wel deze :

code:
1
moReportFile.Sheets("ChangeOwner").Cells(iRow, 1).Value


edit: vierkante haken willen helpen :z

[ Voor 22% gewijzigd door Verwijderd op 14-01-2003 16:09 ]


  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
die regel is gewoon een veldje uitlezen: file.sheet.cell.value

I give up, kzet gans de boel wel terug, dan werkt het perfect

Verwijderd

Dim moExcel As Excel.Application
Dim moReportFile As Excel.Workbook
Dim moSheet As Excel.Worksheet
Volgensmij moet je dan ook dit doen:

set moExcel = new Excel.Application
set moReportFile = new Excel.Workbook
set moSheet =new Excel.Worksheet

Verwijderd

Verwijderd schreef op 14 januari 2003 @ 16:07:
Zijn de variabelen wel geldig binnen de functie? Zouden deze niet private moeten zijn?
Nee, Dim in de "header" van een Form/Module wordt door VB als een Private gezien.
Ik zelf vindt het idd ook wat netter om er Private/Public van te maken.
Maar tja in VB zit nog een bak aan legacy code wat allemaal meegesleept wordt sinds VB for DOS :X

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
Verwijderd schreef op 14 januari 2003 @ 16:11:
[...]


Volgensmij moet je dan ook dit doen:

set moExcel = new Excel.Application
set moReportFile = new Excel.Workbook
set moSheet =new Excel.Worksheet
gebeurt in de functies:
vb: Set moReportFile = moExcel.Workbooks.Open(sFile)

Verwijderd

freeco schreef op 14 januari 2003 @ 16:14:
[...]


gebeurt in de functies:
vb: Set moReportFile = moExcel.Workbooks.Open(sFile)
Staat dit in een loop ? "Set moReportFile = moExcel.Workbooks.Open(sFile)"
Want dan zou het eventueel kunnen dat de functie moExcel.Workbooks.Open(sFile) geen object terug geeft, zodra er een fout optreedt met het bestand sFile.

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
hmm, ok, slecht voorbeeldje...

ik heb die excel dinges terug in mijn main code gegooid, werkt terug...
nu gewoon een declaratie in modGlobal.bas:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim DataBaseCon As ADODB.Connection
Dim RS As New ADODB.Recordset
Dim RS2 As New ADODB.Recordset
Dim RS3 As New ADODB.Recordset
Dim RS4 As New ADODB.Recordset
Dim RS5 As New ADODB.Recordset
Dim sSQL As String
Dim oLitm As ListItem
Dim bStatus As Boolean
Dim sSerial As String
Dim sOwner As String
Dim sMostLogon As String
Dim iDeleteFromUnclaimed As Integer
Dim bValid As Boolean


nu krijg ik bij het runnen "variable not defined" => sSQL (de eerste die opgeroepen wordt van dit zootje)
Hoe doe je dat om zo'n public declaraties te doen??

Verwijderd

In een form kun je je variabelen gewoon met een DIM statement initialiseren, in een module zul je PRIVATE moeten gebruiken, of gewoon in je procedure DIMmen...
Dus: Private strBlabla as string bovenaan je module of...
Private Function Poehe () as String
dim strBlabla as string
end Function

Verwijderd

Er public voorzetten ?
Maar let wel het is in het algemeen een hele "lelijke" oplossing.

Vindt er niet zoiets plaats als datahiding ?
Op module niveau staat sSql maar ergens in een function/sub ook ?
Dan weet VB niet meer naar welk sSql wordt gerefereerd.

  • freeco
  • Registratie: Juni 2001
  • Laatst online: 14-08 19:50
ah ja, idd, Dim vervangen door Public en kreeg geen fout meer voor die sSQL...
en heel "mooi" moet het niet zijn... Tis maar voor intern gebruik voor een project tot eind februari. Misschien kan ik de modules ooit nog eens herbruiken.
tnx for the help! misschien krijg ik de excelmodule nog aan de praat :D

Verwijderd

Initialisatie vindt altijd plaats binnen VB zodra je een variabele declareert, nl de default waardes. Een string = "" een integer = 0 en een boolean is false. Alleen is het niet verstandig om op dit "standaard" gedrag van VB te vertrouwen.

Initialisatie van een variabele bij het declareren ervan kan pas in VB.Net

Verwijderd

freeco schreef op 14 januari 2003 @ 16:31:
ah ja, idd, Dim vervangen door Public en kreeg geen fout meer voor die sSQL...
en heel "mooi" moet het niet zijn... Tis maar voor intern gebruik voor een project tot eind februari. Misschien kan ik de modules ooit nog eens herbruiken.
tnx for the help! misschien krijg ik de excelmodule nog aan de praat :D
succes met je public :*)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Variables declared with Dim at the module level are available to all procedures within the module. At the procedure level, variables are available only within the procedure.
Een Dim in een module is hetzelfde als een Private.

Dwz dat je ze niet in een andere module kunt gebruiken.

Public maakt er een globale variabele van en die zijn een beetje vies. ( Ook voor intern gebruikt :) )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Public maakt er een globale variabele van en die zijn een beetje vies. ( Ook voor intern gebruikt :) )
Dat geld natuurlijk alleen voor variabelen die je niet global zou willen gebruiken. Een username, connectiestring of algemene programmainstellingen kun je prima globaal houden.

Alleen slechte programmeurs mogen geen gebruik maken van globale variabelen, omdat je bijvoorbeeld intTeller natuurlijk nooit globaal mag maken om in verschillende procedures te gebruiken.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Verwijderd schreef op 15 januari 2003 @ 12:33:
[...]


Dat geld natuurlijk alleen voor variabelen die je niet global zou willen gebruiken. Een username, connectiestring of algemene programmainstellingen kun je prima globaal houden.

Alleen slechte programmeurs mogen geen gebruik maken van globale variabelen, omdat je bijvoorbeeld intTeller natuurlijk nooit globaal mag maken om in verschillende procedures te gebruiken.
Het probleem is dat veel VB programmeurs beginnende programmeurs zijn. Oha kunnen ze niet goed inschatten aan welke voorwaarden een variabelen moet voldoen wil het in aanmerking komen voor een globale variabele.

Ik pleit er dan ook voor om geen enkele variabele globaal te maken, maar er in ieder geval een access functie voor te schrijven.
Het heeft mij al veel search en replace akties gescheeld omdat er bijvoorbeeld nog andere dingen moesten worden gedaan met het veranderen van een globale var.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1