2017-05-18 1 views
2

Einfügen ich zur Zeit Fragen, mit denen bin, und ich habe keine Ahnung, warum ..VBA Type Mismatch (Laufzeitfehler 13), wenn eine ganze Reihe von Daten

Private Sub Worksheet_Change(ByVal Target As Range) 
If Intersect(Target, Columns("B:B")) Is Nothing Then Exit Sub 

If Target.Value = "Yes" Then 
    Range(Range("A" & Target.Row), Range("I" & Target.Row)).Copy _ 
    Sheets("UpdateModify Forms").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) 
    Range(Range("AC" & Target.Row), Range("AU" & Target.Row)).Copy _ 
    Sheets("UpdateModify Forms").Range("J" & Rows.Count).End(xlUp).Offset(1, 0) 

ElseIf Target.Value = "No" Then 
    Range(Range("A" & Target.Row), Range("AB" & Target.Row)).Copy _ 
    Sheets("Development Forms").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) 
    Range(Range("AW" & Target.Row), Range("AY" & Target.Row)).Copy _ 
    Sheets("Development Forms").Range("AC" & Rows.Count).End(xlUp).Offset(1, 0) 

End If 
End Sub 

Der Fehler auf

zeigt
If Target.Value = "Yes" Then 

Wie sollte es funktionieren:

wenn ich fügen sie eine Zeile mit Daten gefüllt, die von rechts sollte es für die Kriterien überprüfen wheter es Ja oder Nein, und es zu ihrem dist Sortier- inaktives Blatt.

ABER

Es schien die Laufzeit Fehler 13 aus irgendeinem Grund .. ich nur wissen, wie es zu umgehen, welche manuell in ist, Daten eingeben und die Spalte zu vermeiden, wo es die Validierung auslösen ersten und Schlüssel in anderen Daten zuerst und schließlich diese Validierungsspalte.

Noch eine Frage:

Gibt es trotzdem das Ganze ohne mich drucken die Validierung Spalte Eingabe an? Weil ich versuchte, die Validierungsspalte zuerst zu betätigen, und wenn ich fortfahre, die Reihe neben ihm aufzufüllen, zeigt es nicht auf dem folgenden Blatt an, nur Anzeige "Ja" oder "Nein" Welches ist die Spalte B

Irgendwelche Hilfe würde sein geschätzt, danke für die Zeit!

+0

hinzufügen Uhr auf Target.Value und sieht, was seine Art ist. – jivko

+0

Probieren Sie 'Columns (2)' oder 'Columns (" B ")' – 0m3r

+0

Versucht mit 'Wenn Schnitt (Ziel, Spalten (2)) ist nichts, dann Exit Sub' und 'Wenn Schnittpunkt (Ziel, Spalten ("B")) Ist nichts, dann Exit Sub ', aber immer noch den gleichen Fehler und gleiche gelb markiert auf der' If Target.Value = "Ja" Dann ' – ZQ7

Antwort

4

Wenn Sie eine ganze Zeile aktualisieren, wird Target eine ganze Zeile sein. Sie können nicht testen, ob eine ganze Zeile "Ja" ist - Sie müssen sich eine einzelne Zelle ansehen.

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Columns("B")) Is Nothing Then Exit Sub 
    Dim cel As Range 
    For Each cel In Intersect(Target, Columns("B:B")).Cells 
     If cel.Value = "Yes" Then 
      Range(Range("A" & cel.Row), Range("I" & cel.Row)).Copy _ 
        Sheets("UpdateModify Forms").Range("A" & Sheets("UpdateModify Forms").Rows.Count).End(xlUp).Offset(1, 0) 
      Range(Range("AC" & cel.Row), Range("AU" & cel.Row)).Copy _ 
        Sheets("UpdateModify Forms").Range("J" & Sheets("UpdateModify Forms").Rows.Count).End(xlUp).Offset(1, 0)  
     ElseIf cel.Value = "No" Then 
      Range(Range("A" & cel.Row), Range("AB" & cel.Row)).Copy _ 
        Sheets("Development Forms").Range("A" & Sheets("Development Forms").Rows.Count).End(xlUp).Offset(1, 0) 
      Range(Range("AW" & cel.Row), Range("AY" & cel.Row)).Copy _ 
        Sheets("Development Forms").Range("AC" & Sheets("Development Forms").Rows.Count).End(xlUp).Offset(1, 0)  
     End If 
    Next 
End Sub 

Was die andere Frage, ob es einen Weg gibt, diesen Prozess haben erst nach der ganzen Reihe gefüllt ist, würde ich vorschlagen, Sie auf eine Schaltfläche und haben die Benutzer auf die Schaltfläche klicken, wenn sie fertig sind - So vermeiden Sie ein Worksheet_Change Ereignis. Oder machen Sie zumindest die letzte Spalte, die die Change auslöst.


Als Antwort auf einen Kommentar Werte anfordernden:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Columns("B:B")) Is Nothing Then Exit Sub 
    Dim cel As Range 
    For Each cel In Intersect(Target, Columns("B:B")).Cells 
     If cel.Value = "Yes" Then 
      With Sheets("UpdateModify Forms") 
       With .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0).EntireRow 
        .Range("A1:I1").Value = Rows(cel.Row).Range("A1:I1").Value 
       'I commented out the next two lines because I assume the 
       'last row in column A should be the same as the last row 
       'in column J - uncomment them if that is not the case. 
       'End With 
       'With .Range("J" & .Rows.Count).End(xlUp).Offset(1, 0).EntireRow 
        .Range("J1:AB1").Value = Rows(cel.Row).Range("AC1:AU1").Value 
       End With 
      End With 
     ElseIf cel.Value = "No" Then 
      With Sheets("Development Forms") 
       With .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0).EntireRow 
        .Range("A1:AB1").Value = Rows(cel.Row).Range("A1:AB1").Value 
       'End With 
       'With .Range("AC" & .Rows.Count).End(xlUp).Offset(1, 0).EntireRow 
        .Range("AC1:AE1").Value = Rows(cel.Row).Range("AW1:AY1").Value 
       End With 
      End With 
     End If 
    Next 
End Sub 
+0

Omg es funktioniert! Danke vielmals! aber es gibt eine kleine Änderung, die zu tun ist, wenn die 'Wenn schneiden (Ziel, Spalten ("B: B")) Nichts ist, dann Exit Sub', die Spalten ("B: B") geändert zu Spalten ("B") – ZQ7

+0

@ user7809596 - Hoppla - Ich hatte nicht bemerkt, dass die erste Aussage eine einzeilige 'If' war - habe die Antwort entsprechend bearbeitet. Anmerkung: Es gibt keinen Unterschied zwischen 'Spalten (" B: B ")' und 'Spalten (" B ")' und 'Spalten (2)' - sie alle bedeuten dasselbe. – YowE3K

+0

@ user7809596 Ich genehmigte Ihre Bearbeitung (die meine Mine klopfte, wo ich den Fehler aufgrund der einzeiligen "If" reparierte) und dann "verbesserte" sie zurück, wie es war - ich wollte nicht, dass Sie eine "Ablehnung" bekommen "aufgenommen gegen deinen Namen - weil du den Schnitt eingereicht hast, bevor ich erwähnt habe, dass es nicht anders ist als das, was ich hatte. – YowE3K

0

Wenn mehrere Zellen ausgewählt sind, wäre es ein Fehler, wenn Sie versuchen, target.value zu verwenden. Verwenden Sie wenn selection.cells.count > 1.

0

Zuerst schlage ich die Kreuzung in eine Variable vorbei,

Dim MyTarget as range 
Set MyTarget = Intersect(Target, Columns("B:B")) 

Weiter zu überprüfen, ob es eine Kreuzung durch,

If MyTarget Is Nothing Then Exit Sub 

Yo u kann nun Schleife durch diese Variable

Dim EachCell as Range 
For Each EachCell in MyTarget 
'do your thing here 
Next 

-Romcel

Verwandte Themen