2017-01-12 5 views
0

Ich habe ein Makro in Excel, die funktioniert aber nicht perfekt, wie ich es will.Könnte keine Lösung finden und brauche Ihre Ideen.Excel Makro kopieren einfügen mit Bedingungen

Hier ist, was es ist: Kopieren von Einstellungen Paste Werte an die erste nicht leere Zelle in der Berechnung sheet.It tut ok

Hier wird die für dieses ist mein Code:

Sub support() 
Sheets("Settings").Select 
Range("S411:S421").Select 
Selection..Copy 
Sheets("Calculation").Select 
Range("C4").Select 
Range("C4").End(xlDown).Offset(1, 0).Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
End Sub 

Aber was ich will um nur nicht leere Zellen und Werte, die nicht 0 sind, in die Berechnungsseite zwischen diesen 10 Zeilen zu kopieren. (also sollte ich das Kopieren von 0 und leeren Zellen überspringen) Jeder einfache Trick, den Sie mir leiten können?

Antwort

0

könnten Sie AutoFilter() verwenden

Sub support() 
    With Sheets("Settings").Range("S410:S421") '<--| reference wanted range and the cell above it as the "header" 
     If IsEmpty(.Cells(1, 1)) Then .Cells(1, 1).Value = "dummyheader" '<--| add a "dummy" header value if it's empty 
     .AutoFilter Field:=1, Criteria1:="<>", Operator:=xlAnd, Criteria2:="<>0" '<--| filter referenced range with "not empty" and "not zero" values 
     If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then 
      .Resize(.Rows.Count - 1, 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy 
      Sheets("Calculation").Range("C4").End(xlDown).Offset(1, 0).PasteSpecial xlPasteValues 
      Application.CutCopyMode = False 
     End If 
     If .Cells(1, 1).Value = "dummyheader" Then .Cells(1, 1).ClearContents '<--| remove "dummy" header, if there 
     .Parent.AutoFilterMode = False 
    End With 
End Sub 
+0

wowwww das ist tolle Idee und funktioniert perfekt. Ich bin wütend auf mich selbst, ich dachte nicht Autofilter :( – ahmet

+0

nur hinzufügen, dass, wenn Sie sicher wissen, dass S410 Zelle _always_ nicht leer ist, dann können Sie beide weglassen "Wenn IsEmpty (.Cells (1, 1)) Then .Cells (1, 1) .Value = "dummyheader" 'und' If .Cells (1, 1) .Value = "dummyheader" Dann .Cells (1, 1) .ClearContents' Statements – user3598756

+0

Vielen Dank, wahrscheinlich wird es nicht sein leer aber kann nicht sicher sein. Ich werde im Laufe der Zeit sehen und dies im Kopf behalten, danke nochmal. – ahmet

0

Möchten Sie von Range("S411:S421") zu Range("C4")..-> jedes Mal kopieren? Oder diese Bereiche können geändert werden?

TRY:

Public Sub CommandButton1_Click() 
j = 4 
For i = 411 To 421 

If ThisWorkbook.Sheets("Settings").Cells(i, 19) <> 0 And ThisWorkbook.Sheets("Settings").Cells(i, 19) <> "" Then 
ThisWorkbook.Sheets("Settings").Cells(i, 19).Copy 

ThisWorkbook.Sheets("Calculation").Cells(j, 3).PasteSpecial (xlPasteValues) 
j = j + 1 
End If 


Next i 
End Sub 
+0

ja ich jedes Mal denselben Zellen und Bereiche kopieren möchten ändern sich nicht. aber die Reihe änderte sich an der Stelle, an der ich vorbeikam. – ahmet

+0

Bereich ("S411: S421"), wo ich kopiere enthält Formeln also aus diesem Grund gibt es jedes Mal unterschiedliche Werte. – ahmet

+0

Ja, wenn Sie zum Beispiel (10,0, -, 0, -, 45,78,96,0, -, 121) im Bereich S411: S421 haben, wollen Sie haben (10,45,78,96,121) in C4 und runter, yop? –

Verwandte Themen