Gå til innhold

Excel VBA: Database


Word

Anbefalte innlegg

Hei,

 

har en database med følgende kode:

 

Private Sub ComboBox1_Change()
   Dim ws As Worksheet
   Dim LR As Long
   Dim Cell As Range
   Dim List As New Collection
   Dim Item As Variant
   Set ws = Worksheets("Database")
   With ws
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    ComboBox2.Clear
    For Each Cell In .Range("A2:A" & LR)
	    With Cell
		    If .Text = ComboBox1.Value Then
			    On Error Resume Next
			    List.Add .Offset(0, 1).Text, CStr(.Offset(0, 1).Value)
			    On Error GoTo 0
		    End If
	    End With
    Next Cell
    For Each Item In List
	    ComboBox2.AddItem Item
    Next Item
   End With
End Sub
Private Sub ComboBox2_Change()
   Dim ws As Worksheet
   Dim LR As Long
   Dim Cell As Range
   Dim List As New Collection
   Dim Item As Variant
   Set ws = Worksheets("Database")
   With ws
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    ComboBox3.Clear
    For Each Cell In .Range("A2:A" & LR)
	    With Cell
		    If .Text = ComboBox1.Value Then
			    If .Offset(0, 1).Text = ComboBox2.Value Then
				    On Error Resume Next
				    List.Add .Offset(0, 2).Text, CStr(.Offset(0, 2).Value)
				    On Error GoTo 0
			    End If
		    End If
	    End With
    Next Cell
    For Each Item In List
	    ComboBox3.AddItem Item
    Next Item
   End With
End Sub
Private Sub ComboBox3_Change()
   Dim ws As Worksheet
   Dim LR As Long
   Dim Cell As Range
   Dim List As New Collection
   Dim Item As Variant
   Set ws = Worksheets("Database")
   With ws
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    ComboBox4.Clear
    For Each Cell In .Range("A2:A" & LR)
	    With Cell
		    If .Text = ComboBox1.Value Then
			    If .Offset(0, 2).Text = ComboBox3.Value Then
				    On Error Resume Next
				    List.Add .Offset(0, 3).Text, CStr(.Offset(0, 3).Value)
				    On Error GoTo 0
			    End If
		    End If
	    End With
    Next Cell
    For Each Item In List
	    ComboBox4.AddItem Item
    Next Item
   End With
End Sub

 

Databasen har form som vist på bildet Database2.jpg.

 

Brukeren henter data ved hjelp av kombobokser som vist på bildet Database.jpg.

 

Spørsmålet er som følger:

Hvordan får jeg data fra Description inn i tekstboksen når komboboksen "Equipment name" er valgt? (Se bildet Database3.jpg)

post-206048-0-56978000-1375532140_thumb.jpg

post-206048-0-50398400-1375532150_thumb.jpg

post-206048-0-94745000-1375532621_thumb.jpg

Lenke til kommentar
Videoannonse
Annonse

Hei,

 

Kategori A gir input til B som gir input til C. Når C er valgt så gir denne input til både D og E.

Brukeren kan selv velge om han vil bruke verdien gitt i D eller om han vil putte inn sin egen verdi her, mens beskrivelsen skal han se uansett når han har valgt C.

 

Jeg prøvde å legge inn koden du gav som vist under, men dette fører til at jeg alltid får verdien i celle E2. uavhengig om hva jeg har gitt som input til combobox3 (altså C):

 

Private Sub ComboBox3_Change()
   Dim ws As Worksheet
   Dim LR As Long
   Dim Cell As Range
   Dim List As New Collection
   Dim Item As Variant
   Set ws = Worksheets("Database")
   With ws
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    ComboBox4.Clear
    For Each Cell In .Range("A2:A" & LR)
	    With Cell
		    If .Text = ComboBox1.Value Then
			    If .Offset(0, 2).Text = ComboBox3.Value Then
				    On Error Resume Next
				    List.Add .Offset(0, 3).Text, CStr(.Offset(0, 3).Value)
				    On Error GoTo 0
			    End If
		    End If
	    End With
    Next Cell
    For Each Item In List
	    ComboBox4.AddItem Item
	    TextBox14.Text = Worksheets("Database").Cells(ComboBox3.ListIndex + 2, 5).Value
    Next Item
   End With
