Copy and waste

Hallo an Alle,
bei der folgenden VBA-Zeile bekomme ich die Fehlermeldung „1004…“

Worksheets(„import“).Range(Cells(i, 1), Cells(i, 95)).Copy

Die Variable i hat den Wert 9.

In der Excel-Hilfe findet man dieses Beispiel

Worksheets(„Sheet1“).Range(„C1:C5“).Copy
ActiveSheet.Paste Destination:=Worksheets(„Sheet1“).Range(„D1:smiley:5“)

( sinnigerweise wird in dasselbe Blatt kopiert… aber so weit komme ich ja gar nicht mit meinem Code :frowning: )

Habe auch schon das Range drumherum weggelassen, geht auch nicht.
Ich will aber nicht mit den blöden A1-Bezügen arbeiten ( da wird es schwierig mit variablen Argumenten ).
Kann mir jemand helfen?

Freundliche Grüße
Thomas

Grüezi falken

bei der folgenden VBA-Zeile bekomme ich die Fehlermeldung
„1004…“

Worksheets(„import“).Range(Cells(i, 1), Cells(i, 95)).Copy

Die Variable i hat den Wert 9.

Was ist denn während der Code-Ausführung das aktive Objekt?

( sinnigerweise wird in dasselbe Blatt kopiert… aber so weit
komme ich ja gar nicht mit meinem Code :frowning: )

…Du möchtest in ein anderes, oder wie?

Ich will aber nicht mit den blöden A1-Bezügen arbeiten ( da
wird es schwierig mit variablen Argumenten ).

Da gibts noch .Offset() und .Resize(), die gute Dienste leisten…

Kann mir jemand helfen?

Vermutlich liegt es daran, dass Du die Ranges nicht vollständig referenziert hast - dies hier sollte klappen:

Worksheets(„import“).Range(Worksheets(„import“).Cells(i, 1), Worksheets(„import“).Cells(i, 95)).Copy

Etwas übersichtlicher in der Schreibweise wird es dann so:

With Worksheets(„import“)
.Range(.Cells(i, 1), .Cells(i, 95)).Copy
End With


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hi,

dein Problem lässt sich ganz leicht lösen.

Das Blatt, aus dem du kopieren möchtest, muss das aktive Blatt sein. Schreibe einfach von den Kopierbefehl die Zeile

Worksheets(„import“).activate

damit klappt es bei mir jedenfalls.

Guten Morgen,
meinen herzlichsten Dank an Thomas Ramel und power_blue.
Ich werde beide Versionen ausprobieren und sehen, ob das Prog noch schnell genug ist, um ca. 15.000 Datensätze aus einer alten und aus einer neuen Inventur zusammenzukopieren.
Oder hat jemand noch eine Idee, was noch schneller geht?
Activate ist ja nicht so zeitraubend wie select, oder?
Es ist jedenfalls für mich sehr hilfreich, auf so professionelle Beratung zurückgreifen zu können. Weiter so!
Einen schönen Tag wünsche ich Euch
Thomas

bei der folgenden VBA-Zeile bekomme ich die Fehlermeldung
„1004…“

Worksheets(„import“).Range(Cells(i, 1), Cells(i, 95)).Copy
Die Variable i hat den Wert 9.

Hallo Thomas,

sehr gut, daß du den Wert der Variablen i gezeigt hast, sowas ist für Antworter immer sehr hilfreich um andere Fehlerquellen abzuschätzen.

Zu der einen anderen Antwort, vergiss das mit Activate.
Activate und Select nimmt man nur wenn es unbedingt sein MUSS, ansonsten vermeidet man es sooft es ght, also zu 99%.

Die andere Antwort ist korrekt, como siempre :smile:

Man kann sie leicht ausbauen zu dem was du wahrscheilnich willst:

'...
Set wks2 = Worksheets("Export")
With Worksheets("import")
 .Range(.Cells(i, 1), .Cells(i, 95)).Copy Destination:=wks2.Cells(5, 7)
End With
'...

Gruß
Reinhard

Hallo Thomas,

Ich werde beide Versionen ausprobieren und sehen,

*aargs*, dazu hab ich grad was geschrieben :smile:

ob das Prog
noch schnell genug ist, um ca. 15.000 Datensätze aus einer
alten und aus einer neuen Inventur zusammenzukopieren.
Oder hat jemand noch eine Idee, was noch schneller geht?

Es gibt schon beschleunigeunen, Sreenupdating=False/True, Calsulation auf manuell usw.

Zeige mal den kompletten vorliegenden relevanten Code.

Gruß
Reinhard

