2017-08-02 2 views
0

In meinem Szenario habe ich vier Spalten, Spalten A-D. Wenn Spalte B irgendeinen Wert enthält, muss die übereinstimmende Zeile in Spalte A so aktualisiert werden, dass sie einen vorbestimmten Wert enthält. Das gleiche Makro wird für die Spalten C und D angewendet I haben Code jetzt, dass dieses Ergebnis erreicht:Excel VBA - Aktualisiere Spalte A mit einem Wert, wenn Spalte B einen Wert enthält. Wenn Spalte B keine Werte enthält, führen Sie das Makro nicht

Sub Update_Column_Based_On_Column_Value1() 
On Error Resume Next 
    Dim ws As Worksheet 
    Dim lRow As Long 

    Set ws = ThisWorkbook.Sheets("Sheet1") 

    With ws 
     lRow = .Range("B" & .Rows.Count).End(xlUp).Row 

     .Range("A1:A" & lRow).SpecialCells(xlCellTypeBlanks).Formula = "=If(B1<>"""",""PREDETERMINED VALUE"","""")" 
     .Range("A1:A" & lRow).Value = .Range("A1:A" & lRow).Value 
    End With 
End Sub 

Wenn Spalte B einen Wert enthält, wird das Makro „vorbestimmten Wert“ in der entsprechenden Zelle in der Spalte A. schreiben

Ein Problem tritt auf, wenn eine Spalte überhaupt keine Werte enthält. Was passiert, ist, dass das Makro meinen neuen Wert in fast alle leeren Zellen im gesamten Datensatz schreibt.

Vielen Dank im Voraus für Ihre Zeit! Ich entschuldige mich, wenn meine Frage noobish ist, ich bin immer noch sehr neu in VBA.

+0

ich nicht ganz das Problem verstehen, aber ich glaube, Sie müssen diese Zeilen ändern, wie Sie es auf den Werten in A statt B 'lRow = .Range („A“& .Rows basieren sollen. Count) .End (xlUp) .Row' – SJR

+0

Ein anderes Problem ist, dass sich die erste Instanz Ihrer Formel auf B1 bezieht, aber das Leerzeichen möglicherweise nicht in Zeile 1 ist. – SJR

+0

Hallo, @SJR Es tut mir leid, wenn meine Anforderungen nicht waren Ich habe klar genug gesagt, dass ich Screenshots von dem liefern kann, was ich erreichen möchte. Ihre Änderung an dem Code war nicht das, was ich gesucht habe. Als ich es ausführte, war die Codeaktualisierungsspalte A, obwohl Spalte B leer war. – UserX

Antwort

0

Die Verwendung von If WorksheetFunction.CountA(ws.Range("B:B")) = 1 im Kommentarbereich, um das Problem zu vermeiden, ist ein guter Versuch, aber es kann Ausnahmen geben, wie unten diskutiert. Testen Sie es mehrmals mit verschiedenen Szenarien (insbesondere mit Leerzeichen), um zu sehen, ob Sie jedes Mal das gewünschte Ergebnis erhalten.

.SpecialCells versucht, die Codes zu vereinfachen, jedoch irgendwann the .SpecialCells(xlCellTypeBlanks) VBA function does not work as expected in Excel.

Auch sollte die Aussage On Error Resume Next so weit wie möglich nicht verwendet werden. Aber wenn Sie müssen, stellen Sie sicher, dass Sie die On Error GoTo 0 Anweisung so schnell wie möglich einfügen, da Sie andere Fehler nicht maskieren möchten.

Anstelle von .SpecialCells können Sie For Each Schleife verwenden, um dieses Problem zu vermeiden. Mal sehen, wie es aussieht:

Sub Update_Column_Based_On_Column_Value1() 
    Dim ws As Worksheet, lRow As Long, r As Range 
    Set ws = ThisWorkbook.Sheets("Sheet1") 
    With ws 
     lRow = .Range("B" & .Rows.Count).End(xlUp).Row 
     For Each r In .Range("A1:A" & lRow) 
      If IsEmpty(r) Then 
       r.Formula = "=If(B" & r.Row & "<>"""",""PREDETERMINED VALUE"","""")" 
       r = r.Value 
      End If 
     Next 
    End With 
End Sub 
+0

Vielen Dank für den Beitrag, aber ich fand eine Lösung, die für mich funktioniert. Ich habe mehrere Szenarien getestet und es funktioniert jedes Mal. Bitte überprüfen Sie es und hinterlassen Sie Feedback, wenn Sie möchten! – UserX

+0

sry mate es nicht. pl siehe [screenshot] (https://i.stack.imgur.com/QhjuJ.png). nur Daten vor dem Makro-Lauf waren in der Zelle "G7". Nach dem Makro-Lauf wurde der gesamte Bereich A1: G7 mit Ausnahme der Zelle G7 mit Nullen aufgefüllt. Wie auch immer, es ist Ihre Entscheidung, solange Sie sich des damit verbundenen Risikos bewusst sind – curious

0

Hier ist die Antwort jeder!

Sub Update_Column_Based_On_Column_Value_1() 
    On Error Resume Next 
     Dim ws As Worksheet 
     Dim lRow As Long 

     Set ws = ThisWorkbook.Sheets("Sheet1") 

     If WorksheetFunction.CountA(ws.Range("B:B")) = 1 Then 

     Else 

      With ws 
       lRow = .Range("B" & .Rows.Count).End(xlUp).Row 
       .Range("A1:A" & lRow).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=If(LEN(RC2),""NEW TEXT HERE"", TEXT(,))" 
       .Range("A1:A" & lRow).Value = .Range("A1:A" & lRow).Value 
      End With 
     End If 
    End Sub 
Verwandte Themen