Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1288to1292
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
Zeilen kopieren und automatisch einordnen
06.12.2012 18:11:59
Wacker
Hallo an alle ich habe zwei Excel Tabellen und möchte von Eine die Werte kopieren und in andere einfügen, dabei sollen die Werte automatisch der Beschreibung eingeordnet werden und dann addiert werden.
z.B. Im Anhang zwei Beispiel Tabellen
es sollen die Werte von 82927 Excel Spalte B in 82928 Excel in die Spalte B addiert werden und dabei soll das Excel automatisch erkennen dass der Wert von Blau automatisch bei Blau auch addiert wird.
Die wirkliche Excel verfügt über 1000 Daten, so dass es lange dauern wurde die Werte manuell einzuordnen
https://www.herber.de/bbs/user/82927.xlsx
https://www.herber.de/bbs/user/82928.xlsx

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen kopieren und automatisch einordnen
07.12.2012 09:10:43
Klaus
Hi,
dass du in 82927 statt "rot" (drei Zeichen) "rot " (vier Zeichen, Leerzeichen!!) geschrieben hast war nur, um unsere Excel-Skills zu testen, ja?
Hier, das sollte klappen. Nicht blind ausführen, erst lesen: oben müssen ein paar variablen per Hand geändert werden.
Option Explicit
Sub AddiereWoandersHin()
On Error GoTo hell
Dim sPath As String
Dim sFile As String
Dim iColFarben As Integer
Dim iColWerte As Integer
Dim lRowFirst As Long
sPath = "C:\TestTmp"    'PFAD hier ändern!
sFile = "82928.xlsx"    'DATEI hier ändern!
iColFarben = 1              'in dieser SPALTE stehen die Farben (A=1, B=2 usw)
iColWerte = 2               'in dieser SPALTE stehen die Werte
lRowFirst = 1               'fängt in ZEILE 1 an. Hast du Überschriften im Original? Dann setze  _
dies auf 2
'deine sheet-namen kann ich leider nicht verwenden ... welche Spracheinstellung hast du denn?
'Ich verwende stattdessen immer "sheet1"
Dim wkbOld As Workbook
Dim wkbNew As Workbook
Dim lRowLast As Long
Dim rFarben As Range
Dim lRowFarbe As Long
Dim iFehler As String
Set wkbOld = ActiveWorkbook
Call FileCheckOpen(sPath, sFile)
Set wkbNew = ActiveWorkbook
wkbOld.Activate
With ActiveSheet
lRowLast = .Cells(Rows.Count, iColFarben).End(xlUp).Row
For Each rFarben In .Range(.Cells(lRowFirst, iColFarben), .Cells(lRowLast, iColFarben))
iFehler = rFarben.Value
Debug.Print rFarben.Value
lRowFarbe = Application.WorksheetFunction.Match(rFarben.Value, wkbNew.Sheets(1).Cells(1, _
iColFarben).EntireColumn, False)
wkbNew.Sheets(1).Cells(lRowFarbe, iColWerte).Value = rFarben.Offset(0, 1) + wkbNew. _
Sheets(1).Cells(lRowFarbe, iColWerte).Value
Next rFarben
End With
GoTo heaven:
hell:
MsgBox ("Farbe " & iFehler & " fehlt!")
Resume Next
heaven:
End Sub
'*********************************************************************************************** _
'* Makros to open needed files. Checks if Files are open or not.
'* If file is already open, do nothing - else open it
'* stolen from: https://www.herber.de/mailing/Pruefen_ob_Arbeitsmappe_geoeffnet_und_wenn_nein_oeffnen.htm
'* modified by Klaus M.vdT. / 16.NOV.2012
'*********************************************************************************************** _
'Example:
'Call FileCheckOpen("C:\TMP", "Filename.xls")
'path and filename can be RANGE from excelsheet
Sub FileCheckOpen(sPath As String, sFile As String)
sPath = sPath & "/" & sFile
If WkbExists(sFile) = False Then
If Dir(sPath) = "" Then
MsgBox "File " & sPath & " not found!"
Else
Workbooks.Open sPath, UpdateLinks:=False
End If
Else
Workbooks(sFile).Activate
End If
End Sub
Private Function WkbExists(sFile As String) As Boolean
Dim wkb As Object
On Error Resume Next
Set wkb = Workbooks(sFile)
If Not wkb Is Nothing Then
WkbExists = True
End If
On Error GoTo 0
End Function

Grüße,
Klaus M.vdT.

Anzeige
besser:
07.12.2012 09:26:11
Klaus
Hi,
sorry ich war etwas zu schnell. Ich habs nochmal durchkommentiert (damit du auch verstehst was da passiert) und ein paar kosmetische Mänkel beseitigt.

Sub AddiereWoandersHin()
On Error GoTo hell
Dim sPath As String
Dim sFile As String
Dim iColFarben As Integer
Dim iColWerte As Integer
Dim lRowFirst As Long
sPath = "C:\TestTmp"  'PFAD hier ändern!
sFile = "82928.xlsx"  'DATEI hier ändern!
iColFarben = 1        'in dieser SPALTE stehen die Farben (A=1, B=2 usw)
iColWerte = 2         'in dieser SPALTE stehen die Werte
lRowFirst = 1         'fängt in ZEILE 1 an. Hast du Überschriften im Original? Dann setze dies  _
auf 2
'deine sheet-namen kann ich leider nicht verwenden ... welche Spracheinstellung hast du denn?
'Ich verwende stattdessen immer "sheet1"
Dim wkbOld As Workbook
Dim wkbNew As Workbook
Dim lRowLast As Long
Dim rFarben As Range
Dim lRowFarbe As Long
Dim iFehler As String
Set wkbOld = ActiveWorkbook 'alte Datei merken
Call FileCheckOpen(sPath, sFile) 'neue Datei öffnen
Set wkbNew = ActiveWorkbook 'neue Datei merken (Focus auf neuer Datei nach öffnen)
With wkbOld.Sheets(1)
lRowLast = .Cells(Rows.Count, iColFarben).End(xlUp).Row                                  ' _
letzte Zeile
For Each rFarben In .Range(.Cells(lRowFirst, iColFarben), .Cells(lRowLast, iColFarben))  'fü _
r den gesamten Bereich
iFehler = rFarben.Value  'für die Fehlerbehandlung die Farbe merken
'Zeile der aktuellen Farbe im neuen Blatt feststellen (Farbe fehlt? springe zur  _
Fehlerbehandlung)
lRowFarbe = Application.WorksheetFunction.Match(rFarben.Value, wkbNew.Sheets(1).Cells(1, _
iColFarben).EntireColumn, False)
'Wert der aktuellen Farbe im neuen Blatt erhöhen
wkbNew.Sheets(1).Cells(lRowFarbe, iColWerte).Value = .Cells(rFarben.Row, iColWerte) +  _
wkbNew. _
Sheets(1).Cells(lRowFarbe, iColWerte).Value
Next rFarben
End With
GoTo heaven:
hell:
MsgBox ("Farbe " & iFehler & " fehlt!")
Resume Next
heaven:
End Sub
'*********************************************************************************************** _
_
'* Makros to open needed files. Checks if Files are open or not.
'* If file is already open, do nothing - else open it
'* stolen from: https://www.herber.de/mailing/Pruefen_ob_Arbeitsmappe_geoeffnet_und_wenn_nein_oeffnen.htm
'* modified by Klaus M.vdT. / 16.NOV.2012
'*********************************************************************************************** _
_
'Example:
'Call FileCheckOpen("C:\TMP", "Filename.xls")
'path and filename can be RANGE from excelsheet
Sub FileCheckOpen(sPath As String, sFile As String)
sPath = sPath & "/" & sFile
If WkbExists(sFile) = False Then
If Dir(sPath) = "" Then
MsgBox "File " & sPath & " not found!"
Else
Workbooks.Open sPath, UpdateLinks:=False
End If
Else
Workbooks(sFile).Activate
End If
End Sub
Private Function WkbExists(sFile As String) As Boolean
Dim wkb As Object
On Error Resume Next
Set wkb = Workbooks(sFile)
If Not wkb Is Nothing Then
WkbExists = True
End If
On Error GoTo 0
End Function

Anzeige
Wie bekomme ich den Code ins VBA?
07.12.2012 09:57:29
Klaus
Hi,
hier
https://www.herber.de/forum/messages/1289708.html
hast du gefragt, wie du den Code ins VBA bekommst.
In deiner Tabelle, drücke ALT+F11
jetzt geht ein lustiges Fenster auf, das du noch nie gesehen hast. Keine Angst, das ist nur die VBA-Umgebung.
links ist ein Datei-Explorer, da steht irgendwo VBAProject(DeinDateiname). Da clickst du mit RECHTS drauf.
Im Kontextmenü "INSERT" clicken, dann "MODULE". Ob das im deutschen Excel anders heisst weiss ich nicht.
Rechts erscheint ein weißes Fenster. Ganz oben steht "Option Explicit" oder auch nicht, je nach deinen Einstellungen.
Markiere meinen gesamten Code, STRG+A, wähle das neue weiße Fenster aus, STRG+V.
Der Code ist in der Datei. Schnell speichern!
Starten kannst du den Code, indem du entweder in diesem weißen Fenster in den Code clickst und dann F5, oder über das Makromenü direkt aus Excel.
LIES bitte erst dein Code, zumindest den Anfang. Die grünen Texte sind im Klartext.
Ganz oben findest du diese Zeilen:
sPath = "C:\TestTmp" 'PFAD hier ändern!
sFile = "82928.xlsx" 'DATEI hier ändern!
iColFarben = 1 'in dieser SPALTE stehen die Farben (A=1, B=2 usw)
iColWerte = 2 'in dieser SPALTE stehen die Werte
lRowFirst = 1 'fängt in ZEILE 1 an. Hast du Überschriften im Original?

Hier musst DU SELBST den Code auf deine Datei anpassen. Keine Angst, trau dich! Du siehst "C:\TestTmp"? Ändere das auf deinen Pfad, vielleicht "C:\Eigene Dateien\Excel" ?
du siehst "82928.xlsx"? Ändere das auf deinen Dateinamen, vielleicht "Farbendatei.xlsx"?
die iCol und lRow werte musst du nicht ändern, wenn deine Originaldatei exakt die Spalten / Zeilen deines Musters benutzt.
Und? Klappts?
Ist VBA-Lernen schwer? Die Frage zu beantworten ist schwer. Ich habe damals (in den 90ern) bereits Q-Basic und GW-Basic gelernt, später auch etwas TurboPascal und Delphi. Damit war VBA zu erlernen für mich nicht sooo schwer.
Andererseits hab ich auch 5 Jahre Latein in der Schule gehabt, und 2 Jahre Spanisch an der VHS. Hängengeblieben ist nicht ein Wort.
Kannst du überhaupt irgendwas programmieren (vielleicht PHP, oder JavaScript?) Oder ist das alles für dich "wie chinesisch"?
Grüße,
Klaus M.vdT.

Anzeige
AW: Wie bekomme ich den Code ins VBA?
07.12.2012 11:39:48
Wacker
Habe alles so gemacht allerdings stehen die Farben in anderen Tabelle in andere Spalte(also keine Spalte 1) sowie die Werte(keine Spalte 2) ist es noch möglich diese anzupassen?
also während mein Studium habe ich mit Java programmiert war aber nicht gut in Java, PHP und Python waren für mich einfacher, Python habe ich mir damals für meine Verteidgung innerhalb eines Monats beigebracht. Gibt es in Internet vielleicht Bücher anhand welche VBA sich beibringen kann? Oder haben Sie bestimmte empfehlung? weil es immer vorkommen kann das es gebraucht wird

AW: Wie bekomme ich den Code ins VBA?
10.12.2012 08:43:22
Klaus
Hallo Wacker,
in andere Spalte(also keine Spalte 1)
iColFarben = 1 'in dieser SPALTE stehen die Farben (A=1, B=2 usw)
In welcher Spalte stehen denn die Farben? In Spalte "C"? Dann einfach iColFarben auf = 3 ändern.
sowie die Werte(keine Spalte 2)
iColWerte = 2 'in dieser SPALTE stehen die Werte
In welcher Spalte stehen denn die Werte? In Spalte "C"? Dann einfach iColWerte auf = 3 ändern.
Das steht aber alles auch in meinem vorherigen Beitrag! Und nochmal als Klartext im Code.
Oder haben Sie bestimmte empfehlung?
Ich selbst habe mir VBA, wie gesagt, autodidaktisch beigebracht. Meine Empfehlung: Immer mal wieder kleiner Vorgänge mit dem Makrorekorder aufzeichen, den Rekorder-Code lesen, verstehen und verbessern (mit Hilfe des Forums!). Wenn die üblichen Programmierkentnisse schon vorhanden sind (was sind Variablen, was ist IF-THEN, was ist FOR-NEXT usw usw) sollten die VBA Grundzüge auch nicht mehr schwer sein.
Grüße,
Klaus M.vdT.