Hallo,
mopmentan hängt es jetzt beim paste-Befehl ( 4. Zeile:

Worksheets(„import“).Activate
Range(Cells(i, 1), Cells(i, 95)).Copy
Worksheets(„neueTab“).Activate
Range(Cells(i, 1), Cells(i, 95)).Paste

Ursprünglich hatte ich es etwas anders:

ActiveSheet.Paste Destination:=Worksheets(„neueTab“).Range(Cells(i, 96), Cells(i, 110))

Aber das passt ja auch nicht so gut, wenn man das Blatt schon aktiviert.
Kannst Du weiterhelfen?

O.K., Du hast es so gewollt :wink:

Sub sortieren_nach_aktueller_Spalte_imp()
’ sortieren_nach_aktueller_Spalte Makro
’ Makro am 03.07.2002 von Thomas Schütte aufgezeichnet
s = ActiveCell.Address
Cells.Select
Selection.EntireColumn.Hidden = False
Selection.EntireRow.Hidden = False

Application.Goto Reference:=„Bereich_imp“

Selection.Sort Key1:=Range(s), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Sub importieren()
’ importieren Makro
’ Daten aus WIAS in der Zwischenablage, Spalten 1-95, ca. 14.000 Zeilen
’ sollen mit bestehenden Daten, Klassifizierungen und Logiken
’ verknüpft werden, die in den Spalten 96 bis 110 artikelbezogen
’ abgelegt sind
'Einfügen in Zelle A8
'Sheets(„import“).Select
'Range(Cells(8, 1)).Select
'ActiveSheet.Paste
Cells.Select
With Selection.Interior
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
.PatternTintAndShade = 0
End With

'Sortieren nach Artikelnummern
'Worksheets(„alteTab“).Select
’ Cells(10, 65).Select

'Application.CutCopyMode = False
'Application.Run „sortieren_nach_aktueller_Spalte_alt“
'Worksheets(„import“).Select
’ Cells(10, 65).Select

'Application.Run „sortieren_nach_aktueller_Spalte_imp“

'Randbedingungen feststellen
lr_imp = ActiveCell.SpecialCells(xlLastCell).Row
lc_imp = ActiveCell.SpecialCells(xlLastCell).Column
Sheets(„alteTab“).Select
lr_alt = ActiveCell.SpecialCells(xlLastCell).Row
lc_alt = ActiveCell.SpecialCells(xlLastCell).Column
Application.CutCopyMode = False
zeile_alt = 9

For i = 9 To lr_imp 'alle importierten Zeilen

artikel_imp = Worksheets(„import“).Cells(i, 65) 'aktueller importierter Artikel
artikel_alt = Worksheets(„alteTab“).Cells(zeile_alt, 65)

Worksheets(„import“).Activate
Range(Cells(i, 1), Cells(i, 95)).Copy
Worksheets(„neueTab“).Activate
Range(Cells(i, 1), Cells(i, 95)).Paste

If (artikel_imp = artikel_alt) Then
Worksheets(„import“).Range(Cells(i, 96), Cells(i, 110)).Copy
ActiveSheet.Paste Destination:=Worksheets(„neueTab“).Range(Cells(i, 96), Cells(i, 110))

zeile_alt = zeile_alt + 1
Else: For zeile_alt = 9 To lr_alt
artikel_alt = Worksheets(„alteTab“).Cells(zeile_alt, 65)
If artikel_alt = artikel_imp Then
Worksheets(„import“).Range(Cells(i, 96), Cells(i, 110)).Copy
ActiveSheet.Paste Destination:=Worksheets(„neueTab“).Range(Cells(i, 96), Cells(i, 110))

End If
Next zeile_alt
End If

Next i

End Sub

Inventur-BestandsDaten
Hallo Reinhard,
vielen Dank für Dein Interesse und bisherige Tips.
Zu dem vorliegenden Code wollte ich dann noch folgendes sagen:

Unser Auftragsverwaltungsprogramm ( WIAS ) exportiert Bestandsdaten aus der jeweiligen Inventur.
Da wir viele sehr alte „Ladenhüter“ am Lager haben, müssen/wollen wir die Artikel teilweise abwerten.
Das ist etwas komplizierter und ich weiß auch noch nicht genau, wie es werden soll. Jedenfalls geht es nicht nur nach Alter --> Hydraulikschläuche sind z.B. nach 5 Jahren zu entsorgen, Edelstahlschrauben sind nach 15 Jahren auch noch o.k.
Zudem sind einige Artikel falsch angelegt usw.
Nun habe ich schon in den Spalten 95 bis 110 ein paar Zusatzinfos und Filterlogiken eingefügt. Es fehlen aber noch wichtige Artikeldaten ( letzter Lagerabgang, letzter Einkauf, Lieferanten-Artikelnummer ), die ich vom Softwarehaus nachkaufen muss :frowning:
Es werden also 3 Spalten mehr - kein Problem.
Zwischenzeitlich bearbeiten aber unsere Leute den Artikelstamm, so dass meine Anpassungen in die falsche Zeile rutschen.
Deshalb dieses Makro. Es soll die beiden Bestandsdatenbanken anhand der Artikelnummer zusammenkopieren. Auch für kommende Jahre ( Inventuren ).
Sorry, wenn ich mich ein Bisschen umständlich ausdrücke, aber ich bin leider kein EDV-Profi.
Wahrscheinlich gibt es auch elegantere Lösungswege. Mir ist aber bisher keiner eingefallen. Wenn also jemand eine gute Idee hat, kann ich das Konzept noch grundlegend ändern.
So, nun muss ich noch ein Bisschen arbeiten.
Bis später
Thomas

Beim Einfügen musst du nicht nur das Blatt, sondern auch die Zelle auswählen, bevor du einfügen kannst.

Worksheets(„neueTab“).Activate
Worksheets(„neueTab“).Cells(i, 1).Select
ActiveSheet.Paste

Guten Morgen,
vielen Dank für Deinen Hinweis. Jetzt hat es geklappt. Nun muss sich noch zeigen, ob das Ganze auch schnell genug geht.
Schönen Tag noch
Thomas