PDA

Vollständige Version anzeigen : 2 Spalten matchen und entsprechende Zeile ausgeben


skyfe
21.04.2009, 10:28
Hallo,

ich will folgendes in VBA lösen:

Ich habe vereinfacht 4 Spalten (Gruppe , Land , U2004 , U2005)

Für mein Kriterium "Gruppe01 Land01" möchte ich die Werte rein schreiben, die genau in dieser Zeile stehen (U2004, U2005), der Datensatz kommt nur einmal im Excel vor.

Also ich möchte das mittels VBA abfragen, dann die Zeilennummer rausbekommen und die dazugehörigen Zeilenwerte in ein anderes Tabellenblatt schreiben.

Kann mir da jemand helfen?

Danke!

jinx
21.04.2009, 10:34
Moin, skyfe,

sieh doch bitte mal in der VBA-Hilfe unter FIND nach - beim Setzen eines Ranges kann man dort per rng.Row die Zeilennummer erhalten und in einer Cells-Eigenschaft weiterverwenden... ;)

skyfe
21.04.2009, 10:59
Danke erstmal, habe mir die Hilfe angesehen, also komme auf diesen Code:

With Worksheets(Data).Range("a1:a500")

Set zeile = .Find(2, LookIn:=xlValues)

End With

Irgendwie funktioniert das aber noch nicht so. Dann fehlt noch die Erweiterung auf Spalte B in der Suche.
Also das Find Argument soll z.B.: nach "Gruppe01" in Spalte A und "Land01" in Spalte B suchen.

jinx
21.04.2009, 11:03
Moin, skyfe,

die Nebenzelle zu zeile per zeile.Offset(0, 1).Value = "xyz" prüfen bzw. FindNext einsetzen und von der Fundstelle aus weitersuchen...

skyfe
21.04.2009, 11:45
Hallo jinx,

danke für den Hinweis.
Mir ist klar ich muss das ganz in einer Schleife durchlaufen, so lange bis die zwei Zellen mein gewünschtes Kriterium erfüllen.
Leider bring ich den zusammenhängenden Code nicht hin, kannst du da weiter helfen?

jinx
21.04.2009, 14:23
Moin, skyfe,

folgende Ausgangslage bei mir:

<b>Tabelle2</b><br /><br /><table border="1" cellspacing="0" cellpadding="0" style="font-family:Arial,Arial; font-size:10pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "> <colgroup><col style="font-weight:bold; width:30px; " /><col style="width:80px;" /><col style="width:80px;" /><col style="width:80px;" /></colgroup><tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "><td >&nbsp;</td><td >A</td><td >B</td><td >C</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >1</td><td >Gruppe01</td><td >&nbsp;</td><td >Land01</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >2</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >3</td><td >Gruppe00</td><td >Land01</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >4</td><td >Gruppe01</td><td >Land00</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >5</td><td style="background-color:#ffff00; ">Gruppe01</td><td style="background-color:#ffff00; ">Land01</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >6</td><td >Gruppe01</td><td >Land02</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >7</td><td >Gruppe01</td><td >Land03</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >8</td><td >Gruppe02</td><td >Land04</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >9</td><td >Gruppe03</td><td >Land05</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >10</td><td >Gruppe04</td><td >Land06</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >11</td><td >Gruppe05</td><td >Land07</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >12</td><td >Gruppe06</td><td >Land08</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >13</td><td >Gruppe01</td><td >Land09</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >14</td><td >Gruppe01</td><td >Land10</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >15</td><td style="background-color:#ffff00; ">Gruppe01</td><td style="background-color:#ffff00; ">Land01</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >16</td><td >Gruppe01</td><td >Land02</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >17</td><td >Gruppe01</td><td >Land03</td><td >&nbsp;</td></tr></table> <br />

In A1 und C1 stehen die Suchbegriffe, ein Code von Herber wird nach Umarbeitung eingesetzt:

Sub Auswahl()
'Herber 058499v.xls

Dim rngZelle As Range
Dim strSuchbegriff As String
Dim strVergleich As String
Dim strFundstelle As String

strSuchbegriff = Range("A1")
strVergleich = Range("C1")

'Fundstelle in Spalte A suchen
Set rngZelle = ActiveSheet.Columns("A:A").Find( _
what:=strSuchbegriff, _
LookIn:=xlValues, _
lookat:=xlWhole, _
searchorder:=xlByRows, _
after:=Cells(Rows.Count, "A"))