Anzeige
Lösung ohne VBA
07.12.2012 10:02:32
Klaus
Hallo nochmal,
vielleicht besser so:
in der Datei 82928.xlsx schreibst du in Zelle C1:
=VLOOKUP(A1;[82927.xlsx]Лист1!$A:$B;2;)
und in Zelle D1:
=C1+B1
beide Formeln ziehst du so weit nach unten wie nötig. Jetzt markierst du Spalte D, kopieren, markierst Spalte B, Inhalte einfügen: Werte.
Nun kannst du Spalte C und D wieder löschen.
Grüße,
Klaus M.vdT.

AW: Zeilen kopieren und automatisch einordnen
07.12.2012 10:30:37
Ass
Hallo,
ich hab' das wohl ein bischen anders verstanden als Klaus M.vdT.
hier noch eine Makro-Lösung
Die Datei 82928.xls muss geöffnet sein!
https://www.herber.de/bbs/user/82930.xlsm
Gruß
Rudi

Anzeige
AW: Zeilen kopieren und automatisch einordnen
07.12.2012 10:41:01
Klaus
Hi,
Set bookOut = Workbooks("82928") geht bei mir nicht, aber Set bookOut = Workbooks("82928.xlsx").
Da der TE sich leider nicht mehr meldet, ich aber sehr interessiert bin, magst du mir den Code erklären?
Ich verstehe schon, dass du
- ein Array erzeugst (mit den alten Werten?)
- ein Array erzeugst (mit den neuen Werten?)
- die Arrays abgleichst
- das Ergebnisarray ausgibst.
Aber was hat das mit der Dictionary auf sich? Ist das eine dieser "regular expressions", die ich noch nie begriffen habe?
Grüße,
Klaus M.vdT.

AW: Zeilen kopieren und automatisch einordnen
07.12.2012 12:07:07
Ass
Hallo Klaus
ich verwende Excel 2007. Da reichte Set bookOut = Workbooks("82928")
Klar hätte man bei der aufgabe noch einige Informationen erfragen sollen.
Ich hab' mir das erspart und bin meiner Intuition gefolgt.
Ich lade mir erstmal die Ausgabetabelle in ein Array.
Dadurch bleibt die Ausgabe unsortiert in der bestehenden Reihenfolge.
Im Dictionary erfasse ich alle Daten-Pärchen mit key und Wert.
Die keys sind also die eindeutigen Schlüssel.
Jeder Schlüssel kann nur einmal vorkommen(logisch, sonst wäre die Zuordnung der werte ja nicht möglich).
Sollte dies doch vorkommen, dann beende ich die Sach mit strDubError. In dem Falle hätte der Fragesteller eine sinnlose Aufgabe gestellt. In der Praxis wäre dieser Fehler damit abgefangen.
Auch das Leerzeichen in "rot " habe ich nicht als böswillige Absicht gesehen, sondern als möglichen Fehler den es zu berücksicksichtigen gilt. Das passiert mitunter,wenn die Daten aus anderen Programmen importiert wurden. Deshalb habe ich alle Begriffe getrimmt.
Dictionary.TextMode = 1
Nichtbeachtung der Groß/Kleinschreibung. Auch damit wird eine mögliche Fehlerquelle beseitigt.
Danach lese ich die 1.Tabelle in das Dictionary und addiere die Werte. Das Dictionary erkennt den Schlüssel. Ich brauche also keine Schleife. Hier bin ich davon ausgegangen, dass ein Schlüssel sehr wohl mehrfach vorkommen kann. Sollte in der 1. Tabelle ein neuer Schlüssel auftauchen, dann wird er klaglos in das Dictionary aufgenommen. Das erkennt man dann daran, dass in der Ausgabe am Ende der Tabelle weitere Zahlen auftauchen. Diesen "Fehler?" habe ich nicht behoben.
So, und zuguterletzt werden dann die Werte ausgegeben.
Zum scripting.dictionary möchte ich mich nicht weiter auslassen, da findest du genug Lektüre, zB.:
http://www.microsoft.com/germany/technet/datenbank/articles/600356.mspx
Ich hätte die vba.collection nehmen können oder system.collections.arraylist. Alles Klassen, die Daten-Pärchen verarbeiten.
regular expressions dient dem schnellen und komplexen Mustervergleich, ist also was ganz anderes. Auf Elemente anderer Sprachen greife ich zu, weil diese ihre Vorteile haben, Schnelligkeit und Eigenschaften, die es in vba so nicht gibt. Die Klasse 'regular expressions' gibt es in verschieden Sprachen, so auch in wscript und im Net.Framework.
Gruß
Rudi
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige