sputnik01 Skrevet 9. oktober 2006 Del Skrevet 9. oktober 2006 Jeg er ny i vba programmering Jeg lurer på følgende Jeg har en UserForm med labeler. Datene som skal være i labelene skal jeg hente fra et Excel ark. Jeg bruker denne koden: Label1.Caption = Sheet("Ark1").range("A1") Label2.Caption = Sheet("Ark1").range("B1") osv.... Da jeg har mange labeler på UserFormen så blir dette mange linjer med kode. Kan dette skrives på en enklere måte? Jeg vil også at de labelene som ikke inneholder noe data ikke skal være synlige. Jeg bruker denne koden: If Label1.Caption="" then Label1.Visible = False else LAbel1.Visible = True End if If Label2.Caption="" then Label2.Visible = False else LAbel2.Visible = True End if Kan denne koden også skrives enklere? På forhånd takk for alle svar Lenke til kommentar
Harald Staff Skrevet 9. oktober 2006 Del Skrevet 9. oktober 2006 Hei Userformkontroller er dessverre ikke medlemmer av collections, annet enn dens generelle "controls", der du får tak i dem pr navn. Så du kan saktens gjøre det på denne måten: Dim L As Long For L = 1 To 4 If Sheets("Ark1").Cells(L, 1).Text = "" Then Me.Controls("Label" & L).Visible = False Else Me.Controls("Label" & L).Caption = Sheets("Ark1").Cells(1, L).Text Me.Controls("Label" & L).Visible = True End If Next Men "enklere måte" betyr her bare mindre kode å skrive. Koden selv er mer tuklete og tregere enn løsningen du allerede har, og den er mindre fleksibel, verre å lese og å vedlikeholde. Så jeg ville igjort det på den måten du allerede bruker, når det er skrevet en gang for alle så er den det. Det beste fra begge verdener er å skrive en liten makro som skriver slik kode for deg. Kjør denne en gang Sub SkriveKode() Dim L As Long For L = 1 To 10 Debug.Print "Label" & L & ".Caption = Sheet(""Ark1"").range(""" & Chr(64 + L) & "1"").text" Debug.Print "If Label" & L & ".Caption = """" then" Debug.Print vbTab & "Label" & L & ".Visible = False" Debug.Print "Else" Debug.Print vbTab & "Label" & L & ".Visible = True" Debug.Print "End If" Debug.Print "Next" Debug.Print Next End Sub så har du ferdig kode i Immediate Window (View-menyen), som du så klipper-limer inn i makroen din. Legg merke til uttrykket Sheets("Ark1").Cells(1, L).Text eller Sheets("Ark1").Range("A1").Text Når du skriver Sheet("Ark1").range("A1") så spesifiserer du ikke HVA fra A1 du vil ha returnert; fontnavn, bakgrunnsfarge, adresse, ... og dermed returneres Value, som er satt som default. Excel er ikke Wysiwyg, og det kan godt være forskjell på det cella viser (Text) og dens egentlige innhold (Value), avhengig av cellefornatering, antall desimaler etc. Tydeligst er dette hvis en celle inneholder dato - tid, da er Value bare et ubegripelig desimaltall. Spesifiser Text, så får du det som vises i cella. HTH. Beste hilsen Harald Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå