So funktioniert JustAnswer:

  • Fragen Sie einen Experten
    Tausende Experten in über 200 Kategorien.
  • Erhalten Sie eine professionelle Antwort
    Per E-Mail oder sofortiger Benachrichtigung, während Sie auf unserer Website warten.
    Stellen Sie ggf. weitere Anschlussfragen.
  • 100%ige Zufriedenheit garantiert
    Bewerten Sie die erhaltene Antwort.

Stellen Sie Ihre Frage an MKruse.

MKruse
MKruse, Dipl.-Inform.
Kategorie: Computer
Zufriedene Kunden: 25
Erfahrung:  9 Jahre Erfahrung mit Java, VBA, Perl, C# und C++.
39215291
Geben Sie Ihre Frage in der Kategorie Computer hier ein
MKruse ist jetzt online.

Hallo, ich habe mir txt.Daten nach Excel eingelesen. Das

Kundenfrage

Hallo,

ich habe mir txt.Daten nach Excel eingelesen. Das sind mehrere tausend Zeilen.
Hier bei habe ich festgestellt, dass ich in vielen Zeilen in den SpaltenA und B die gleichen Daten drinnstehen habe.
- in SpalteA eine vierstellige Zahl
- in SpalteB ein Datum

in der dazugehörigen SpalteF jedoch immer unterschiedliche Zahlen.

Ich möchte nun das Excel die Spalten durch geht. Doppelte Daten in den SpaltenA und B ausfindig macht, alle bis auf eine Zeilel löscht, jedoch vorher alle Werte aus SpalteF zusammenaddiert und diesen Wert in der einzig übrig gebliebenen Zeile in SpalteF anzeigt.

Danke XXXXX XXXXX Paul S.
Gepostet: vor 6 Jahren.
Kategorie: Computer
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, wenn Sie Excel 2007 nutzen dann gibt es im Ribbon Daten die Möglichkeit Duplikate zu löschen gemäß Ihren Wünschen. Unter Excel 2003/2000/XP ist dies nicht möglich, denn dort müssten Sie es programmieren. Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

ich dachte ich hätte mich deutlich ausgedrückt. Ich suche nach einer VBA -Lösung sprich einem Code dafür. Das mit der Ribbon-Lösung weis ich selbst.

Zur Verdeutlichung ich nutze 2003. Davon abgesehen, das ich selbst unter 2007 eine VBA Lösung anstreben würde.

Und ich dachte hier sitzen Experten!?

MfG

Paul S.

Kunde: hat geantwortet vor 6 Jahren.
Erneut posten: Qualität der Antwort:.
Ich hatte eine klare Frage formuliert. Diese geht eindeutig in Richtung Makro (Visual Basic).
Ich nutze 2003.
Danke XXXXX XXXXX
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
So, da Sie es per VBA lösen wollen habe ich für Sie auch was gefunden:

Sub Gleiche_Loeschen_SpalteF()
Dim i As Long
Dim lngLastR As Long

lngLastR = Cells(Rows.Count, "F").End(xlUp).Row + 1

'Zellinhalte in Spalte F durch "" = Leerzelle ersetzen
Do
i = i + 1
Range(Cells(i + 1, "F"), Cells(lngLastR, "F")).Replace _
what:=Cells(i, "F").Value, replacement:="", lookat:=xlWhole
Loop While WorksheetFunction.CountIf(Range(Cells(i + 1, "F"), Cells(lngLastR, "F")), "") < (lngLastR - i)

'Zeilen löschen, die Leerezellen in Spalte F haben:
Columns("F").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Wie Sie erkennen können bezieht sich dieses VBA-Beispiel auf exakt 1 Spalte d.h. Sie könnten es entsprechend Ihren Suchwerten und Spalten anpassen und dann wäre Ihr Problem gelöst. Sie müssen das Makro einfach hinter einem Button oder so setzen so das es bei OnClick() ausgelöst wird. Damit es schnell genug läuft wird auch nur eine Spalte (hier F) mit einem Wert vergliechen (Leerzeile). Ein bischen anpassen müssen Sie es natürlich.

Hier wäre noch eine Variante, die einfach nur doppelte Werte entfernt:

Sub Loesche_DZeilen()
Dim temp
Dim i%, n%, ZSpalte%
Dim Zeilenzahl As Long
ZSpalte = 6 'F wird gezählt
Zeilenzahl = Sheets(1).Cells(Rows.Count, ZSpalte).End(xlUp).Row
For n = 2 To Zeilenzahl
temp = Sheets(1).Cells(n, ZSpalte).Value
For i = n To Zeilenzahl
m = Sheets(1).Cells(i + 1, ZSpalte).Value
Do While Sheets(1).Cells(i + 1, ZSpalte).Value = temp
Sheets(1).Cells(i + 1, ZSpalte).EntireRow.Delete
Zeilenzahl = Zeilenzahl - 1
Loop
Next i
Next n
End Sub

Ich denke, damit sollten Sie zurecht kommen.

Gruss Günter

Verändert von IT-Fachinformatiker am 14.08.2010 um 21:04 Uhr EST
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo noch mal, hier sind noch weitere VBA-Beispiele mit denen Sie Ihr Problem lösen können:



Public Sub DeleteDuplicatesFilter()
Dim wksData As Worksheet
Dim rngData As Range

Dim nColsCnt As Integer
Dim nRowsCnt As Long

Dim nRow As Long
Dim nRowsDel As Long

Application.ScreenUpdating = False

Set wksData = ActiveSheet
With wksData
nColsCnt = .UsedRange.Columns.Count
nRowsCnt = .UsedRange.Rows.Count

Set rngData = _
.Range(.Cells(1, 1), .Cells(nRowsCnt, nColsCnt))
End With

rngData.AdvancedFilter Action:=xlFilterInPlace, Unique:=True

nRowsDel = 0
For nRow = nRowsCnt To 2 Step -1
With wksData
If .Rows(nRow).Hidden = True Then
.Rows(nRow).EntireRow.Delete
nRowsDel = nRowsDel + 1
End If
End With
Next nRow

If wksData.FilterMode = True Then
wksData.ShowAllData
End If

Application.ScreenUpdating = True

MsgBox "Es wurden " & nRowsDel & " doppelte " & _
"Datensätze gelöscht!", vbOKOnly + vbInformation, _
Title:="Doppelte Datensätze löschen"

Set rngData = Nothing
Set wksData = Nothing
End Sub

Und dann ein weiteres:



Public Sub FilterDuplicates()
Dim wkbData As Workbook
Dim wksData As Worksheet
Dim wksDataNew As Worksheet
Dim rngData As Range

Dim nColsCnt As Integer
Dim nRowsCnt As Long

Application.ScreenUpdating = False

Set wkbData = ActiveWorkbook

Set wksData = wkbData.ActiveSheet
Set wksDataNew = wkbData.Worksheets.Add

With wksData
nColsCnt = .UsedRange.Columns.Count
nRowsCnt = .UsedRange.Rows.Count

Set rngData = _
.Range(.Cells(1, 1), .Cells(nRowsCnt, nColsCnt))
End With


rngData.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=wksDataNew.Range("A1"), Unique:=True

Application.ScreenUpdating = True

MsgBox "Die gefilterten Datensätze wurden auf das " & _
"Tabellenblatt '" & wksDataNew.Name & "' kopiert!", _
vbOKOnly + vbInformation, Title:="Datensätze filtern"

Set rngData = Nothing
Set wksDataNew = Nothing
Set wksData = Nothing
End Sub

und ein letztes noch für heute:

Public Sub DeleteDuplicatesSort()
Dim wksData As Worksheet
Dim rngData As Range

Dim nColsCnt As Integer
Dim nRowsCnt As Long

Dim nRow As Long
Dim nCol As Integer
Dim nRowsDel As Long

Dim blnDuplicate As Boolean

Application.ScreenUpdating = False

Set wksData = ActiveSheet

With wksData
nColsCnt = .UsedRange.Columns.Count
nRowsCnt = .UsedRange.Rows.Count

Set rngData = _
.Range(.Cells(1, 1), .Cells(nRowsCnt, nColsCnt))

rngData.Sort Key1:=.Range("A1"), Order1:=xlAscending, _
Key2:=.Range("B1"), Order2:=xlAscending, _
Key3:=.Range("C1"), Order3:=xlAscending, _
Header:=xlYes, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
End With

wksData.Range("A1").Select

nRowsDel = 0
For nRow = nRowsCnt To 2 Step -1
blnDuplicate = True

With wksData
For nCol = 1 To nColsCnt
If .Cells(nRow, nCol).Value <> _
.Cells(nRow - 1, nCol).Value Then
blnDuplicate = False
Exit For
End If
Next nCol

If blnDuplicate Then
.Rows(nRow).EntireRow.Delete
nRowsDel = nRowsDel + 1
End If
End With
Next nRow

Application.ScreenUpdating = True

MsgBox "Es wurden " & nRowsDel & " doppelte " & _
"Datensätze gelöscht!", vbOKOnly + vbInformation, _
Title:="Doppelte Datensätze löschen"

Set rngData = Nothing
Set wksData = Nothing
End Sub

Damit sollten Sie auf jeden Falls ans Ziel kommen.

Gruss Günter




Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

alles wunderschöne Codes. Doch keiner trifft das gewünschte Ergebnis. Es ging nicht bei den doppelten Werten aus SpalteF, sondern um doppelte Werte aus SpalteA und B. In SpalteF stehen entweder gleiche oder andere Werte, die, wenn in Spalte A und B doppelte Werte enthalten, vor dem löschen der doppelten Werte (Zeilen) zusammenaddiert werden sollen, und in der übrig verbliebenen Zeile in SpalteF ausgegeben werden sollen.

 

Ich versuche es noch einmal konkreter.

 

In SpalteA und B befinden sich immer doppelte oder mehr gleiche Angaben.

In SpalteF köönen gleich oder auch unterschiedliche stehen. Das Kriterium ist aber immer SpalteA und B. Niemals F!!!

Beispiel:

SpalteA1 = 1111

SpalteB1= 14.08.2010

SpalteF1= 7

 

SpalteA2 = 1111

SpalteB2= 14.08.2010

SpalteF2 = 1

 

SpalteA3 = 1111

Spalte B3 = 14.08.2010

Spalte F3 = 4

 

usw., usw.

 

Ergebnis soll sein:

 

Eine Zeile bleibt übrig. Mir ist es dabei egal ob Zeile A1 oder A2 oder A3

Hauptsache ist es kommt heraus, sagen wir z.B:

SpalteA1 = 1111

SpalteB1 = 14.08.2010

SpalteF1 = 12 (Addierung aus F1 + F2 + F3)

 

Die enstandenen Leerzeilen danach alle löschen.

 

Vielen Dank

Paul S.

 

 

 

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, achso *ggg* nun, dafür gibt es keinen Beispielcode ich denke das müssen Sie leider programmieren ich müsste es auch erst selbst programmieren da ich nicht einfach ein Beispiel im Kopf hab bzw. ein solches würden Sie auch nirgens finden das ist viel zu speziell. Aber, was ich jetzt da sehe ist doch nix weiter als eine Summenbildung:

SpalteA1 = 1111

SpalteB1 = 14.08.2010

SpalteF1 = 12 (Addierung aus F1 + F2 + F3)

 

denn das hier ist ja fast egal:

 

SpalteA1 = 1111

SpalteB1= 14.08.2010

SpalteF1= 7

 

SpalteA2 = 1111

SpalteB2= 14.08.2010

SpalteF2 = 1

 

SpalteA3 = 1111

Spalte B3 = 14.08.2010

Spalte F3 = 4

 

Sie wollen also vor dem löschen doppelte Werte addieren, dann müssen Sie doch nur den obigen Code anpassen indem Sie die Summenfunktion einfügen und zwar entsprechend an der Stelle, an dem der Code doppelte Werte findet das mit Spalte F ist ja auch nur ein Beispiel Sie müssen den Code schon entsprechend anpassen das ist logisch. Ich denke, das sollten Sie hin bekommen ein Beispiel dafür wäre:

 

Dim Summe123

With wksData
If .Rows(nRow).Hidden = True Then

Summe123 = Summe123 + .Rows(nRow)
.Rows(nRow).EntireRow.Delete '** hier wird ja geöscht
nRowsDel = nRowsDel + 1
End If
End With

 

Sie können mit dem Objekt Cols(n) auch direkt auf die Spalten zu greifen. Wie gesagt ein direktes Bespiel gibt es nicht man muss es selbst entwickeln d.h. ich müsste es auch erst programmieren was eine Weile dauern würde. Jedoch sollten Sie mit diesen Ansätzen und VBA Kenntnissen zurecht kommen. Mein Tipp: Schauen Sie sich ggf. auch das Range-Objekt an, damit können Sie Zeilen und Spalten direkt ansprechen.

 

Gruss Günter

 



Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, so hier mal ein paar grundsätzliche Beispiele zur Verdeutlichung:

Löschen der Zeile, wenn Zelle in Spalte A leer ist

Sub DeleteRowIfEmptyCell()
Dim intRow As Integer, intLastRow As Integer
intLastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For intRow = intLastRow To 1 Step -1
If Application.CountA(Rows(intRow)) = 0 Then
intLastRow = intLastRow - 1
Else
Exit For
End If
Next intRow
For intRow = intLastRow To 1 Step -1
If IsEmpty(Cells(intRow, 1)) Then
Rows(intRow).Delete
End If
Next intRow
End Sub


Löschen aller leeren Zellen einer Spalte

Sub DeleteEmptyCells()
Dim intLastRow As Integer
Dim intRow As Integer
intLastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For intRow = intLastRow To 1 Step -1
If Application.CountA(Rows(intRow)) = 0 Then
intLastRow = intLastRow - 1
Else
Exit For
End If
Next intRow
For intRow = intLastRow To 1 Step -1
If IsEmpty(Cells(intRow, 1)) Then
Cells(intRow, 1).Delete xlShiftUp
End If
Next intRow
End Sub



Löschen aller Zellen in Spalte A mit "hallo" im Text

Sub DeleteQueryCells()
Dim var As Variant
Do While Not IsError(var)
var = Application.Match("hallo", Columns(1), 0)
If Not IsError(var) Then Cells(var, 1).Delete xlShiftUp
Loop
End Sub



Alle leeren Zellen löschen

Sub DeleteEmptys()
Dim rng As Range
Application.ScreenUpdating = False
For Each rng In ActiveSheet.UsedRange
If IsEmpty(rng) Then rng.Delete xlShiftUp
Next rng
Application.ScreenUpdating = True
End Sub


Leeren aller Zellen mit gelbem Hintergrund

Sub ClearYellowCells()
Dim rng As Range
For Each rng In ActiveSheet.UsedRange
If rng.Interior.ColorIndex = 6 Then
rng.ClearContents
End If
Next rng
End Sub


FehlerZellen leeren

SubClearContentsErrorCells()
On Error GoTo ERRORHANDLER
Cells.SpecialCells(xlCellTypeFormulas, 16).ClearContents
ERRORHANDLER:
End Sub

Diese Beispiele betreffen nicht direkt Ihr Problem, zeigen jedoch die Anwendung daraus können Sie jedoch einiges herleiten.

Gruss Günter



Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

Danke für ihre Beispiele. Diese kanne ich bereits.

 

Sorry! Das kann ich leider nicht akzeptieren.

In der Werbung auf dieser Hompage, wir von 100%-iger Zufriedenheitsgarantie gesprochen.

Ich denke mein Beispiel ist deutlich klar dargestellt.

 

Wenn, ich es hätte selber hinbekommen, dann hätte ich mich nicht an die Experten gewendet.

 

Nochmal also.

 

Das Filterkriterium ist SpalteA:A und B:B

 

in igendeiner dieser Spalten in den unteschiedlichsten Zeilen stehen nebeneinander die gleichen Zahelen und ein geliches Datum z.B:

 

A3 = 1111, A10=1111, A1340 = 1111, usw. usw.

B3 = 14.08.2010, B10 = 14.08.2010, B1340 = 1111, usw. usw.

 

nur in Spalte F stehen entweder gleiche oder andere Zahlen z.B

 

F3 = 1, F10 = 4, F1340 =1, usw. usw.

 

Alle Zeilen in SpalteA:A und B.B werden durchlaufen um zu prüfen wo in welcher Zeile

in A:A sich 1111 und B:B = 14.08.2010 befinden.

 

Wenn diese gefunden, dann alle zeilen löschen, vorher aber alle Werte aus den dazugehörigen Zeilen der SpalteF zusammen addieren.

 

Ergebnis muß dann lauten:

 

Beispielsweise

 

A3 = 1111

B3 = 14.08.2010

F3 = 6

 

Ist das für einen Experten so schwierig? Oder greift ihr nur auf Datenbanken zurück und greift auf Beispielcodes zurück?

 

Danke XXXXX XXXXXß

Paul S.

 

 

 

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, auch wir haben nur einen reinen Internet-Zugang! Ich kXXXXX XXXXXm einfach innerhalb von 5 Minuten einen Code für Sie bauen, der sofort lauffähig ist! Das ist schlicht weg unmöglich in dieser kurzen Zeit!

Wenn Sie:

A:A 1111 und B:B = 14.08.2010

suchen wollen und diese Zeilen löschen wollen ist das doch sehr einfach Sie müssen eben o.a. Codes anpassen das kann ich Ihnen nicht abnehmen aber das dürfte auch nicht das Problem sein, viel mehr scheint ja das Problem darin zu bestehen, das Sie vorher alle Werte derSpalte F addieren wollen auf die Ihre Anfrage passt.

also würde ich es plastisch mit einer WENN Formel versuchen:

WENN (A=1111 UND B="14.08.2010" DANN SUMME Spalte F)

Sie müssen also:

If Range ( A1:A2 ) And ( B1:B2 ) = IhrWert Then
'** Ihre aktion
IhreSummeF = Range ( F1:F2)
Else
'** eine andere Aktion
End If

Wobei natürlich dieser Code an Ihre Zellen angepasst werden muss. Beachten Sie die Datentypen String/Intger usw. die Zellen sollten als Text formatiert sein, dann sollte es keine Probleme geben. Anhand dieser Bedienung können Sie auch die doppelten Werte löschen dazu ja der obige Code den ich zuvor gepostet habe.

Mit diesem Schnippsel können Sie also einen Zellenbereich selektieren und auswerten und entsprechend dort die Summe bilden. Beachten Sie: Sie können nicht einfach mit einer For Schleife problemlos durchlaufen das geht bei Range Objekten nicht!

Falls Sie mit der Antwort nicht zufrieden sind, gebe ich die Frage gern wieder frei ich möchte jedoch betonen, das Sie ohne intensive VBA Kenntnisse nicht das Problem lösen können d.h. Sie müssen sich mit VBA intensiv auseinander setzen da kann man nicht einfach was fertiges nehmen das dient nur als Beispiel zum Verständnis. Ich denke ich habe Ihnen jetzt die richtige Richtung gezeigt.

Gruss Günter


Verändert von IT-Fachinformatiker am 14.08.2010 um 23:21 Uhr EST
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Wenn ich die Datei hätte, könnte ich die Lösung direkt programmieren das wäre ehrlich gesagt ein wenig einfacher. Bei Interesse einfach unter:

rufus4edv-mail AT yahoo PUNKT de

mailen.

Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

ich möchte nicht ihre oder meine Geduld unnötig strapazieren. Ihren Vorschlag nehme ich gerne an. Mail geht gleich raus.

 

 

Danke XXXXX XXXXXß

Paul S.

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, ok dann machen wir das so! Ich programmiere es in Excel 2003 unter Windows 7 wobei das OS hier keine Rolle spielt. Beim mailen noch mal jkurz die Bediengungen mit mailen ;-) bin um diese Zeit ein wenig vergesslich ich werde es dann am Sonntag im Verlauf des Tages programmieren bitte bedenken Sie, das ich nicht hexen kann aber Ihr Problem ist nicht unlösbar muss es aber wie gesagt programmieren. Ich denke, damit solten wir für heute auch Schluss machen es ist schon spät und wir haben beide nicht mehr Genug "grips" im Kopf *ggg* Sie wissen schon wie ich es meine Paul :-) Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

Siehe Mail-Eingang. Ich habe es versucht halbwegs verständlich darzustellen.

Und danke für ihre Hilfe. Ich denke auch das es für heute reichen sollte.

Ich freue mich auf ihre Antwort.

 

Danke XXXXX XXXXXß

Paul S.

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, ich habe zu danken für Ihre Geduld. Sie können ruhig Du sagen, wenn dies ok für Sie ist! Ich bin der Günter ohne H :-) in diesem Sinne werde ich mich darum kümmern. Ihnen eine gute Nacht. Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

und ich bin der Paul.

 

Gute Nacht.

 

Mfg
Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo Paul,

habe die Datei erhalten und mir auch angeschaut soweit so gut es ist allerdings so, das ich dafür einige Zeit bräuchte da es nicht ganz einfach ist. Allerdings möchte ich auch gern, das Du schnell ans Ziel kommst daher würde ich gern einen weiteren Experten hinzu ziehen der Dir ggf. dann auch antwortet wäre das in Ordnung?

Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

das ist kein Problem. Freue mich über deine Geduld und Mühe.

 

MfG

Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, ok also hab das mal programmiert mit den Nullen das sieht im 1. Entwurf so aus:

Dim i As Long
Dim n As Integer
Dim m As Integer

For i = 2 To 40

n = Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 6)
If n = "0000" Or n = "0" Then
Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 6) = "XXX"
End If

m = Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 7)
If m = "0000" Or m = "0" Then
m = Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 7) = "YYY"
End If

Next i

Wobei Cells (Zeile, Spalte) ist das ist nur ein erster Versuch aber im Prinzip kannste auch her gehen Bearbeiten > Suchen und ersetzen > fertig das mit den 0 ist daher kein Thema.

Die Aufsummierung erfolgt ja unter bestimmten Bediengungen wenn Rufnummern gleich sind. Hier könnte man eine Sortierung machen und dann die Summen darüber bilden lassen da hab ich aber noch voll die Probleme mit. Einfacher wäre eine SQL-Datenbank zick zack und fertg wer der Lack per SQL kann man Gruppen bilden und über Gruppen wieder Summen.

Evtl. kann man das Problem auch schon direkt beim imporieren lösen denn da folgenden die gleichen Nummern direkt hintereinander das könnte man dann summieren und die Nullen sofort raus werfen.

Habe auch so eben einen weiteren Experten kontaktiert muss mich aber auch da in Geduld üben. Es gibt für Excel aber auch diverse Tools die genau solche Dinge erledigen hast Du da schon mal geschaut?

Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

du kannst mir glaubn, dass ich schon eingiges über Excel weis, und auch über die Programmierung.

 

Das Problem für mich ist, das ich mir zu Anfang via Code aus zwei txt.Dateien weit über 90.000 txt.Zeilen nach Excel einlese. Wenngleich Excel 2003 noch bei 65536 Zeilen beim Einlesen abschenidet, ist das kein problem die Daten zunächst auf zwei Tabellenreiter zu verteilen. Die txt.Daten sowie du diese gesehen hast, werden gleich beim einlesen über den Code auf die Spalten verteilt. Das passiert als ob du Text in Spalten nutzen würdest. Das läuft alles ohne Problem. was halt nicht läuft, ist das rauslöschen der Zellen die leer sind und oder eine 0 oder 0000 haben. Um eben die Zeilenmenge zu begrenzen und sofort auf unter 30.000 Zeilen zu kommen benötige ich halt VBA.

Ich habe hiezu auch andere befragt die sich mit dem Problem beschäftigen. Unter office-loesung.de gibt es auch bereits jemanden der sich damit beschäftigt. Wie du siehst ist es nicht nur für euch schwierig.

Natürlich gibt es andere Möglichkeiten. Frag doch mal deinen Kollegen ob er nicht eine Formelvariante kennt, die dieses Problem erledigt. Bekanntlich ist es so, dass Formellösungen auch in einen Code eingebaut schnellere Laufzeiten bei einem Code erreichen als die reine VBA-Lösung.

 

Hilft euch der Ansatz weiter?

 

Danke

Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo, gut das auch andere dran arbeiten :-) also ich denke Du wrist auch VBA können dann sollte Dir die von mri gezeigte Schleife:

Dim i As Long
Dim n As Integer
Dim m As Integer

For i = 2 To 40

n = Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 6)
If n = "0000" Or n = "0" Then
Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 6) = "XXX"
End If

m = Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 7)
If m = "0000" Or m = "0" Then
m = Worksheets("eingelesen n. Excel unbereinigt").Cells(i, 7) = "YYY"
End If

Next i

auch helfen. Hier wird per Cells Objekt einfach von Zeile 2 (1. ist ja Titel) bis zur Zeile 40 (als Beispiel) gewandert dabei wird geprüft, ob eine 0 oder 0000 enthalten ist das ganzue wird durch XXX bzw. YYY ersetzt das klappt auch nur bringt Excel mir den Lauifzeit Fehler 13 "Typen unverträglich" obwohl diese als Text formatiert sind.

Mir ist aber eben aufgefallen, das nicht 0000 in den Zellen steht sondern einfach nur 0 daher würde ich evtl. sogar einen total anderen Weg gehen: Ein externes Programm welches folgendes tut:

1. Alles löschen was 0000 hat
2. Alle Rufnummern zusammenfassen und darüber eine Summe bildet
3. Als Ergebnis eine lineare Liste ausgeben die sauber importiert wird

Ok, das mit der Summe ist natürlich ein gewisser Aufwand aber das raus werfen der 0000 ist kein Problem Zeilen die gänzlich leer sind lassen sich überspringen Zeilen wo nur bestimmte Dinge leer sind da müsste man schauen. Evtl. würde es mir helfen wenn Du mir mal eine Besipiel TXT-Datei mailst ich denke wir sollten den Ansatz ändern und Excel später arbeiten lassen d.h. wir bauen uns erst mal einen import Filter.

Mit UNIX wäre das Problem sehr schnell gelöst da man dort mit Befehlen wie uniq, grep, awk, sed usw. arbeiten kann d.h. es wäre ein langer Befehl der aber das gewünschte Resultat ergeben würde. Nun gut ich denke aber ein externes kleines Programm wäre hier als erstes hllfreich.

Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

ich sende Dir gleich die zwei kompletten txt.Daten und das dazugehörige Excel-Sheet.

 

Mit den Nullen und den Leerzeilen habe ich über ein Sub gerade eben bereinigen können. Schaut euch eindach mal die Codes an.

In beiden tabellen nach einlesen sind zusammen ca. 30.000 Zeilen übrig geblieben.

 

 

Was jetzt noch übrig bleibt wäre wie gesagt das zusammendassen der Zeilen, sodass eine Zeile bei doppelten und mehr Werten übrig bleibt, und die Aussummierung in SpalteF zu der zuletzt verbliebenen Zeile zustande kommt.

Zum Schluß sollen dann beide Tabellen zusammengeführt werden.

 

Ich freue mich jetzt schon auf eure Antwort.

 

Gruß

Paul

 

 

Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

Dateien gehen jetzt gleich raus.

 

Gruß

Paul

Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

Daten sind raus. Es ist nur eine Mail.

 

Danke

Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hi, da hoffe ich doch, das meine Beispiele geholfen haben. Ich schaue mir die Textfiles heute noch an, kann aber etwas dauern da ich hier grad noch ein defekten Lappi hab. Ich hätte für die Summen aber eine Idee: Es muss doch mit Excel auch so klappen, ohne aufwendig was zu coden. Es gibt ja unter dem Menü Daten u.a auch Teilergebnisse und es gibt Pivottabellen. Du kannst es sehr einfach mit Teilergebnissen lösen damit erhälst Du wunderbar die Zwischensummen der einzelnen Rufnummern wenn Du so vorgehest:

1. Sortiere die Daten nach den Rufnummern
2. Gehe ins Menü Daten > Teilergebnisse
3. Summen bilden über Taktung / auch gruppieren

Resultat: Excel bildet Dir zu den sortierten Rufnummern die Summen der einzelnen Taktungen, das geht auch ganz ohne VBA wie wäre das denn als Lösung?

Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

Danke für deinen Vorschlag. Wenn das ganze icht noch weiterführender wäre, dann würde ich sagen das wäre so in Ordnung. Da das ganze aber noch weiterführt (hast du aber nichts mit zu tun) ist für mich die VBA-Lösung halt wichtig.

 

Leider geht es nicht anders. Kannst aber versichert sein, dass nicht bur du und ich, sondern mittlerweile noch zwei Lete daran arbeiten.

 

Lass dir die zeit die Du brauchst. Habe ich die Lösung früher, sende ich einen Mail.

 

Danke XXXXX XXXXXß

Paul

 

Danke

Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hi, ok ich denke ich werde einen Ansatz an Hand der Dateien programmieren d.h. ein Tools vorschalten ohne das ganze unter VBA zu machen geht viel schneller und man ist unabhängiger melde mich per Email dann noch mal. Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

Tool? Kein Excel. Na da bin ich jetzt aber gespannt.

 

Gruß

Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo Paul.

ja ein externes Tool welches einfach die Datei zeilenweise einliest und schon mal was vorbereitet muss ich aber eben auch programmieren zur Zeit ist ne Menge los sehr viel zutun daher ist es gut, das auch weitere an der Front sind.

Gruss Günter
Kunde: hat geantwortet vor 6 Jahren.

Hallo Günter,

 

verstehe ich, und übe mich weiterhin in Geduld.

 

Gruß

Paul

Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo Paul,

so ich habe nun einen weiteren Experten zu rate gezogen er wird sich noch heute kurzfristig mit Dir in Verbindung setzen einiges konnten wir ja schon gemeinsam lösen nur eben diese Summensache da hab auch ich meine Probleme mit. Ich denke aber, das wir das jetzt schaffen mit vereinten Kräften!

Gruss Günter
Experte:  MKruse hat geantwortet vor 6 Jahren.
Hallo zusammen,

leider war ich in einem Kurzurlaub, sonst hätte ich mich schon früher gemeldet.
Ich bin sicher wir finden schon eine Lösung. Die Verwendung eines externen Tools finde ich persönlich auch nicht schlecht, da ich dann schneller und besser in meiner bevorzugten Programmiersprache schreiben kann. Dieses Tool kann auch von Excel aus aufgerufen werden, so dass es schlichtweg immer nur der aufrufenden Exceldatei beiliegen muss.
Aber vielleicht finden wir auch eine reine VBA-Lösung. Kann mir bitte jemand die bestehenden Daten hier hochladen?

MfG
M Kruse
Experte:  IT-Fachinformatiker hat geantwortet vor 6 Jahren.
Hallo Paul, wie Du siehst ist der gute Herr Kruse auch an dem Problem könntest Du ihm einmal die Textdateien und die XLS Datei per Email zu kommen lassen? Dann arbeiten wir schon zu dritt oder viert an dem Problem :-) Danke XXXXX XXXXX Günter
Experte:  MKruse hat geantwortet vor 6 Jahren.
Achja... dann sollte ich wohl meine Emailaddresse schreiben. Die wäre

kruse<at>uni-bonn.de

Vorzugsweise werden die Dateien irgendwo auf eine Webseite als verschlüsselte ZIP-Datei online gestellt. So haben dann alle direkt Zugriff darauf.

Gruß
M Kruse
Kunde: hat geantwortet vor 6 Jahren.

Hallo günter,

hallo Herr Kruse,

 

Dateien geht gleich an H.Kruse raus. Eine VBA-Lösung wäre mir ehrlich gesagt denoch sympatischer.

 

Vielen Dank

Gruß

Paul

Experte:  MKruse hat geantwortet vor 6 Jahren.
Hallo,

ich wollte nur kurz Bescheid geben, dass ich an der Lösung arbeite.
Leider ist es so, dass das Problem doch schwerer zu lösen ist, als angenommen. Ich hatte grade einen (wahrscheinlich) funktionierenden naiven Ansatz. Sprich: Alle Tabellen durchgehen und in der Ergebnistabelle nach einem bestehenden Eintrag suchen und entsprechend verfahren. Leider hat dieses Vorgehen eine extrem schlechte Laufzeit und Excel ist eher nicht dafür geeignet.
Darf ich erfahren, warum eine VBA-Lösung bevorzugt wäre? Evtl. ist der Ansatz für diese Verwendung schon nicht gut. Eine weitere Möglichkeit wäre vielleicht der Einsatz von Microsoft Access.

MfG
M Kruse
Kunde: hat geantwortet vor 6 Jahren.

Hallo Herr Kruse,

 

vorweg danke für ihre Zeit. Die ganze Datei baut auf Excel auf. Das was Sie zur Zeit vor sich haben ist nur ein Bruchstück davon. Alles andere läuft bei mir mit einer sehr guten Performence.

Access nutze ich selber privat nicht und habe auch keine Ahnung davon. Leider! Ich gebe ihnen recht, dass Access mit Sicherheit die bessere Alternative wäre.

 

Also muß es bei einer VBA-Lösung bleiben. Sorry, dass ich ihnen so wie ich gedacht habe, für einfache Frage an die Profis soviel Arbeit bereite.

 

Gruß

Paul

Experte:  MKruse hat geantwortet vor 6 Jahren.
Hallo nochmal,

ich habs anscheinend. Mir ist ziemlich spät eingefallen, dass ich mal anschauen könnte, ob man unter VBA Hashes benutzen kann und hatte versucht selber etwas ähnliches zu schreiben. Damit kam ich aber nicht weit, weil ich nun auch nicht sooo viel mit VBA mache.
Aber dank Google bin ich fündig geworden und mit Hashes ist die Laufzeit dann doch akzeptabel. Auf meinem Laptop (2x2Ghz, 4GB Ram) dauert die Berechnung der Datentabelle jetzt ca 17 Sekunden. Bei meinen ersteren Versuchen mit lineare Suche und ähnlichem dauerte es eher 20 Minuten ;)
Die Exceldatei mit der Funktion befindet sich im folgenden LINK. Ich hoffe, diese Funktion macht genau das, was Sie brauchen und ist verständlich. Ansonsten stehe ich für Rückfragen gerne bereit.

MfG
M Kruse
Kunde: hat geantwortet vor 6 Jahren.

Hallo Herr Kruse,

 

ihre Version test ich gleich mal. Zwischenzeitlich bin ich auch weiter gekommen.

Ich senden ihnen meine Version. Ein paar Kleinigkeiten noch und dann macht sie das was sie soll. Denoch meinen Respekt für ihre schnelle Arbeit.

Wenn Sie txt.Dateien noch haben wie folgt vorgehen.

 

Auf den Button im Excel-Sheet klicken.

beide txt.Dateien markieren und öffnen.

Bei mir dauert es etwas über 8 Sec.

 

Würde mich über ihr Feedack freuen.

 

Gruß

Paul

Experte:  MKruse hat geantwortet vor 6 Jahren.
Hallo,

also ihre Arbeit sieht sehr gut aus. Ich muss sogar zugeben, dass sie vom Stil her besser als meine ist. Ich nehme an, dass Sie schon länger mit VBA zu tun haben? ;)
Mit dem folgenden Code können Sie in der Prozedur "Ausgabe" die privaten Telefonnummern löschen:

'Formel fuer Nummern-Spalte setzen
.UsedRange.Columns(4).Copy .Columns(10)
.UsedRange.Columns(11).FormulaR1C1 = "=IF(RC[-6]=""P"","""",RC[-1])"
.Columns(11).Copy
.Columns(4).PasteSpecial Paste:=xlPasteValues
.Columns(11).Delete
.Columns(10).Delete

Ich habe die Spaltennummern darauf angepasst, dass dieser Code nach dem Einfügen der Daten ausgeführt wird. Eine Anpassung auf eine andere Stelle gelingt ihnen sicher. Das erste Copy ist wahrscheinlich sogar gar nicht notwendig, aber ich hatte es aus Sicherheitsgründen drin. Zur Erläuterung ist glaube ich nur etwas zu "FormulaR1C1" zu sagen. Dies entspricht der relativen Formel, die zum "Ziehen" der Formel benutzt wird. -6 entspricht dadurch der 6. Spalte der nach links. Bei PasteSpecial spezifiziere ich, dass bei diesem Paste nur die Werte und nicht die Formel eingefügt werden soll.

Ich hoffe das hilft weiter.

MfG
M Kruse
MKruse, Dipl.-Inform.
Kategorie: Computer
Zufriedene Kunden: 25
Erfahrung: 9 Jahre Erfahrung mit Java, VBA, Perl, C# und C++.
MKruse und weitere Experten für Computer sind bereit, Ihnen zu helfen.

Bekannt aus:

 
 
 
„[...]mehr als Zehntausend Experten weltweit; 1500 davon in Deutschland. Acht Jahre nach dem Start ist das [...] Online-Unternehmen mit seinen 90 Mitarbeitern die größte Web-Seite für das Vermitteln von Experten von Anwälten über Ärzte bis hin zu Universitätsprofessoren.“
„Wer eine fachmänische Lösung für ein medizinisches, rechtliches oder technisches Problem sucht, kann das jetzt auch im Internet tun. Lebenshilfe auf die schnelle, unkomplizierte und vor allem erschwingliche Art bietet die Seite www.justanswer.de. Etwa 1500 Experten stehen per Mail für Fragen zu ca. 200 Fachgebieten rund um die Uhr zur Verfügung."
„Rat gewünscht? Rechtliche, medizinische oder allgemeine Fragen beantworten Experten unter www.justanswer.de."
„JustAnswer, die weltweit führende Online-Plattform für Expertenfragen und -antworten, bietet ab sofort noch mehr Sicherheit und Qualität für Verbraucher."
„Ob Vorbereitung, Notfall oder Reklamation nach dem Urlaub - JustAnswer bietet jederzeit schnelle, kompetente Antworten"
„Die Online-Plattform JustAnswer bringt Ratsuchende und Experten in über 200 Fachgebieten zusammen."
 
 
 

Was unsere Besucher über uns sagen:

 
 
 
  • Ich bedauere, dass ich nicht gleich bei Ihnen gelandet bin. Die Leerung des Cache hat das Problem gelöst. Danke Gerd Schönbuchner Grafrath
< Zurück | Weiter >
  • Ich bedauere, dass ich nicht gleich bei Ihnen gelandet bin. Die Leerung des Cache hat das Problem gelöst. Danke Gerd Schönbuchner Grafrath
  • Endlich ein Experte, der mir wirklich weiterhelfen konnte! DANKE! JustAnswer Kunde Taunusstein
  • Ihre Antwort hat mir sehr geholfen, die richtigen Entscheidungen zu treffen. Dass Sie mir darüber hinaus noch 2 Empfehlungen gegeben haben fand ich super. Vielen Dank! JustAnswer Kunde Freiburg
  • Die ausgearbeiteten Hilfen waren gut strukturiert, leicht verständlich und zu 100% hilfreich für mich. Vielen Dank Markus B. Karlsruhe
  • Sehr schnelle und kompetente Antwort, die für mich bares Geld bedeutet. Vielen Dank! S.Stober K.
  • Herzlichen Dank! Hab durch Ihre Antwort viel Geld gespart! Ben R. Deutschland
  • Sehr schnelle und kompetente Hilfestellung. Besonders für mich als Laien wurde alles sehr verständlich erklärt. Gerne wieder! Rosengl Bad Tölz
 
 
 

Lernen Sie unsere Experten kennen:

 
 
 
  • Tronic

    Tronic

    IT-Specialist

    Zufriedene Kunden:

    2269
    Elektroniker und EDV-Service
< Zurück | Weiter >
  • http://ww2.justanswer.com/uploads/PY/Pyroflash/2011-4-21_104934_tronic.64x64.jpg Avatar von Tronic

    Tronic

    IT-Specialist

    Zufriedene Kunden:

    2269
    Elektroniker und EDV-Service
  • http://ww2.justanswer.com/uploads/rufushoschi/2010-11-08_135947_bild.jpg Avatar von IT-Fachinformatiker

    IT-Fachinformatiker

    Systemadministrator

    Zufriedene Kunden:

    6338
    Software Entwicklung, Projekt Erfahrung, Windows-Netzwerke, Linux-Netzwerke, Windows/Linux-Server
  • http://ww2.justanswer.com/uploads/COMINAROSA/2010-02-03_172238_PASSBILD.JPG Avatar von COMIN IT-Service

    COMIN IT-Service

    Dipl.-Ing.

    Zufriedene Kunden:

    779
    Dipl.Ing (FH) ET, NT, IT
  • http://ww2.justanswer.com/uploads/RaubergerConcep/2010-03-02_102740_Portraet64.jpg Avatar von RaubergerConcept

    RaubergerConcept

    IT-Specialist

    Zufriedene Kunden:

    234
    Mehr als 10 Jahre Erfahrung in Softwareentwicklung und Netzwerktechnik
  • http://ww2.justanswer.com/uploads/LF/lfalkenburg/2015-2-8_01843_.64x64.jpg Avatar von Lutz Falkenburg

    Lutz Falkenburg

    IT-Specialist

    Zufriedene Kunden:

    96
    Seit über 20 Jahren beruflich im IT-/IUK-Bereich tätig. Egal ob EinzelPC der Netzwerk...
  • http://ww2.justanswer.com/uploads/BI/BigDaddyXD/2012-10-24_20126_WhySoSeriousJob.64x64.jpg Avatar von BigDaddyXD

    BigDaddyXD

    Informatiker

    Zufriedene Kunden:

    1588
    Microsoft Certified Professional, Microsoft Certified Desktop Support Technican,...
  • http://ww2.justanswer.com/uploads/PU/Pucky80/2011-5-14_54537_pucky80.64x64.jpg Avatar von Pucky80

    Pucky80

    IT-Systemkaufmann

    Zufriedene Kunden:

    1322
    MCITP (Microsoft Server 2008 Enterprise Administrator)
 
 
 

Ähnliche Fragen in der Kategorie Computer