2016-11-15 7 views
1

Ich versuche, eine dynamische Tabelle (Vorlage) zu erstellen, die zum häufigen Abrufen von Daten verwendet wird. In diesem Datensatz muss ich die abgerufenen Daten mit Steigungs-/Schnittpunktwerten korrigieren. Jedoch würde Ich möchte keine Berechnungen durchgeführt haben, wenn die Daten entweder 0 oder Null sind. Dies könnte auch durch einen Sollwert in einer anderen Spalte referrenced werden, lässt Sheet1 Spalte H sagen, mit einem Wert von 10.VBA durchläuft Spalten und wendet eine Formel an, wenn sie übereinstimmt (oder nicht übereinstimmt)

Die K-Zellen in Sheet „Stichworte“ die Steigung & Abschnittswerte enthalten, Spalte G von " Sheet1 "enthält Daten von einem Server abgerufen. Der Einfachheit halber lassen wir sie alle 10.0 als Wert haben. Die Daten in Spalte G können jedoch aufgrund von Prozessbedingungen variieren.

Derzeit durch die Spalten mit Daten Ich werde und wenn es passt, wird es eine Multiplikation oder zusätzlich zu den ursprünglichen Werten in einem bestimmten Bereich als solche gelten:

' Declare vars 
Dim FirstRow As Integer 
Dim LastRow As Integer 
Dim Number As Integer 
Dim fndStr As String 
Dim sht As Worksheet 

' Init vars 
Set sht = ThisWorkbook.Worksheets("Sheet1") 
LineText = "" 
Number = 0 
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 

' Loop through colums till fndStr is found 
Do While Not fndStr = "lastWord" 
    fndStr = Sheets("Sheet1").Range("A1").Offset(0, Number) 
    Select Case fndStr 
    Case Var1: 
     Sheets("Tags").Range("K7").Copy 
     Sheets("Sheet1").Range("G" & FirstRow & ":G" & LastRow).PasteSpecial xlPasteValues, xlPasteSpecialOperationMultiply 
     Sheets("Tags").Range("K6").Copy 
     Sheets("Sheet1").Range("G" & FirstRow & ":G" & LastRow).PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd 
     Number = Number + 1 
    Case "lastWord": Exit Do 
    Case Else: Number = Number + 1 
    End Select 
Loop 

einige zusätzliche Informationen, wenn neue Daten Wird gezogen, werden die vorherigen oder bereits vorhandenen Daten nicht neu berechnet, für diese sind die FirstRow- und LastRow-Variablen gemeint, an die Daten angehängt werden.

Vielen Dank im Voraus!

+0

Sie scheinen ein 'Select Case' zu ​​verpassen? Abgesehen davon, was genau ist deine Frage? Wie überprüft man, ob ein Zelleninhalt "0" oder "null" ist? – arcadeprecinct

+0

Vielen Dank, dass Sie die fehlende SELECT-Anweisung bemerkt haben. Meine Frage ist, wenn ich durch die Daten in dieser Spalte gehe, wie kann ich eine Berechnung vermeiden, wenn eine Zelle oder ein Bereich von Zellen "0" oder "Null" ist, ohne (signifikante) Verarbeitungsgeschwindigkeit zu verlieren? – Vanadium

+0

Für eine einzelne Zelle verwenden Sie einfach 'If thiscell.Value <> 0 Und thatcell.Value <>" Null "Then ...'. Für einen Bereich würde ich "Null" 'vorher durch 0 ersetzen und' Application.WorksheetFunction.Sum' verwenden (prüfen ob die Summe> 0 ist) – arcadeprecinct

Antwort

0

Dank @arcadeprecinct und @ tan-stanley konnte ich eine Lösung finden, die für mich akzeptabel ist. Es repliziert den ursprünglichen Code, aber enthält die Schleife und die bedingte Überprüfung. Allerdings habe ich es in der Offset-Spalte gemacht, die die Solldaten enthält. Wenn der Sollwert 0 oder Null ist, werden keine Berechnungen an vorhandenen Werten durchgeführt.

' Declare vars 
Dim Slope As Double 
Dim Intercept As Double 

Dim Number As Integer 

Dim cellValue As Range 
Dim dataRange As Range 

Dim FirstRow As Integer 
Dim LastRow As Integer 
Dim Number As Integer 
Dim fndStr As String 
Dim sht As Worksheet 

' Init vars 
Set sht = ThisWorkbook.Worksheets("Sheet1") 
fndStr = "" 
Number = 0 
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 

' Loop through colums till fndStr is found 
Do While Not fndStr = "lastWord" 
fndStr = Sheets("Sheet1").Range("A1").Offset(0, Number) 
Select Case fndStr 
Case Var1: 
     Slope = Sheets("Tags").Range("H7").Value 
     Intercept = Sheets("Tags").Range("H6").Value 
     Set dataRange = Sheets("R1").Range("G" & FirstRow & ":G" & LastRow) 

     For Each cellValue In dataRange 
     If cellValue.Offset(0, 1).Value <> 0 And cellValue.Offset(0, 1).Value <> "Null" Then 
      cellValue.Value = cellValue.Value * Slope + Intercept 
     End If 
     Next cellValue 

     Number = Number + 1 
Case "lastWord": Exit Do 
Case Else: Number = Number + 1 
End Select 
Loop 
0

Eine andere Problemumgehung, zusätzlich zu dem, was @arcadeprecinct kommentierte, ist ein Eingabefeld.

Zum Beispiel, Benutzer zu Schlüssel in Notationen zu Ignorieren (Beispiel: 0 x X), alle Kombinationen, nur für den Fall, dass es X, X oder 0 ist. Benutzereingabe teilen und in ein Array einfügen.

Dim userInput as String 
Dim allInputs as Variant 
userInput= InputBox("Key in notation to ignore.") 
allInputs = Split(Split(Trim(userInput), " ") 

Hinzufügen auf, was kommentiert @arcadeprecinct, tun ein, wenn sonst basierend auf dem Array.

for i = 1 to lastRow 
    for x = 0 to Ubound(allInputs) 

    'do a check here 

    next x 
next i 

Ich hoffe, es hilft.

+0

Wenn Inputbox nicht notwendig ist, dann benutze ein IF a <> 0 ODER b <> "x" DANN –

+0

bin ich richtig in der Annahme, dass diese Operation ausgeführt wird, nachdem die Steigung/Schnittpunktwerte vom * Tags * Blatt bereits sind Wird für die Multiplikation und Addition zu den aktuellen Werten verwendet? Wenn dies der Fall ist, ist der Wert möglicherweise höher als 0 (nicht Null), abhängig vom Schnittpunktwert der spezifischen Kalibrierung. Wenn Sie Einzelheiten vermissen, lassen Sie es mich bitte wissen. Vielen Dank! – Vanadium

Verwandte Themen