[EXCEL 2007] Spalten-Inhalt in andere Spalte mit belegten Feldern kopieren

Terence Hill

Newbie
Registriert
Aug. 2013
Beiträge
6
Guten Tag zusammen,

habe hier eine offensichtlich wirklich harte Nuss zu knacken, habe das Internet 4 Stunden durchforstet aber keine Lösung für dieses scheinbar einfache Problem gefunden.


Es geht um Folgendes, eine Spalte "A" voller Werte z.B.
A
Anzahl
43
45
64
34
32
43
23
11


soll in eine andere Spalte "B" in der selben Tabelle kopiert werden, jedoch ist diese Spalte teilweise schon ausgefüllt.

z.B.
B
Anzahl2
65
58

58


84
85

58

58
48


88

Nun zum Knackpunkt: Die Zellen von Spalte "A" sollen in die leeren Zellen von Spalte "B" eingefügt werden. Spalte "A" soll somit Zellenweise von oben nach unten in Spalte "B" an den Stellen eingefügt werden in denen momentan noch leere Zellen sind.


So zB. (rot sind die eingefügten werte von Spalte "A")
B
Anzahl2
65
58
43
58
45
64
84
85
34
58
32
58
48
43
23
88
11


Leider habe ich wenig Erfahrung mit dem Schreiben von Makros, welche hier bestimmt notwendig sind.
Für jegliche Hilfe wäre ich sehr dankbar, da ich einfach nichts vergleichbares im Netz finden kann.

Ich hoffe das Problem ist verständlich erklärt von mir ..



Beste Grüße und vielen Dank für jegliche Hilfe
 
Zuletzt bearbeitet:
Mach doch einfach eine dritte Spalte auf und benutze folgende Formel (ausgehend davon, dass due in Spalte A und B in Zeile 2 anfängst)

=WENN(ISTLEER(B2);A2;B2)

Gruß

Riq

edit: ach ich sehe gerade, dass die Inhalte nicht nebeneinander stehen, sondern abgearbeitet werden müssen. My bad! :(
 
Zuletzt bearbeitet:
Ich frag mich, warum die Daten aufgefüllt werden müssen und nicht einfach die leeren Zeilen rausgenommen werden und die Daten dann unten/oben angefügt werden können?
 
Riq12 schrieb:
Mach doch einfach eine dritte Spalte auf und benutze folgende Formel (ausgehend davon, dass due in Spalte A und B in Zeile 2 anfängst)

=WENN(ISTLEER(B2);A2;B2)

Gruß

Riq

edit: ach ich sehe gerade, dass die Inhalte nicht nebeneinander stehen, sondern abgearbeitet werden müssen. My bad! :(

Ja .. daran scheiterts. Das bekomme ich nicht hin.



blackraven schrieb:
Ich frag mich, warum die Daten aufgefüllt werden müssen und nicht einfach die leeren Zeilen rausgenommen werden und die Daten dann unten/oben angefügt werden können?

Es Handelt sich um eine Vertriebs/Kosten Tabelle mit noch mehr Spalten, die Grundstruktur der Tabelle soll unbedingt erhalten bleiben.



Trotzdem schonmal vielen Dank für den Einsatz!
Hoffe da findet sich was ..
 
Das macht es uns nicht gerade leichter, wenn wir eben diese Grundstrucktur nicht kennen.


Spalte a enthält keine Leerzellen? Es könnte/müsste also dort aufhören mit Spalte b auffüllen, wo in Spalte a das erste mal eine leere Zelle auftaucht?



Edith...

Falls ja, dann dürfte das deine Lösung sein.

Sub auffüllen()
Dim a As String
Dim starta As Integer
Dim startb As Integer

starta = InputBox("Startzeile in Spalte A eingeben", "Start")
startb = InputBox("Startzeile in Spalte B eingeben", "Start")

Do


Range("A" & starta).Select
a = ActiveCell

Do
Range("B" & startb).Select
If ActiveCell <> "" Then
startb = startb + 1
Else
ActiveCell = a
Exit Do
End If
Loop

starta = starta + 1
Loop Until a = ""
 
Zuletzt bearbeitet:
Hallo Blackraven,
danke für das Makro.

Ja du hast oben beides richtig verstanden.


Leider funktioniert das Makro nicht.
Nachdem ich das Makro starte poppt ein weiteres fenster hoch welches gleich in der ersten Zeile einen Fehler hat.

Code:
With Worksheet("Tabelle1") <---- hier ist der Fehler
If Range("C4") <> "" Then
Range("N1").Select
Selection.Copy
Range("C4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If





das Fehlerfenster:
"Fehler beim Kompilieren:
Außerhalb einer Prozedur ungültig" (kann leider keine Bilder hochladen von hier)



Finde leider keinen Weg den Fehler zu beheben.
Danke nochmal im Voraus
 
Schreib mal ganz zum schluss noch rein: End Sub
Hatte ich vergessen in dem VB-Code.
So muss das aussehen.
Unbenannt.JPG
 
Zuletzt bearbeitet:
Moin,

ohne den Code weiter zu studieren: DER (von dir aufgeführte) Fehler liegt an With Worksheets("Tabelle1")

Ansonsten hier ein Code, der funktioniert, wenn du ihn in das Modul des entsprechenden Blattes einträgst:

Code:
Option Explicit

Sub Verschieben() 'By GMG-CC
   Dim lRowSrc As Integer
   Dim fRowDst As Integer
   Dim i As Integer
   Dim Wert As Variant
   
   'Spalte_A ist ohne Lücken, -> letzte Zeile feststellen
   With ActiveSheet
      lRowSrc = .Cells(Rows.Count, 1).End(xlUp).Row
      For i = 2 To lRowSrc
         Wert = .Cells(i, 1)
         .Cells(i, 1).ClearContents
         fRowDst = 1
         Do
            fRowDst = .Range("B1").End(xlDown).Row + 1
            If .Cells(fRowDst, 2) = "" Or IsEmpty(.Cells(fRowDst, 2)) Then Exit Do
         Loop
         .Cells(fRowDst, 2) = Wert
      Next i
   End With
End Sub
 
Guten Tag zusammen :)


Ich muss mich zunächst bei euch beiden entschuldigen, der Fehler oben kam von einem Code der mit euren beiden Makros nichts zu tun hatte. Das Makro wurde wieso auch immer schlichtweg erst angezeigt als ich euren ausprobieren wollte mit "sub ausführen".


@Blackraven
das makro funktioniert nun (mit End Sub)! Absolut genial und auch sehr einfach zu bedienen.
Ist es auch möglich, dass auch die Spalten eine Variable darstellen bzw. in einem solchen pop-up Fenster erst festgelegt werden?
Die Taballen hier sind in der Regel sehr groß .. und das mit Spalte A & B war rein exemplarisch..

Besten Dank schonmal!


@GMG-CC
Hallo Günther,
Das Makro funktioniert ebenfalls!
Leider werden die werte aber nicht kopiert sondern ausgeschnitten und in die leeren Zellen eingefügt.
Und eben das Problem, wie bei Blackraven, das es nur genau auf Spalte A und B anwendbar ist.

Ebenfalls vielen vielen Dank für die Unterstützung.



PS: Ober ist das editieren der Makros damit es auf andere Spalten angewendet wird relativ einfach?
Was muss geändert werden?





Beste Grüße & einen schönen Tag
 
Zuletzt bearbeitet:
Moin,

ja, das mit dem löschen war Absicht. Siehe auch der Name des Makros -> "verschieben". :). Ich hatte mir gedacht, dass das so sein sollte. Aber wenn die Zeile
Code:
 .Cells(i, 1).ClearContents
auskommentiert ( ' vor die Zeile) oder gelöscht wird, dann bleibt der Inhalt in Spalte_A auch erhalten. So viel zum Thema Gedacht-Verdacht :evillol:

Ach ja, "... nur auf Spalte_A und B angewendet ...". Das ist an sich kein Problem, das zu ändern. Wenn du uns sagst, wie das dann laufen soll, ist das gewiss geringer Aufwand. Ich meine damit: Sind das immer Spaltenpaare A+B, C+D, E+F, ... oder A+B, A+C, A+D, ... oder noch ganz anders? Im Endeffekt ist die Routine ja immer gleich und kann entsprechend wiederholt werden, nachdem die Spalten angepasst sind.
 
Guten Morgen :o ;)

mein Kollege fragt ebenfalls nach dem Makro, für welche Spaltenkombinationen er das Makro verwenden will weis ich nicht.
Es wird möglicherweise dauerhaft (es handelt sich nicht um eine 1x ein Mann Operation, von daher wart ihr bereits jetzt eine große Hilfe) und auf sämtliche Spaltenkombinationen eingesetzt.

Kann man das im Makro (im Code selbst) "schnell" anpassen?
Bzw die Spalten (A, B, ...) und die erste Zeile (2, 3..) in beiden Spalten?


So könnte man es formulieren:
-Es handelt sich immer um genau 2 Spalten
-in den jeweiligen Spalten, soll die Bearbeitung in Zeile X beginnen




Blicke im Code nicht wirklich durch .. dort scheinen z.B. Spalten mit Zahlen deklariert zu sein..




Beste Grüße
und einen schönen Tag :freaky:
 
Zuletzt bearbeitet:
Terence Hill schrieb:
So könnte man es formulieren:
-Es handelt sich immer um genau 2 Spalten
-in den jeweiligen Spalten, soll die Bearbeitung in Zeile X beginnen
Wenn dann noch die Aussage stimmt, dass diese beiden Spalten immer direkte Nachbarn sind und in der linken Spalte die "Lückenfüller" stehen, ist das kein Problem. Direkt auf die Schnelle anpassen ist möglich, wenn aber immer verschiedene Spaltenpaare angesprochen werden sollen, dann würde ich eine kleine UserForm einsetzen.

Im Moment komme ich abends sehr spät heim, aber am Wochenende würde ich das realisieren. - Und ach ja, ich spreche die Spalten in der Tat mit ihrer Nummer an. Es geht zwar auch über ein Hilfskonstrukt wie Cells(3,"B") (entspricht B3) aber wenn du dann die Spalte rechts davon ansprechen willst, dann führt ein Konstrukt wie MsgBox Cells(3, "B" + 1) zu einem Fehler. Darum empfinde ich die von mir Schreibweise als konsequenter.
Blicke im Code nicht wirklich durch ..
Ist auch für Einsteiger schwierig. Ich hätte vielleicht mehr kommentieren sollen ...
 
Guten Morgen nochmal, bzw. vermutlich guten Abend Günther :)

