Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Kopier Bedingung mit VBA
#1
Hallo Zusammen,

ich habe ein kleines Makro, welches wenn aufgerufen wird eine Reihe an Daten in eine andere kopiert. Das funktioniert auch soweit.

Nun möchte ich dies erweitern und dem Makro sagen, das es nur Werte in leere Zellen kopieren darf, oder in Zellen die kleiner als Wert 1 sind. (also wenn leer oder eine Null in der Zelle steht, darf es kopieren)

In der Praxis sieht es dann so aus, das beim Ausführen des Makros, es in einige Zellen einen Wert kopiert und in andere Zellen nicht, da hier bereits ein Wert grösser 1 vorhanden ist.



Hier das funktionierende Makro:

Sub Woche_1()
'
' Woche_1 Makro
' Kopiert die Werte in Spalte Woche 1.
'
' Tastenkombination: Strg+h
'
    Range("J7:J30").Select
    Selection.Copy
    Range("K7:K30").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("M14").Select
    Application.CutCopyMode = False
End Sub



Vielen Dank schon mal im Voraus Idea :19: 

Gruss Torsten
Antworten Top
#2
Hi Torsten,

welche Möglichkeiten, um Bedingungen zu prüfen, hast Du bei deiner Recherche finden können?



gruß
Marco
gruß
Marco
Antworten Top
#3
Hallöchen,

da müsstest Du jeden Zellinhalt einzeln abgleichen. Normalerweise nimmst Du beide Bereiche in je ein Array, ersetzt ggf. die Daten bei leer oder 0 und schreibst das geänderte Array zurück. Bei kleinen Bereichen kann man auch mal zellenweise vorgehen.


for iCnt = 7 to 30
if cells(iCnt,11).value = "" or cells(icnt,11).value < 1 then cells(icnt,11).value = cells(icnt,10).value
next
...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • veniceline
Antworten Top
#4
Danke ich teste das mal nächste Woche
ich glaube 

for each geht auch als Schleife...

Bei mir steht entweder nichts in der Zelle oder eine 0 (NULL). Diese dürfen mit Werten versehen werden. 
Bei denen wo schon was drinn steht soll erhalten bleiben, also nicht überschreiben.

grüsse und schönes Wochenende
Antworten Top
#5
Hi, 

da mir - was VBA angeht - Arrays bislang unzugänglich waren habe ich sowas ähnliches mal ganz plakativ gelöst: 

Ich habe beide zu vergleichenden Bereiche in ein ausgeblendetes Blatt in jeweiles eine Spalte kopiert und dann mittels Formel in einer dritten Spalte die Bedingungen dargestellt. Das Ergebnis habe ich dann wieder zurück in die eigentliche Tabelle kopiert (nur die Werte, nicht die Formel).

Sicher gibt es flottere und elegantere Varianten aber ich denke so klappt das und ist auch nicht besonders schwierig umzusetzen. Das wäre auch mittels Makrorecorder möglich. 

Nur als Idee, vielleicht hilft dir das ja :)
[-] Folgende(r) 1 Nutzer sagt Danke an EasY für diesen Beitrag:
  • veniceline
Antworten Top
#6
Moin!
@EasY:
Das mit den Arrays ist ja kein Hexenwerk.
Wenn ich einem Array den Bereich Range("J7:J20") übergebe,
dann erhalte ich das Array arr(1 To 14, 1 To 1)
Dann kann ich dieses Array mittels For i = 1 To 14 oder allgemeiner mit For i = 1 To UBound(arr) durchschleifen.

Ausgangsposition:
JK
711
820
923
1033
111
1211
1312
1421
152
1621
1720
1833
192
2031

Makro:
Sub Woche_1()
Dim Quell_arr, Ziel_arr
Dim i&
With Tabelle1
  Quell_arr = .Range("J7:J20")
  Ziel_arr = .Range("K7:K20")
  For i = 1 To Ubound(Quell_arr)
    If Ziel_arr(i, 1) < 1 Then Ziel_arr(i, 1) = Quell_arr(i, 1)
  Next
  .Range("K7:K20") = Ziel_arr
End With
End Sub

Ergebnis:
JK
711
822
923
1033
1111
1211
1312
1421
1522
1621
1722
1833
1922
2031

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • veniceline
Antworten Top
#7
Hallo Ralf,

vielen Dank! - das funktioniert bestens.
Antworten Top
#8
Oder:


Code:
Sub M_snb()
   [K7:K20] = [if(K7:K20<1,J7:J20,K7:K20)]
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • veniceline
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste