Gå til innhold

Anbefalte innlegg

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 :hmm::hmm: 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
Videoannonse
Annonse

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...