Das weiß ich leider nicht, ob die Spalten (auch beim Kollegen) immer direkt nebeneinander stehen. Der Kollege ist seit der Woche im Urlaub.
Bzw. auch ich gehe heute Nachmittag in den Urlaub.

Von daher würde sagen das wir das Ganze erst einmal so belassen. Habe den Code dem Kollegen zugeschickt bzw. die URL zum Forum.
Der Kollege soll sich dann ganz einfach hier melden, wenn er noch Probleme mit dem jetzigen Makro hat.

Günther & blackraven, vielen vielen Dank nochmal für die tatkräftige Unterstützung. Ihr wart mir wirklich eine große Hilfe, denn alleine hätte ich das nicht auf die Reihe bekommen.



Beste Grüße

Lukas
 
Hallo Lukas,

ich habe dir eine PM gesandt!

ps: ich habe gerade gemerkt: Dieser Beitrag ist teuflisch gut, weil mein 666. Beitrag und das ist ja die Zahl des Teufels …:evillol:
 
Zuletzt bearbeitet:
Terence Hill schrieb:
Guten Tag zusammen :)

@Blackraven
das makro funktioniert nun (mit End Sub)! Absolut genial und auch sehr einfach zu bedienen.
Ist es auch möglich, dass auch die Spalten eine Variable darstellen bzw. in einem solchen pop-up Fenster erst festgelegt werden?
Die Taballen hier sind in der Regel sehr groß .. und das mit Spalte A & B war rein exemplarisch..


Ja es ist auch möglich die Spalten als Variable anzulegen.
Wichtig ist halt nur, dass die Ursprungsspalte keine Leerzeilen enthält, da es dort stoppt.

Auch wenn der Code von GMG-CC fachlich evtl. ausgereifter ist, finde ich meinen zumindest mal verständlicher und er führt zum Ziel. :)


Sub auffüllen()
Dim a As String
Dim starta As Integer
Dim startb As Integer
Dim spalte1 As String
Dim spalte2 As String


spalte1 = InputBox("Bitte die Urspungsspalte eintragen.")
spalte2 = InputBox("Bitte die aufzufüllende Spalte eintragen.")
starta = InputBox("Startzeile in Spalte A eingeben", "Start")
startb = InputBox("Startzeile in Spalte B eingeben", "Start")




Do
Range(spalte1 & starta).Select
a = ActiveCell

Do
Range(spalte2 & startb).Select
If ActiveCell <> "" Then
startb = startb + 1
Else
ActiveCell = a
Exit Do
End If
Loop

starta = starta + 1
Loop Until a = ""


End sub
 
Zuletzt bearbeitet:
@ blackraven:
Sorry, ich hatte deinen Code nicht gesehen. Irgendwie "übersehe" ich immer die hidden contents. Insofern hatte ich nur den Beitrag überflogen, ohen den Code zu bemerken ... Ich finde es nämlich nicht so prächtig, auf funktionierende Lösungen eines anderen Helfern noch einen drauf zu setzen.

In dem Sinne
 
Zurück
Oben