09. september 2005 - 14:56Der er
8 kommentarer og 1 løsning
Definere en classe og opprette et object
Har tenkt å lære meg å "tenke" Object-Orientert. Men jeg har litt problemer med å finne ut hva jeg skal benytte til objekter.
Har noe kode som jeg benytter i vba for excel.
Dette er kode som ser gjennom en mappe for å finne csv-filer. Hvis den finner csv-filer bir disse endret til txt-filer.
Kan jeg løse denne oppgaven ved å definere en abstrakt klasse, som løser oppgaven?
Set fso = CreateObject("Scripting.FileSystemObject") Set fsoFld = fso.GetFolder(sCsvFld)
For Each fsoFil In fsoFld.Files If UCase(Right(fsoFil.Name, 3)) = "CSV" Then sFilNavn = Left(fsoFil.Name, Len(fsoFil.Name) - 3) & "txt" If fso.FileExists(fsoFld & sFilNavn) Then fso.DeleteFile (fsoFld & sFilNavn) End If fsoFil.Name = sFilNavn End If Next Set fso = Nothing Set fsoFld = Nothing
Hei Christian Det er egentlig VBA i Excel 2003, så jeg kan nok glemme nedarving. Bør jeg definere en tekstFilklasse, som kan endre sin endelse fra csv til txt? Så kan jeg kansje ha en folderklasse, som inneholder en samlig med tekstfilobjekter? Hvordan ville i så fall koden se ut?
Koden som står i mitt opprinnelige spørsmål, fikser også den oppgaven. Men nå hadde jeg lyst til å løse oppgaven objectoriert. Så spørsmåleg går mere på hvordan jeg definerer et object og etterpå bruker det.
En klasse i VBA er ikke en klasse som du måske kender fra java eller DotNet. I VBA er en klasse sådan set bare en container for en række metoder og attributter.
Hvis du laver et nyt class module og kalder den f.eks. clsFolder. Du instantiere en instans af denne klasse ved at gøre følgende:
dim cFolder as new clsfolder
eller
dim cfolder as clsfolder set cfolder = new clsfolder
Du kan IKKE lave din egen constructor! I din klasse definerer to dine metoder og dine attributter. Skal du kunne tilgå dem gennem klassens laves de public, skal du kun tilgå dem inde i selve klassen, laves de private.
Du kunne evt. lave følgende function inde i klassen:
Private Function RenameFileInFolder(Path as string, OldExt as string, NewExt as string) as long
Dim FILEEXT As String = oldext Dim NEWFILEEXT As String = newExt Dim FilePath As String Dim FileName As String Dim Extpos As Integer Dim RenameCount as long
Du kan også udvide funktionen så den "raiser" en event for hver fil den renamer.
Så skal du i dine erklæringer øverst i modulet skrive: Public Event FileRenamed(Path as string, OldFileName as string, NewFileName as string)
I funktionen RenameFileInFolder skal du under "name filepath....." Skrive raise FileRenamed (Filepath, FilePath & "\" & FileName,FilePath & "\" & Left$(FileName, Extpos) & NEWFILEEXT)
Når du erklærer en klasse, der kan "raise events" og du ønsker at fange disse, skal du skrive private/public WithEvents cFolder as new clsFolder.
Du kan nu se klassens events, ligesom du vil gøre hvis det var en textbox.
Hisk at sætte din klasse til nothing når du er færdig med den. (Set cfolder = nothing)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.