2016-09-19 3 views
1

Ich versuche, eine Datenbank zu erstellen, die ein Warehouse mit benannten Buchten darstellt. Dies wird Funktionen haben, um Materialien einzuloggen und sie auszuwerten, wenn sie benötigt werden.Excel VBA - wenn die Zelle leer ist, geben Sie etwas ein, sonst geben Sie den Fehler zurück

Meine Arbeitsmappe hat ein Log In Blatt und sieben Blätter mit der Bezeichnung Reihe A bis Reihe G, um die Gänge im Lagerhaus darzustellen. Jeder Gang hat fünf Regale und mehrere Buchten. Diese Information wird verkettet, um eine eindeutige Position zu erhalten. Ich habe derzeit Probleme damit, VBA zu fragen, ob die Position, der ein Material zugewiesen werden soll, leer ist oder nicht, und wenn dies der Fall ist, sollte es Informationen einfügen, die vom Log In-Blatt kopiert wurden. Unglücklicherweise füllt der Code, egal was in meinem Blatt ist, die ActiveCell mit "TRUE" und zeigt die Fehlermeldung an, die ich gefragt habe, wenn sie nicht wahr ist. Ich habe IfEmpty auch mit dem gleichen Ergebnis versucht.

Mein Code sieht wie folgt aus:

Sub LogIn() 

Dim Row As String 
Dim Location As String 

' assign values to variables 
    Worksheets("Log In").Activate 
     Location = Cells(6, 3).Value 
     Row = Cells(3, 3).Value 

' copy new inputs to clipboard 
    Sheets("Log In").Range("C8:C11").Copy 

' find the correct location within the separate racking sheets 
    Sheets("Row " & Row).Activate 
    Selection = Cells.Find(What:=Location, After:=Cells(1, 1), LookIn:=xlFormulas, _ 
     lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
     MatchCase:=False, searchformat:=False).Activate 
    Selection = Sheets("Log In").Cells(6, 3).Value 
    Selection = ActiveCell.Offset(0, 2).Activate 

' check whether location is empty 
    If ActiveCell.Value = "" Then 

' paste new inputs onto racking sheet 
     ActiveCell.PasteSpecial 

' or return an error 
     Else: MsgBox "The location you have selected is currently occupied" 
     End If 

End Sub 

Antwort

3

Sie verwenden Selection falsch. Zuerst werde ich erklären, was passiert, und dann, wie ich es hoffentlich beheben kann.

Wenn schreiben Sie so etwas wie

Selection = "Hello" 

Es die ausgewählten Zellen mit „Hallo“ füllt. Excel kann nicht eingestellt Selection zu „Hallo“, sondern es werden die Werte aller ausgewählten Zellen setzt auf „Hallo“, dh es ist die gleiche wie

Selection.Value = "Hello" 

Sie verwenden Selection = something.Activate und ich nehme an, dass bedeutet, dass Sie möchten, wählen Sie something. Es tut das aber nicht wie du willst.

something.Activate aktiviert (und wählt daher) die Zelle oder den Bereich something. Es gibt auch den booleschen Wert True zurück (ich weiß nicht, wann es zurückgeben würde False, vielleicht kann jemand anderes helfen). Wenn also die Zeile Selection = something.Activate ausgeführt wird, wertet VBA zuerst aus, was sich auf der rechten Seite von befindet, was True zurückgibt (und während dieser Auswertung auch something auswählt). Nun wird Selection.Value auf True gesetzt und something wurde gerade ausgewählt, something.Value wird auf True gesetzt.


Jetzt das Beste, was Sie tun können, ist mit Selection und Activate zu stoppen. Wenn Sie die ActiveCell als eine Art Benutzereingabe verwenden müssen, legen Sie am Anfang der Unterklasse einen Bereich für die ActiveCell fest und verwenden Sie sie bei Bedarf.

Anstatt die ActiveCell die ganze Zeit zu ändern, verwenden Sie Variablen. Etwas wie dieses:

Dim myCell as Range 
'... 
Set myCell = Sheets("Row " & Row).Cells.Find(.... 'You should rename Row because it's already a property of Range. 
myCell.Value = Sheets("Log In").Cells(6, 3).Value 
Set myCell = myCell.Offset(0, 2) 

If myCell.Value = "" Then 
'... 
+0

Das ist wirklich gut zu wissen. Um Zeit zu sparen und umzuschreiben, habe ich es einfach gemacht, indem ich 'Selection =' aus dem 'ActiveCell.Offset' entferne –

Verwandte Themen