Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1028to1032
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
Inhaltsverzeichnis

Zahlengruppen vergleichen VBA

Zahlengruppen vergleichen VBA
09.12.2008 23:10:00
marion
Hallo,
Habe hier ein schweres Problem (für mich).
Aus dem Archiv habe ich mir nichts passendes zusammenbauen können.
Vielleicht kann mir hier jemand helfen.
https://www.herber.de/bbs/user/57492.xls
Die Zahlengruppe in Spalte A soll mit der Zahlengruppe in Tabelle2 A verglichen werden.
Wenn eine Zahl gefunden wird, soll in Spalte B für jede gefunden Zahl eine 1 addiert werden.
Also, Zahl wieviel mal gefunden. Beispiel in Spalte K
Die Schwierigkeit ist Zeile 9 und Zeile 13.
Mehrere Zahlen in einer Zelle mit "/" getrennt. Bis 4 Zahlen in einer Zelle
Diese Zahlen müssen nicht einzeln gezählt werden, es reicht die Anzahl wieviel mal gefunden.
Das Ganze müsste ich in VBA haben, da die Daten in VBA weiterverarbeitet werden.
Sicher müsste das in einer Schleife laufen (bis 4 Zahlen in einer Zelle!) ,aber ich hab keine Ahnung wie.
Danke für jede Hilfe
marion

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlengruppen vergleichen VBA
10.12.2008 01:28:00
Erich
Hallo Marion,
warum nicht per Formel in Excel?
 ABC
1 gefunden 
22330122
32112411
42068111
52958000
62094833
73094311
83456722
924653/52410/46670/1234555
102609300
112252211
122443322
1322761/2849233
142305400

Formeln der Tabelle
ZelleFormel
B2=ZÄHLENWENN(Tabelle2!$A$2:$A$22;--LINKS(A2;5)) +WENN(LÄNGE(A2)>10;ZÄHLENWENN(Tabelle2!$A$2:$A$22;--TEIL(A2;7;5)); 0) +WENN(LÄNGE(A2)>16;ZÄHLENWENN(Tabelle2!$A$2:$A$22;--TEIL(A2;13;5)); 0) +WENN(LÄNGE(A2)>22;ZÄHLENWENN(Tabelle2!$A$2:$A$22;--TEIL(A2;19;5)); 0)
B3=ZÄHLENWENN(Tabelle2!$A$2:$A$22;--LINKS(A3;5)) +WENN(LÄNGE(A3)>10;ZÄHLENWENN(Tabelle2!$A$2:$A$22;--TEIL(A3;7;5)); 0) +WENN(LÄNGE(A3)>16;ZÄHLENWENN(Tabelle2!$A$2:$A$22;--TEIL(A3;13;5)); 0) +WENN(LÄNGE(A3)>22;ZÄHLENWENN(Tabelle2!$A$2:$A$22;--TEIL(A3;19;5)); 0)

Und wenns VBA sein soll (schreibt hier in Spalte C):

Sub Makro1()
With Range("C2:C14")
.Formula = "=COUNTIF(Tabelle2!$A$2:$A$22,--LEFT(A2,5))" _
& "+IF(LEN(A2)>10,COUNTIF(Tabelle2!$A$2:$A$22,--MID(A2,7,5)),0)" _
& "+IF(LEN(A2)>16,COUNTIF(Tabelle2!$A$2:$A$22,--MID(A2,13,5)),0)" _
& "+IF(LEN(A2)>22,COUNTIF(Tabelle2!$A$2:$A$22,--MID(A2,19,5)),0)"
.Formula = .Value
End With
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Zahlengruppen vergleichen VBA
10.12.2008 01:57:00
Uwe
Hi Marion,
ich hatte auch ein bisschen in VBA dran herumgebastelt, aber Erich war schneller und besser. Mit der Formel läuft der Code auf jedenfall wesentlich schneller als meine Schleifenlösung:

Sub Auswerten()
Dim Zelle1 As Range
Dim Zelle2 As Range
Dim Bereich1 As Range
Dim Bereich2 As Range
With Worksheets("Tabelle2")
Set Bereich1 = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
With Worksheets("Tabelle1")
Set Bereich2 = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
For Each Zelle1 In Bereich1
For Each Zelle2 In Bereich2
If InStr(1, CStr(Zelle2.Value), CStr(Zelle1.Value)) > 0 Then _
Zelle2.Offset(0, 1).Value = Zelle2.Offset(0, 1).Value + 1
Next Zelle2
Next Zelle1
End Sub


Ich schicke sie Dir trotzdem mal. Einen kleinen Vorteil hat meine Lösung, sie findet die Nummer aus Tabelle2 in Tabelle1, egal wie die Felder aufgebaut sind, würde die 52410 also auch finden wenn in A9 "1234579/sdf/sdff52410/sdf oder so stände.
Gruß
Uwe
(:o)