'kein Treffer, Meldung und Abbruch
If rngZelle Is Nothing Then
Beep
MsgBox prompt:="Suchbegriff nicht gefunden!"
Exit Sub
End If

'Übernahme der Adresse in Variable für Vergleich
strFundstelle = rngZelle.Address
'Vergleich Nebenzelle, bei Übereinstimmung Ausgabe im Direktbereich
If rngZelle.Offset(0, 1).Value = strVergleich Then Debug.Print rngZelle.Address(False, False)

'Vergleich und Schleife
While ActiveCell.Address <> strFundstelle
Set rngZelle = Cells.FindNext(after:=rngZelle)
If rngZelle.Address = strFundstelle Then Exit Sub
If rngZelle.Offset(0, 1).Value = strVergleich Then Debug.Print rngZelle.Address(False, False)
Wend

Set rngZelle = Nothing

End Sub
Im Direktfenster der VBE (Aufruf per STRG+G) erscheint bei mir (ich setze Excel97 ein, daher kein Hinweis darauf, welche AddIns geladen werden):

A5
A15

skyfe
21.04.2009, 18:41
Sieht gut aus!
Es scheint zu funktionieren...

Vielen Dank jinx!!!!

ebs17
21.04.2009, 20:18
Eine alternative Methode:
Public Sub ZeileKopieren()
' frei nach Peter Haserodt
Dim oAdoConnection As Object
Dim oAdoRecordset As Object
Dim sAdoConnectString As String
Dim sPfad As String
Dim sQuery As String
Dim sGruppe As String
Dim sLand As String
Dim oZielStartRange As Range

On Error GoTo Fehler
sPfad = ThisWorkbook.FullName
sGruppe = ThisWorkbook.Worksheets("Daten").Range("F2").Value
sLand = ThisWorkbook.Worksheets("Daten").Range("F3").Value

Set oZielStartRange = ThisWorkbook.Worksheets("Ausgabe").Range("B2")
Set oAdoConnection = CreateObject("ADODB.CONNECTION")
sAdoConnectString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & sPfad
oAdoConnection.Open sAdoConnectString
Set oAdoRecordset = CreateObject("ADODB.RECORDSET")

' Die eckigen Klammern bei den Feldbezeichnungen sind eigentlich nur notwendig,
' wenn die Bezeichnungen Leerzeichen und/oder Sonderzeichen enthalten
sQuery = "SELECT [Gruppe], [Land], [U2004], [U2005] FROM [Daten$]" & _
" WHERE [Gruppe] = '" & sGruppe & "' AND [Land] = '" & sLand & "'"
With oAdoRecordset
.Source = sQuery
.ActiveConnection = oAdoConnection
.Open
End With
If oAdoRecordset.EOF Then
MsgBox "kein Treffer, Abbruch"
Else
oZielStartRange.CopyFromRecordset oAdoRecordset, 1 ' 1 (optional) = 1 Zeile
MsgBox "Zeile kopiert"
End If

Aufraeumen:
On Error Resume Next
oAdoRecordset.Close
oAdoConnection.Close
Set oAdoRecordset = Nothing
Set oAdoConnection = Nothing
Set oZielStartRange = Nothing
Exit Sub
Fehler:
MsgBox "Fehler: " & Err.Description
Resume Aufraeumen
End Sub

skyfe
23.04.2009, 17:11
Hallo ebs17,

die Variante mit der Abfrage scheint sogar noch kürzer zu sein.
Ich brauche aber dann nicht den gesamten Datensatz, der Code soll "nur" die entsprechende Zeilennummer ( in deinem Bsp. wäre das also "11") in eine bestimmte Zeile schreiben.

Geht das mit dieser Methode?

Danke!

ebs17
23.04.2009, 18:23
Nicht ohne weiteres. Die verwendete Methode ist eine Datenbankmethode.
In Datenbanktabellen hat eine Position oder Reihenfolge keine wesentliche Bedeutung, da geht es um Inhalte. Angepasste Sortierungen würde man mit geeigneten Abfragen erzielen.

Möglich wäre es mit einer zusätzlichen Spalte, die die Zeilennummer enthält. Dann würde man die Abfrage / das Recordset nur danach auswerten.
...
sQuery = "SELECT [Zeilennummer] FROM [Daten$]" & _
" WHERE [Gruppe] = '" & sGruppe & "' AND [Land] = '" & sLand & "'"
...