Excel Mac VBA Loop Through Cells und einige Werte zurücksetzen

2579
Dru Darby

Ich habe derzeit 12 Exemplare eines Arbeitsbuchs - eines für jeden unserer Standorte. Es gibt mehrere Spalten und eine Zeile für jeden Tag des Monats. Der Location Manager füllt jeden Tag zwei Spalten aus und der Rest wird automatisch berechnet. Es gibt ein paar "komplizierte" Benutzer, die sich weigern, in der zweiten Spalte eine Null einzugeben, wenn für diesen Tag kein Betrag vorhanden ist, und sie leer lassen und Fehler im Arbeitsblatt verursachen.

In Spalte A wird immer ein Wert für jeden Tag angezeigt. Ich möchte also ein Makro ausführen, wenn die Benutzer auf "Speichern" klicken, um die Spalte A auf einen Wert zu überprüfen. Wenn es einen Wert gibt, bedeutet das, dass dieser Tag vergangen ist, und SOLLTE ein Wert in Spalte D sein (auch wenn es Null ist).

Um das zusammenzufassen, wenn Spalte A nicht leer ist, überprüfen Sie Spalte D. Wenn es leer ist, füllen Sie es mit einer Null. Wenn es nicht leer ist, hat der Benutzer einen Wert eingegeben, sodass wir fortfahren können. Wenn es zu einer Zelle in Spalte A kommt, die leer ist, beenden Sie einfach den gesamten Prozess.

Ich habe ein paar Tage im Internet gesucht und versucht, das herauszufinden, und hier ist das, was ich bis jetzt gemacht habe:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim curCell As Range 'Labor Flow Sheet'.Select  For Each curCell in Range(A1:D31) If curCell.Value = "" Then <???????> End If Next curCell End Sub 

Ich habe den Bereich auf den gesamten Bereich eingestellt, aber ich weiß nicht, wie ich wissen kann, dass die Schleife nur Spalte A überprüft. Sollte der Bereich (A1: A31) sein? Wie kann ich dann sagen, dass in derselben Zeile in Spalte D übersprungen werden soll, um diesen Wert zu überprüfen?

Ich schätze wirklich die Hilfe von jemandem im Voraus. Ich hoffe, in dieser Community etwas helfen zu können und andere Fragen zu beantworten, wo immer ich kann!

Danke noch einmal

2

1 Antwort auf die Frage

1
Tom D

Ich hatte keine Gelegenheit, dies zu testen, aber es sollte funktionieren. Alles, was Sie tun müssen, ist, Ihre eigene Arbeitsmappe und den Namen der Arbeitsblätter hinzuzufügen.

Sub test() Dim Ws As Worksheet Dim X As Long  Application.ScreenUpdating = False Set Ws = Workbooks("").Sheets("Sheet1") ' add your workbook here  For X = 1 To Ws.Range("A" & Rows.Count).End(xlUp).Row If Not Ws.Cells(X, 1).Value = vbNullString Then If Ws.Cells(X, 4).Value = vbNullString Then  Ws.Cells(X, 4).Value = "0"  End If  ElseIf Ws.Cells(X, 1) = vbNullString Then  Exit Sub  End If Next X  Application.ScreenUpdating = True End Sub 

Abhängig von der Größe Ihrer Arbeitsmappe denke ich, dass es sich lohnt, die Bildschirmaktualisierung zu deaktivieren, aber es ist keine Notwendigkeit, auch VbNullString zu verwenden.

Ich hoffe es hilft,

Tom

Thanks so much Tom! Thats the direction I needed! Can you tell me how to have it not start until row 5? I have some header information in rows 1-4 that I want to bypass. Thanks so much again! Dru Darby vor 10 Jahren 0
Kein Problem, wenn Sie in Zeile 10 X = 1 in X = 5 ändern, wird die Schleife in Zeile 5 gestartet. Tom D vor 10 Jahren 0