Anzeige
Zahlengruppen vergleichen - wobei...
10.12.2008 02:42:43
Luc:-?
...mir nicht einsichtig ist, Marion,
warum das unbedingt mit VBA erfolgen soll. Da ja die Zählwerte ohnehin in Spalte B eingetragen wdn sollen, ist doch anzunehmen, dass die weiterverarbeitende Prozedur genau auf diese Spalte zugreift. Also könntest du auch Formeln verwenden! Wenn nicht dein spezielles Problem wäre, könntest du das mit ZÄHLENWENN lösen. So muss für die Kombizahlen erst ein Wertefeld erzeugt wdn. Dafür gibt's in www.excelformeln.de bestimmt eine reine Standardformellösung, die wahrscheinlich recht kompliziert anmutet... ;-)
Deshalb stelle ich dir hier mal eine auf das Nötigste reduzierte udFkt ein (Umsetzung der vbFkt Split), die du in einer Tabellenfml einsetzen kannst (in ein Standardmodul des VBA-Projektes oder einer stets gleichzeitig geöffneten Makro-Sammlung bzw eines AddIns kopieren!).

Function Splitt(Bezug, ByVal Trenner As String)
Splitt = Split(Bezug, Trenner)
End Function


Diese kannst du in der folgenden einzelligen Matrixformel (zur speziellen Eingabe solcher Fml b.Bedarf in der xlHilfe nachlesen!), die zur Voraussetzung hat, dass die Zahlen im korrespondierenden Bereich von Tabelle2 einzeln auftreten (auf Grund deiner doch recht guten Beschreibung des Problems habe ich auf einen Download verzichtet!), einsetzen (Fml nach unten kopieren!)...
{=SUMME(--(--Splitt(Tabelle1!A1;"/") =Tabelle2!A$1:A$20))} → deine_bezüge!
Dabei haben die Doppelminus die Aufgabe, Textzahlen bzw Wahrheitswerte in echte Zahlen zu verwandeln. Ersatzweise könntest du auch jeweils mit 1 multiplizieren oder 0 addieren.
Übrigens kannst du die udFkt natürlich auch für analoge Aufgaben wiederverwenden - auch mit >4 Zahlen in einer Zelle - also keine "Insellösung"... ;-)
Gruß Luc :-?

Anzeige
AW: Zahlengruppen vergleichen - wobei...
10.12.2008 04:46:00
marion
Hallo Erich, Uwe, Luc,
ganz kurz, muß zur Arbeit und kann erst heut Nachmittag weiter reinschauen.
Ja muß in VBA sein.
Die Tabelle war nur ein Beispiel.
Die Daten werden in VBA weiterverarbeitet, es wird nicht auf Spalte B zugegriffen.
marion
Hiermit erreichst du gleiche Ergebnisse...
11.12.2008 00:13:52
Luc:-?
...wie mit meiner Fml, Marion,
natürlich zu analogen Bedingungen...

Sub GleicheZählen()
Dim i As Long, z() As Long, y, _
vb As Range, x As Range, zb As Range
Const Trenner As String = "/", VBer As String = "A1:A12", _
VBl As String = "Tabelle2", ZBer As String = "A1:A10", _
ZBl As String = "Tabelle1"
With ActiveWorkbook
Set vb = .Sheets(VBl).Range(VBer)
Set zb = .Sheets(ZBl).Range(ZBer)
End With
ReDim z(zb.Count - 1) As Long
For Each x In zb
With WorksheetFunction
If CBool(InStr(x, Trenner)) Then
For Each y In Split(x, Trenner)
z(i) = z(i) + .CountIf(vb, y)
Next y
Else: z(i) = .CountIf(vb, x)
End If
End With
i = i + 1
Next x
zb.Offset(0, 1) = WorksheetFunction.Transpose(z) 'Sp.B nur für Test
End Sub


Vorausgesetzt ist hier die VBA-Standardeinstellung nach der Feldindizes (hier i) mit 0 beginnen. Im Prinzip müssen nur die Konstanten Const angepasst wdn. Je nach Ablauf des HptPgms könnte diese Subroutine auch als UP genutzt wdn (Call GleicheZählen). Dafür müsste z allerdings entweder als Globalvariable (Tipp: dann längeren Namen wählen) oder zusätzlich im HptPgm (unter beliebigem Namen mit Übergabe als Parameter [Call GleicheZählen(zname)] an GleicheZählen) deklariert wdn. Im letzteren Fall erfolgt die Deklaration von z im UP dann nur als Prozedurparameter (ByRef).
Viel Spaß beim Zusammenbau (hoffentlich bist du damit nicht überfordert)... ;-)
Gruß Luc :-?

Anzeige
Danke Luc :-?
11.12.2008 17:21:49
marion
Hallo Luc :-?,
danke für Deine Hilfe,
ich Versuch mal ob ich damit klar komme.
Danke
marion
Bitte sehr! Gern geschehen! Gruß owT
11.12.2008 17:27:00
Luc:-?
:-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige