2016-12-24 12 views
1

Ich bin totaler Anfänger für Visual Basic und versuchte, alle Werte einer bestimmten Spalte mit vielen zufälligen leeren Zellen zwischen ihnen zu einem anderen Blatt, in einer anderen Spalte ohne leere Zellen, nacheinander zu setzen . Ich habe den Befehl FormulaR1C1 verwendet, anstatt den Wert zu kopieren (weiß nicht, ob dies der intelligente Ansatz dafür ist).Fehler bei Verwendung von Offset

Beim Debuggen erscheint eine Meldung, dass es gibt und Fehler 424, wenn ich versuche, x1 eine Zeile nach unten, in der zweiten Else zu verschieben.

Der Code ist wie folgt:

Sub Copiar() ' ' Copiar Macro ' 

Dim x1, y1 As Object 
Set x1 = Sheets("Hoja1").Cells(1, "C") 
Set y1 = Sheets("Hoja2").Cells(3, "D") 

contador = 0 
10 
If x1 = "" Then 
    x1 = x1.Offset(1, 0) 
    contador = contador + 1 
    If contador < 20 Then 
     GoTo 10 
     Else: GoTo 20 
    End If 
Else: 
    y1.FormulaR1C1 = x1 
    x1 = x1.Offset(1, 0) 
    y1 = y1.Offset(1, 0) 
    contador = contador + 1 
    GoTo 10 End If 

    20 

End Sub 

Jede Hilfe würde geschätzt. Vielen Dank!!!

+0

Ihre Variablendeklarationen entsprechen nicht Ihren Erwartungen. Sie können Ihren Fehler möglicherweise besser ermitteln, wenn Sie 'x1' als Typ' Object' (oder besser: 'Range') anstelle eines Typs' Variant' deklarieren, wie Sie ihn haben. (Da Sie keinen Typ für "x1" angeben, wird standardmäßig die Variante und nicht der Typ des letzten Elements in der Zeile verwendet). Sie sollten auch, nach einer guten Übung, zu 'Tools/Optionen' gehen und die Option 'Erzwingen' der Variablendeklaration auswählen. Dies wird "Option Explicit" oben in Ihrem Modul platzieren (und Sie sollten das in jedem Fall hinzufügen). –

+0

FWIW - Ihr ursprüngliches Problem wird wahrscheinlich verursacht durch das Sagen von 'x1 = x1.Offset (1, 0)' (was dem Äquivalent von 'Sei x1 = x1.Offset (1, 0)') entspricht, aber die Objekte müssen gesetzt sein ', nicht' Let', also solltest du 'Set x1 = x1.Offset (1, 0)' sagen. – YowE3K

Antwort

0

Zusätzlich zu dem, was ich oben in meinem Kommentar geschrieben habe, hier ist eine andere Methode, die Sie zum Kopieren der nicht leeren Zellen in Erwägung ziehen könnte:

Option Explicit 
Sub vbaCopy() 
    Dim x1 As Range, y1 As Range 

With Worksheets("sheet1") 
    Set x1 = .Range(.Cells(1, "C"), .Cells(.Rows.Count, "C").End(xlUp)) 
End With 

Set y1 = Worksheets("sheet2").Cells(3, "D") 
y1.EntireColumn.Clear 

x1.SpecialCells(xlCellTypeConstants).Copy Destination:=y1 

'If you have both constants and formulas, try: 

'With x1 
' Union(.SpecialCells(xlCellTypeConstants), .SpecialCells(xlCellTypeFormulas)).Copy Destination:=y1 
'End With 

End Sub 

genau, welche SpecialCells Argumente Sie hängt davon ab, verwenden, ob Sie Formeln kopieren , Konstanten oder beides. Und die Ergebnisse im Zielbereich werden nur die Werte sein; Formeln werden nicht als solche kopiert.

+0

Hallo Ron, vielen Dank für dein Feedback. Ihr Code funktioniert einwandfrei, und von nun an werde ich die Option Explicit vor jeder meiner Deklarationen verwenden. Danke noch einmal! – Carlos

Verwandte Themen