End Sub

 

Har kanskje satt den inn på feil sted? :)

Lenke til kommentar

Er jeg som skal si sorry, er litt dårlig til å forklare :)

 

Skal prøve igjen:

Kategori A (ComboBox1) skal inneholde diverse utstyr som for eksempel motor. Når Motor er valgt skal det i B (ComboBox2) dukke opp forskjellige produsenter av motorer. Når produsenten er valgt skal forskjellige motorer fra produsenten dukke opp i C (ComboBox3). Når C er valgt skal D (ComboBox4) fylles med vekten, samtidig som tekstboksen (TextBox14) fylles med beskrivelsen av motoren.

Lenke til kommentar

Ok, så vet vi hva den skal. Fint.

 

Men er det slik at alle kombinasjoner valg i ABC har sin egen linje, og at den inneholder beskrivelsen som skal hentes fra E?

Eller er ABCD uavhengige lister med unike verdier som fritt kan kombineres? Hva henger i så fall beskrivelsen fast i?

 

To spørsmål til: Kan man skrive fritekst i combo'ene eller må man velge mellom faste verdier? Og, har du skrevet koden og-eller forstår den godt, eller er det noen andres verk?

 

Jeg ser for meg et søk etter ABC-kombinasjonen for å hente E, men det er kanskje ikke den beste løsningen. Og, hvis rekkefølgen av valg er så entydig som du sier, tror jeg det er mer brukervennlig å gjøre dette i 3-4 skjermbilder og ikke ett. Enklere å lage også. Skjer valgene i en Userform eller i et regneark?

 

Vet jeg spør mye. Vil bare at det skal bli kulest mulig :)

 

Beste hilsen Harald

Lenke til kommentar

Hvis jeg gjetter rett er dette den mest konsistente måten å gjøre det på:

 

	    For Each Item In List
			    ComboBox4.AddItem Item
	    Next Item
'NY:
	    Call HentBeskrivelse
   End With
End Sub

Private Sub HentBeskrivelse()
   Dim ws As Worksheet
   Dim LR As Long
   Dim Cell As Range
   Dim List As New Collection
   Dim Item As Variant
   Set ws = Worksheets("Database")
   With ws
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    TextBox1.Text = ""
    For Each Cell In .Range("A2:A" & LR)
		    With Cell
				    If .Text = ComboBox1.Value Then
					    If .Offset(0, 1).Text = ComboBox2.Value Then
						    If .Offset(0, 2).Text = ComboBox3.Value Then
							    TextBox1.Text = .Offset(0, 4).Value
							    Exit Sub
						    End If
					    End If
				    End If
		    End With
    Next Cell
   End With
End Sub

 

Beste hilsen Harald

Lenke til kommentar
Hvis jeg gjetter rett er dette den mest konsistente måten å gjøre det på:
 For Each Item In List ComboBox4.AddItem Item Next Item 'NY: Call HentBeskrivelse End With End Sub Private Sub HentBeskrivelse() Dim ws As Worksheet Dim LR As Long Dim Cell As Range Dim List As New Collection Dim Item As Variant Set ws = Worksheets("Database") With ws LR = .Cells(.Rows.Count, 1).End(xlUp).Row TextBox1.Text = "" For Each Cell In .Range("A2:A" & LR) With Cell If .Text = ComboBox1.Value Then If .Offset(0, 1).Text = ComboBox2.Value Then If .Offset(0, 2).Text = ComboBox3.Value Then TextBox1.Text = .Offset(0, 4).Value Exit Sub End If End If End If End With Next Cell End With End Sub 

Beste hilsen Harald

 

Helt genialt! Takk!! :) :) :)

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...