2016-10-03 3 views
0

Ich mache eine einfache Subtraktion zwischen zwei Zellen, die Daten enthalten, um den Zeitraum zu erhalten. Jedem Client, in Data_p Arbeitsblatt, Bereich ("4"), werden alle Bestelldaten in der jeweiligen Spalte angezeigt. Also wird die Subtraktion zwischen dem zweiten Datum und dem ersten usw. liegen und das Ergebnis wird in Data_p_mgnt eingefügt. Diese Funktion muss ausgeführt werden, bis für jeden Client keine Daten mehr vorhanden sind.Do bis IsEmpty funktioniert nicht, irgendwelche Ideen?

Ich habe den folgenden Code, aber ich weiß nicht, warum es nicht aufhören wird, wenn es findet und leere Zelle in Data_p. Jeder Einblick wird geschätzt.

Sub Prueba_Data_p_mgnt() 

Sheets("Data_p_mgnt").Select 
Range("B5").Select 'Starts in cell B5 

Do Until IsEmpty(Worksheets("Data_p").Range("B5")) 'Checks if cells in Data_p are Empty or Blank 

ActiveCell.FormulaR1C1 = "=Data_p!R[1]C-Data_p!RC" 'Makes the subtraction between cells 
ActiveCell.Offset(1, 0).Range("A1").Select 'Moves down for paste the next period 

Loop 'Loop until there's an Empty cell in Data_p 

'Then should move to next client to the right and repeat until there are no more clients in row 4 

End Sub 
+3

Sie sind immer testen Range ("B5"). Sie ändern B5 nicht in ein leeres Feld, dann wird es für immer eine Schleife durchlaufen. –

+0

Sie testen nicht einmal etwas anderes als 'Range (" B5 ")'. – Comintern

+2

@ScottCraner hat es - lesen Sie durch [wie vermeiden Sie mit '.Select' /' .Activate'] (http://StackOverflow.com/Questions/10714251/how-to-avoid-using-select-in-excel- vba-macros) und wenden Sie an, was Sie lernen, das sollte das Problem entfernen. Um den Code unverändert zu lassen, sollten Sie 'Do Until IsEmpty (ActiveCell) 'verwenden ... aber tun Sie das nicht, verwenden Sie die Bereiche. Schauen Sie einfach nach, wie Sie dynamisch durch Zellen/einen Bereich loopen können. – BruceWayne

Antwort

2

Ich glaube, das ist, was Sie zu tun versuchen:

Sub Prueba_Data_p_mgnt() 
    Dim wsMgnt As Worksheet 
    Dim wsData As Worksheet 
    Dim rowNo As Long 
    Dim colNo As Long 
    Set wsMgnt = Worksheets("Data_p_mgnt") 
    Set wsData = Worksheets("Data_p") 

    colNo = 2 
    Do Until IsEmpty(wsData.Cells(4, colNo)) 'Checks if cells in Data_p are Empty or Blank 

     rowNo = 5 
     Do Until IsEmpty(wsData.Cells(rowNo, colNo)) 'Checks if cells in Data_p are Empty or Blank 
     'Alternatively, to avoid subtracting the last non-blank cell from a blank cell 
     'Do Until IsEmpty(wsData.Cells(rowNo + 1, colNo)) 'Checks if cells in Data_p are Empty or Blank 

      wsMgnt.Cells(rowNo, colNo).FormulaR1C1 = "=Data_p!R[1]C-Data_p!RC" 'Makes the subtraction between cells 
      'Alternatively, if you would rather have values than formulae 
      'wsMgnt.Cells(rowNo, colNo).Value = wsData.Cells(rowNo + 1, colNo).Value - wsData.Cells(rowNo, colNo).Value 

      rowNo = rowNo + 1 'Moves down for paste the next period 
     Loop 'Loop until there's an Empty cell in Data_p 

     colNo = colNo + 1 'Then should move to next client to the right and repeat until there are no more clients in row 4 
    Loop 

End Sub 
+0

Ja! Vielen Dank! –

+0

@ AndréMoraBareira - Ich denke nicht, dass Ihre Logik auf der letzten Zelle in jeder Spalte gut funktioniert (Sie werden das letzte Datum von der folgenden leeren Zelle subtrahieren), also habe ich gerade die Antwort bearbeitet, um eine Alternative zu bieten . – YowE3K

+0

Ja, das ist perfekt, ich hatte vor, eine IF zu verwenden, um diese Nummern zu löschen, aber was Sie vorgeschlagen haben, ist besser –

1

Dies sollte, hoffe ich, den Trick:

Sub Prueba_Data_p_mgnt() 
Dim dataWS As Worksheet 
Dim rng As Range 
Set dataWS = Sheets("Data_p_mgnt") 

Set rng = dataWS.Range("B5") ' what's this? You never use data_p_mgnt cell B5? 

For i = 5 To 100 ' Change 100 to whatever you need 
    If Not IsEmpty(Worksheets("Data_p").Range("b" & i)) Then 'Checks if cells in Data_p are Empty or Blank 
     Worksheets("Data_p").Range("b" & i).FormulaR1C1 = "=Data_p!R[1]C-Data_p!RC" 'Makes the subtraction between cells 
    End If 'Loop until there's an Empty cell in Data_p 
Next i 
End Sub 

Aber bei Ihrem Code suchen, ich weiß nicht, was Sie vorhaben, mit B5 auf dem Data_p_mgnt Blatt auf tun.

+0

Die Daten, die ich verwende, befinden sich in Data_p, beginnend in Zelle B5. Die Subtraktion wird gehen B6-B5, B7-B6, B8-B7, bis es eine leere Zelle gibt. Die Ergebnisse dieser Subtraktionen sind in Data_p_mgnt aufgeführt, beginnend bei Zelle B5. –

Verwandte Themen