Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1568to1572
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

Zahlenfolge suchen und in neuem Blatt einfügen

Zahlenfolge suchen und in neuem Blatt einfügen
25.07.2017 12:37:50
Paul
Hi zusammen,
ich bitte um Hilfe bei folgendem Problem.
Auf einem Blatt stehen querbeet verteilt Artikelnummern (8stellig). Nun muss ich diese Artikelnummern in ein anderes Sheet in eine Spalte untereinander kopieren.
Sprich die Funktion soll folgendes machen, Durchsuche ein komplettes Arbeitsbaltt, finde alle 8 Stelligen Nummern und kopiere diese in eine neue bestenfalls Tabelle, weil ich zu den gefundenen Artikelnummern per SVERWEIS weitere Daten benötige und die Formeln sollten automatisch runter kopiert werden. In der Angefügten Datei ist ein ein Beispiel.
Im Beispiel sind die Daten und die Zieltabell auf einem Sheet zwecks der Übersicht.
https://www.herber.de/bbs/user/115042.xlsx
Im Voraus besten Dank für eure Hilfe!
Gruss Paul

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlenfolge suchen und in neuem Blatt einfügen
25.07.2017 12:45:06
Michael
Hallo!
Sub a()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Tabelle1") 'Quell-Blatt
Dim WsZ As Worksheet, a, i&, j& 'Ziel-Blatt
Application.ScreenUpdating = False
Set WsZ = Wb.Worksheets.Add(after:=Wb.Worksheets(Wb.Worksheets.Count))
a = WsQ.UsedRange
For i = LBound(a, 1) To UBound(a, 1)
For j = LBound(a, 2) To UBound(a, 2)
If IsNumeric(a(i, j)) Then
If Len(a(i, j)) = 8 Then
With WsZ
.Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) = a(i, j)
End With
End If
End If
Next j
Next i
End Sub
Blattnamen ggf. anpassen, das Ziel-Blatt wird neu erstellt am Ende der Mappe.
Passt?
LG
Michael
Anzeige
AW: Zahlenfolge suchen und in neuem Blatt einfügen
25.07.2017 12:49:33
Rudi
Hallo,
als Rumpfcode:
Sub aaa()
Dim objDic As Object, rngC As Range
Set objDic = CreateObject("scripting.dictionary")
For Each rngC In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, xlNumbers)
If Len(rngC) = 8 Then objDic(rngC.Value) = 0
Next
Worksheets.Add.Cells(1, 1).Resize(objDic.Count) = Application.Transpose(objDic.keys)
End Sub
Gruß
Rudi
AW: Zahlenfolge suchen und in neuem Blatt einfügen
25.07.2017 13:41:58
Max2
Hallo,
den unten folgenden Code musst du anpassen und
solltest du fragen dazu haben, wie man den Code einfügt und anpasst,
dann gebe einfach bescheid.
Option Explicit
Sub a()
Dim rng As Range
Dim ws As Worksheet
Dim newWS As Worksheet
Dim lRow As Long
Dim c
Set newWS = Nothing 'wo es hin soll
Set ws = ThisWorkbook.Sheets(1)
With ws
'//der benutzte Bereich des Blattes
Set rng = ws.UsedRange
'//Für jede Zelle in diesem Bereich
For Each c In rng
'//Wenn sie numerisch ist dann...
If IsNumeric(c.Value) Then
'//Wenn ihre länge gleich 8 ist dann...
If Len(c.Value) = 8 Then
'//newWS ist das blatt + mappe wo
'//die nummer rein soll
'//lRow die letzte Zelle der angegebenen Spalte
'//Cells(lRow, 1) ist die letzte zelle in spalte A
'//dort kommt der wert rein
With newWS
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(lRow, 1).Value = c
End With
End If
End If
Next c
End With
End Sub

Und Leute, warum einfach wenns auch kompliziert geht oder...
Eine geschachtelte schleife um die Zellen durchzugehen wenn man
sich die Usedrange geholt hat, macht einfach keinen sinn.
Warum eigentlich ein Dictionary?
Ein simples "For Each" reicht doch und verstehen tut es
dann auch jeder Anfänger...
Anzeige
Bzgl. verstehen tut es dann auch jeder Anfänger...
25.07.2017 15:21:59
Michael
Max,
... na offenbar nicht:
Eine geschachtelte schleife um die Zellen durchzugehen macht einfach keinen sinn
Nehme an, das galt meinem Code. Dir ist aufgefallen, dass ich die UsedRange in ein Array einlese? Wie gehst DU denn ein Array anders durch, als mit einer geschachtelten Schleife? Mit For Each?... vermutlich eine Deiner "Excel Advanced"-Expertenkenntnisse. Habe mich deshalb für's Array entschieden, weil der UsedRange ja doch beträchlich groß sein könnte.
Warum eigentlich ein Dictionary?
Nehme an, das galt Rudis Code. Der (wie immer) sehr clever ist, und das Dictionary dazu nutzt, um die ausgelesenen 8-stelligen-Nummern nur einmal zu übernehmen - könnte ja durchaus sein, dass es da Doppelungen gibt. Außerdem ist er noch so clever den UsedRange einzuschränken auf Konstanten-Zellen.
Ein simples "For Each" reicht doch
Möglich, aber das bedeutet nicht, dass andere Varianten keinen Sinn machen - Denk mal drüber nach.
Schönen Nachmittag!
Michael
Anzeige
wozu ein Dictionary?
25.07.2017 15:38:37
Rudi
Hallo,
wenn du auf lahmen Code stehst, kannst du es ja lassen.
Gefundene Werte nach und nach in Zellen zu schreiben, ist das Uneffektivste, was du machen kannst.
Mit schlappen 40000 Zellen läuft dein Code 38,5 Sek., meiner 14,5 Sek. Außerdem werden gleichzeitig Doppler eliminiert.
Ich sehe auch nicht, wo dein Code einfacher sein soll. For each habe ich auch drin. Außerdem berücksichtige ich nur Zellen mit numerischen Konstanten.
Gruß
Rudi
@Rudi und Michael
25.07.2017 18:16:36
Max2
Sollte ich euch durch meine Bemerkung beleidigt haben, tut es mir leid.
Ich hatte nicht die Absicht euch zu vermitteln, dass eure Codes schlecht wären.
Meine Wortwahl war zugegeben daneben...
Ich wollte eigentlich hinterfragen, wie verständlich eure Codes für
absolute Anfänger sind, da der Thread mit VBA Nein eröffnet wurde.
Das ging nicht aus meinem Post hervor!
Ich möchte mich bei euch beiden für meine Wortwahl und art entschuldigen.
Persönlich mache ich nicht viel mit VBA, ich bin eher in C# und C++ unterwegs.
Bei VBA habe ich keinen schimmer von Regex, aber könnte man die benötigten Daten
nicht auch einfach mit folgendem Pattern rausfiltern: \d{8}
Anzeige
VBA-Nein heißt auch nicht mehr und nicht ...
25.07.2017 18:28:48
Luc:-?
…weniger als keine VBA-Kenntnisse, Max,
nicht aber unbedingt auch, dass derjenige nun auch ein Pgm verstehen oder gar VBA erlernen möchte. IdR erwartet er nur eine (ggf sonstwie geartete) Lösung seines Problems. Im Übrigen ist es für einen PgmmierAnfänger beinahe gehupft wie gesprungen wie ein Pgm aussieht; er wird weder die eine noch die andere Variante auf Anhieb verstehen…
🙈 🙉 🙊 🐵 Gruß, Luc :-?
Besser informiert mit …
Ok, alles gut! War ja genug Hickhack hier :-), owT
26.07.2017 16:58:28
Michael
und ganz schnell...
25.07.2017 16:20:05
Rudi
... läufts mit einer Kombi aus Array und Dictionary.
Sub aaa()
Dim objDic As Object, vArr
Dim i As Long, j As Long, vTest
t = Timer
Set objDic = CreateObject("scripting.dictionary")
vArr = Sheets(1).UsedRange.Value
For i = 1 To UBound(vArr)
For j = 1 To UBound(vArr, 2)
vTest = vArr(i, j)
If IsNumeric(vTest) And Len(vTest) = 8 Then objDic(vTest) = 0
Next j
Next i
Worksheets(2).Cells(1, 1).Resize(objDic.Count) = Application.Transpose(objDic.keys)
End Sub
&lt 1 Sek. für 40000 Zellen.
Damit du was lernst, Max.
Gruß
Rudi
Anzeige
Dabei wäre "For Each" sooo simpel gewesen :-) owT
25.07.2017 16:33:21
Michael
geht auch mit ForEach und ohne Dictionary schnell
25.07.2017 17:06:42
Daniel
Hi
natürlich geht's mit For Each.
spart dir auch die Abfrage, ob der Wert numerisch ist, weil du über die SpecialCells gleich schon einschränken kannst.
Ein Dictionary brauchts hier auch nicht.
Da zum Wert selbst keine weiteren Daten gespeichert werden, kann man das gleiche auch mit einem einfachen Textstring erreichen.
Sub test()
Dim c As Range
Dim ArtNr As Long
Dim txt As String
Dim Erg As String
Dim arr
Erg = "Artikelnummern"
For Each c In ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 1)
ArtNr = c.Value
If ArtNr >= 10 ^ 7 Then
If ArtNr 
Gruß Daniel
Anzeige
Sorry, aber...
25.07.2017 17:17:06
Michael
Hallo Daniel,
...keiner hat gesagt, dass es mit "For Each" NICHT geht.
...die Einschränkung über SpecialCells hat Rudi schon aufgezeigt
...ob String oder Dictionary ist Geschmackssache, zumal
...Du bei der String-Variante auch wieder auf ein Array setzt (was nicht grds. verkehrt ist).
Aber gut, für'n Max vielleicht doch eine spannende Info, ansonsten doch eher viel Senf in diesem Faden, findest Du nicht?
LG und schönen Feierabend
Michael
AW: Sorry, aber...
25.07.2017 17:37:20
Daniel
ich setze halt da auf ein Array, wo es sinnvoll ist, nämlich beim Schreiben von Werten ins Exceltabellenblatt.
Lesen aus dem Tabellenblatt geht wesentlich schneller, daher reicht zum Lesen die For-Each-Schleilfe über Excelzellen, weil sie ggf. die Anzahl der Schleifenumläufe schon im Vorfeld reduzieren kann, während bei einem Array wieder jeder Wert geprüft werden muss.
Gruß Daniel
Anzeige
Alles klar, macht Sinn! owT
26.07.2017 16:57:13
Michael
AW: und ganz schnell...
25.07.2017 17:27:09
Max2
Habe ich mehr als ein paar tausend Daten zu überprüfen,
benutze ich kein VBA.
Die Daten gehören dann in eine CSV und anders ausgewertet.
Hier mit Quick and Dirty C# Code (auch nicht gerade das schnellste):
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace ConsoleApplication3
{
class Program
{
const string PATH = @"test.csv";
static void Main(string[] args)
{
using (StreamReader r = new StreamReader(PATH))
{
string line;
List list = new List();
Stopwatch sp = Stopwatch.StartNew();
while ((line = r.ReadLine()) != null)
{
string[] s = line.Split(';');
foreach (string st in s)
{
int i;
if (int.TryParse(st, out i) && st.Length == 2) { list.Add(st); }
}
}
sp.Stop();
System.Console.WriteLine(sp.ElapsedMilliseconds);
}
}
}
}
Das prüfen und hinzufügen in die Liste mit 1Mio Strings,
dauert dann 740ms, trotz verschachtelter Schleife.
Anzumerken ist, dass die CSV nur aus 2-Stelligen Zahlen besteht,
da ich aber auf genau diese Prüfe, werden also auch alle in die List eingefügt.
Dein Code ist schön, aber dennoch, bei vielen Daten hat VBA keine
Daseinsberechtigung mehr.
Anzeige
AW: und wenn man jetzt kein C# kann?
25.07.2017 17:31:34
Daniel
soll ja vorkommen.
Gruß Daniel
AW: und wenn man jetzt kein C# kann?
25.07.2017 18:05:56
Max2
Dann geht auch der große Bruder von VBA, also VB.Net
Da ist die Syntax praktisch gleich, außerdem hat man,
sofern man mit Visual Studio arbeitet, eine
Super Schnittstelle zu den Office Produkten.
Wenn es nur um die Auswertung der Daten geht, und diese auch in
eine Textdatei importiert werden können, sind C und C++ genial (meine eigene Meinung!)
R und Python sind für Daten und deren Auswertung eigentlich am besten.
Dort kann man sie auch richtig hübsch darstellen und die beiden
haben eine Super Schnittstelle zu CSV.
Für kleine Sachen und überschaubare Datenmengen, ist VBA Klasse!
Anzeige
ganz nebenbei ....
25.07.2017 21:00:24
Rudi
Hallo,
handelt es sich hier um ein Excel-/ VBA-Forum
Gruß
Rudi
AW: Zahlenfolge suchen und in neuem Blatt einfügen
25.07.2017 14:57:37
Paul
Hallo zusammen, erstmal vielen Dank für eure Hilfe.
Habe den VBA Code vom Max2 eingefügt und mit der Try and Error Methode angepasst.Scheint geklappt zu haben. Nun durchsucht das Script die komplette Arbeitsmappe nach 8 Stelligen Nummern, wo kann ich dem Script sagen er soll nur in der Tabelle1 suchen. Hintergrund ist dass ich auf einem Sheet in dieser Mappe noch rund 50000 Artikelnummern habe und diese werden nun auch ausgelesen und kopiert (Hierbei handelt es sich um meine Rohdaten für die SVERWEISE)
AW: Zahlenfolge suchen und in neuem Blatt einfügen
25.07.2017 17:18:59
Michael
Hallo!
Code vom Max2 eingefügt und ... durchsucht das Script die komplette Arbeitsmappe
Das ist nicht möglich, Max' Code durchsucht NUR das erste Blatt der Mappe, hier:
Set ws = ThisWorkbook.Sheets(1)
LG
Michael
AW: Zahlenfolge suchen und in neuem Blatt einfügen
27.07.2017 17:39:23
Paul
Ok stimmt, hab die 1 gegen eine 3 ersetzt, dachte das gehört noch zum Teil wo die Daten hin sollen.
Funktioniert nun fast wie gewünscht, doppelte Einträge können im Quellsheet vorkommen und diese müsste ich eigentlich nicht doppelt haben aber an die anderen Codes traue ich mich nicht ran. Bin schon SAU Stolz auf mich dass ich irgendwie die Anpassung vom Max seinem Script geschafft habe ;)
Ich danke euch allen sehr für eure Hilfe und das hierbei so eine hitzige Diskussion entbrannt ist, war natürlich nicht meine Absicht aber schlussendlich ist ein Forum ja auch irgendwie dafür da ;)
Mach mich jetzt mal an meine SVERWEISE!

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige