Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1308to1312
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA Zellen aus Tabelle nach bestimmten Werten
21.04.2013 18:10:03
Jörg
Hallo,
gegeben ist ein Tabellenblatt Z mit einer großen Anzahl von Produktbezeichnungen in Spalte D, den dazugehörigen Artikelnummern in Spalte E. Spalte F differenziert die Produkte nach unterschiedlichen Versionen.
Aus einem Userform heraus soll nun an Hand der Produktbezeichnung die Artikelnummer und die letzte (vom wert her größte) Versionsnummer ausgelesen und an das Userform zurückgemeldet werden.
Ich hoffe mich klar ausgedrückt zu haben.
Danke schon einmal
Jörg

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Zellen aus Tabelle nach bestimmten Werten
21.04.2013 18:19:18
Oberschlumpf
Hi Jörg
Eine Bsp-Datei wäre schön, die all das schon enthält, was dir bekannt ist.
Das Userform mit allen erforderlichen Objekten + ausreichend Bsp-Daten wären schön.
Das Leben hauchen dann wir ein.
Du willst doch nicht, dass wir ALLES für dich erledigen, oder? Willst du doch? Dann wäre es Auftragsprogrammierung + kostet. ;-)
Ciao
Thorsten

AW: VBA Zellen aus Tabelle nach bestimmten Werten
22.04.2013 09:33:39
Jörg
Hallo,
hier die Datei:
https://www.herber.de/bbs/user/84987.xlsm
wie schon beschrieben soll in Tabellenblatt Zeichnungsnummer zu der in Spalte E angegebenen Artikelnummer die Zeichnungsnummer aus Spalte D ausgelesen werden und aus Spalte F der höchste dazugehörige Wert. Das voran stehende E oder V gibt an ob Entwurf oder Produktionsversion
Wenn ich die entsprechenden Werte habe kann ich dann darauf die nächst Zeichnungsnummer/Version aufbauen.
Für jemanden der erst seit 2 Wochen mit VBA arbeitet bin ich soweit mit dem zusammen geschriebenen (und kopierte) Code zufrieden.
Danke Für die Hilfe!
Jörg

Anzeige
AW: VBA Zellen aus Tabelle nach bestimmten Werten
22.04.2013 12:18:12
fcs
Hallo Jörg,
so ganz blicke ich da noch nicht durch.
1. Spaltentitel in Zeile 1 im Blatt "Zeichnungsnummern" wären sehr sinnvoll.
2. In Spalte F stehen keine Beispelangaben zu Version und Status z.B V3 oder E1.
Für die Verarbeitung der Daten wäre es einfacher, wenn Staus und Version in getrennten Spalten erfasst werden.
3. Der Wert in Spalte E erscheint in deinem Userform garnicht. Er wird vom Makro vor dem Eintragen zusammengesetzt. Wann soll denn nach der Version/Status gesucht werden?
4. In Spalte D wird nur eine fortlaufende Nummer eingetragen. Die Zeichnungsnummer steht in Spalte A bzw. wird dort eingetragen. Welche Information möchtest du den jetzt auslesen.
Irgendwie müsstest du doch erst eine Schaltfläche einbauen, die die Version/Status ermittelt und die Zeichnungsnummer anzeigt, wenn das Teil schon vorhanden ist, und mit "Übernehmen" dann die Daten ins Tabellenblatt eintragen.
Für die Suche nach der neuesten Version muss mann die ganze Liste nach der jeweiligen Teilebezeichnung in Spalte E durchsuchen und dabei dann die Versionsnummern mit den in einer Variablen gespeicherten Maxwerten vergleichen.
Wenn deine Liste kurz ist bis ca. 1000 Zeilen, dann kann man das einfach in einer For-Next-Schleife machen und die Zelleinträge auswerten.
Bei mehr Zeilen ist für zügiges Arbeiten eine andere Vorgehensweise erforderlich. Entweder man verwendet die Suchenfunktion von Excel, um alle Einträge der Teilebezeichnung nach einander zu suchen oder man lädt die relevanten Daten in ein Datenarray und wendet dann die For-Next-Schleifenmethode an.
Gruß
Franz

Anzeige
VlookUp mit mehreren Ergebnissen?
22.04.2013 17:06:19
Jörg
Hallo,
hatte einen lichten Moment und bin ein gutes Stück weiter gekommen.
die erste Abfrage habe ich geschafft^^ (Dank an Google und dieses Forum!)
Zu 1)
Ja mit Spaltentitel hätte ich mir die Arbeit auch leichter gemacht, jetzt habe ich mich an die Buchstaben gewöhnt und komme gut zurecht (wird sich aber bei deiner Überarbeitung in der Zukunft bestimmt rächen)
zu 2)
Wird erledigt Spalte F für Entwurf und G für Version, beides Angaben die erst in der Zukunft relevant werden.
zu 3)
Spalte E dient zur Überprüfung, ob ein Teil in dieser Konstellation schon einmal vorhanden war, Doppelnennungen sind nicht erlaubt. Diese Abfrage steht bereits. Gibt es bei der Eingabe hier Übereinstimmungen muss es sich um einen Entwurf oder eine neue Version handeln.
zu 4)
Das Auslesen und Verarbeiten der Spalte ist inzwischen realisiert, es kann zu jedem Teil 4 verschiedene Zustände geben, die die gleiche Grundnummer erhalten aber einen weiteren Index angehängt bekommen (X, OMD, Fertig, /MCF) mit Vlookup habe ich es geschafft.
Der für mich schwierigste Brocken bleibt die automatische Vergabe der Entwurfs- Versionsnummer bei gleicher Zeichnungsnummer. Mehr als jeweils 10 soll es nicht geben, dann ist eine neue Zeichnungsnummer dran.
Vielen Dank nochmals
Jörg
hier der bis dato entstandene Code, nicht ganz so gut strukturiert wie ich es mir dachte Kommentare muss ich aber noch einpflegen:
Option Explicit
'Fetslegen der modulweiten Variablen
Dim strTeil As String
Dim strXTeil As String
Dim strMaterial As String
Dim strKunde As String
Dim strArtikelnamen As String
Dim strGruppe As String
Dim lngNr As Long
Dim strVersion As String
Dim bytZustand As Byte
Dim strZnr As String
Dim lngZeilen As Long 'Zeilenanzahl in Zeichnungsnummer
Dim lngMax As Long 'höchste vergebene Zeichnungsnummer
Dim strVorhanden As String 'eingegebenes X-Teil
Dim strDa As String 'X-Teil vorhanden?
Dim bolDa As Boolean
Dim a As Byte
Dim myData As DataObject
Dim strWS1 As String 'Materialkomponente
Dim strSuche As String
Dim varVergleich1 As Variant
Dim strXteilbez As Variant
Private Sub UserForm_Initialize()
Dim oList As Object, rngc As Range
Set oList = CreateObject("scripting.dictionary")
With Sheets("Artikelnamen")
For Each rngc In .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp))
If Right(rngc, 1) = "X" Then
oList(oList.Count + 1) = rngc.Value
End If
Next
End With
ComboBox1.List = WorksheetFunction.Transpose(oList.items)
Me.ComboBox2.RowSource = "Material!A2:C101"
Me.ComboBox3.RowSource = "Warenuntergruppe!A2:B101"
Me.ComboBox4.RowSource = "Kundennummer!A2:B340"
'Me.ComboBox5.RowSource = "Zustand!A2:B5"
bytZustand = "0"
lngZeilen = Range("Zeichnungsnummer!A1").End(xlDown).Row
'lngMax = Max(Zeichnungsnummer!A)
lngMax = Application.Max(Sheets("Zeichnungsnummer").Range("D:D"))
'Zeilenzahl in Arbeitsblatt Zeichnungsnummer
lngZeilen = IIf(IsEmpty(Worksheets("Zeichnungsnummer").Cells(Rows.Count, 1)), Worksheets(" _
Zeichnungsnummer").Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
End Sub
Private Sub ComboBox1_click() 'Artikelname
strTeil = (ComboBox1.Value)
End Sub
Private Sub ComboBox2_Click() 'Material
strMaterial = ComboBox2
End Sub
Private Sub ComboBox3_Click() 'Warenuntergruppe
strGruppe = ComboBox3
End Sub
Private Sub ComboBox4_Click() 'Kundennummer
If CheckBox1 = False Then
strKunde = ""
Else
strKunde = ComboBox4
strKunde = "_" & strKunde
End If
End Sub
Private Sub CommandButton1_Click()
If ComboBox2 = "1" Then 'Or "11" Or "12"
strWS1 = "C-"
ElseIf ComboBox2 = "11" Then
strWS1 = "C-"
ElseIf ComboBox2 = "12" Then
strWS1 = "C-"
ElseIf ComboBox2 = "2" Then 'Or "3" Or "15" Or "16" Or "17" Or "18" Or "19"
strWS1 = "CF-"
ElseIf ComboBox2 = "3" Then
strWS1 = "CF-"
ElseIf ComboBox2 = "15" Then
strWS1 = "CF-"
ElseIf ComboBox2 = "16" Then
strWS1 = "CF-"
ElseIf ComboBox2 = "17" Then
strWS1 = "CF-"
ElseIf ComboBox2 = "18" Then
strWS1 = "CF-"
ElseIf ComboBox2 = "19" Then
strWS1 = "CF-"
End If
If ComboBox3 = "" Then
MsgBox "Keine Warengruppen angegeben!"
Exit Sub
End If
strVorhanden = Format(strMaterial, "00") & Format(strGruppe, "00") & strTeil
'Überprüfung ob X-Teil schon vorhanden
Dim rng As Range
Set rng = ThisWorkbook.Worksheets(2).Range("C1:C99999").Find(what:=strVorhanden)
If rng Is Nothing Then
bolDa = False
Else
bolDa = True
End If
If bolDa = False And OptionButton1 = False Then
MsgBox "Kein X-Teil vorhanden!"
OptionButton1 = True
Exit Sub
End If
If bolDa = True And OptionButton1 = True Then
MsgBox "X-Teil schon vorhanden!"
Exit Sub
End If
'OptionButtons Abfragen
If OptionButton1 = True Then
bytZustand = "0"
strArtikelnamen = strWS1 & strTeil
TextBox2 = strArtikelnamen
End If
If OptionButton2 = True Then
bytZustand = "1"
strArtikelnamen = strWS1 & Left(strTeil, Len(strTeil) - 1) & "OMD"
TextBox2 = strArtikelnamen
End If
If OptionButton3 = True Then
bytZustand = "2"
strArtikelnamen = strWS1 & Left(strTeil, Len(strTeil) - 2)
TextBox2 = strArtikelnamen
End If
If OptionButton4 = True Then
bytZustand = "3"
strArtikelnamen = strWS1 & Left(strTeil, Len(strTeil) - 2) & "/MCF"
TextBox2 = strArtikelnamen
End If
If CheckBox1 = False Then
strKunde = ""
End If
If CheckBox3 = False Then
strVersion = ""
End If
If strTeil = "" Then
MsgBox "Kein Artikelname angegeben"
Exit Sub
End If
If OptionButton1 = False Then
strXteilbez = Format(strMaterial, "00") & Format(strGruppe, "00") & strTeil
'MsgBox (strXteilbez)
varVergleich1 = Application.WorksheetFunction.VLookup(strXteilbez, Sheets("Zeichnungsnummer" _
).Range("C1:D" & lngZeilen), 2, False)
lngNr = varVergleich1
Else
lngNr = lngMax + 1
End If
strZnr = Format(strMaterial, "00") & Format(strGruppe, "00") & Format(lngNr, "000000") &  _
Format(bytZustand, "0") & Format(strKunde, "00000") & strVersion
TextBox1 = strZnr
'Überprüfung ob Teil schon vorhanden
strVorhanden = Format(strMaterial, "00") & Format(strGruppe, "00") & strArtikelnamen
Dim rng2 As Range
Set rng2 = ThisWorkbook.Worksheets(2).Range("E1:B99999").Find(what:=strVorhanden)
If rng2 Is Nothing Then
a = 1
Else
MsgBox ("Zeichnung schon vorhanden!")
Exit Sub
End If
'strXteilbez = Format(strMaterial, "00") & Format(strGruppe, "00") & strTeil
'Zeichnungsnummer abhängig von x-Teil
'varVergleich1 = WorksheetFunction.VLookup(strXteilbez, Sheets("Zeichnungsnummer").Range("C1: _
D" & lngZeilen), 3, False)
'strVergleich1 = VLookup((Format(strMaterial, "00") & Format(strGruppe, "00") & strTeil)" _
0100C-ABA 14 S X", Sheets("Zeichnungsnummer").Range("C1:D" & lngZeilen), 3, False)
'If OptionButton1 = False Then
'  MsgBox (strXteilbez)
'  varVergleich1 = Application.WorksheetFunction.VLookup(strXteilbez, Sheets(" _
Zeichnungsnummer").Range("C1:D2"), 2, False)
'  lngNr = varVergleich1
'Else
'  lngNr = lngMax + 1
'End If
'Werte an Tabelle übergeben
lngZeilen = lngZeilen + 1
Sheets("Zeichnungsnummer").Range("A" & lngZeilen).Value = strZnr
Sheets("Zeichnungsnummer").Range("B" & lngZeilen).Value = strArtikelnamen
Sheets("Zeichnungsnummer").Range("C" & lngZeilen).Value = Format(strMaterial, "00") & Format( _
strGruppe, "00") & strTeil
Sheets("Zeichnungsnummer").Range("D" & lngZeilen).Value = lngNr
Sheets("Zeichnungsnummer").Range("E" & lngZeilen).Value = strVorhanden
'Daten in Zwischenablage
Set myData = New DataObject
myData.SetText strZnr
myData.PutInClipboard
'Variablen löschen
End Sub

Anzeige
AW: VlookUp mit mehreren Ergebnissen?
23.04.2013 21:26:44
fcs
Hallo Jörg,
ich hab in deinem Userform die Function "fncZeileNeuesteVersion" eingebaut, die die Zeile mit der neuesten Version zu einem Teil in Spalte E ermittelt.
Beispielhaft hab ich auch eine 2. Userform integriert, in der die weitere Aktion bei einem schon vorhandenen Teil abgefragt wird.
Dazu hab ich auch die Listbox für die Versions-Nummer mit Leben erfüllt. (Auswahlliste im Blatt "Zustand")
Die lange Kette von If ... ElseIf ... ElseIf... End If
ersetzt du besser durch eine Select Case - Anweisung. Die ist etwas eleganter in der Programmierung.
Gruß
Franz
https://www.herber.de/bbs/user/85025.xlsm
Anzeige

353 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige