2016-11-15 6 views
1

データを頻繁に取得するために使用される動的なスプレッドシート(​​テンプレート)を作成しようとしています。このデータセットでは、取り込まれたデータを勾配/切片値で修正する必要があります。ただし、データが0またはNullの場合は実行されません。です。これは、異なる列のセットポイントを介しreferrencedことができ、「タグ」スロープ&インターセプト値を含むシートにKセル10VBAは列を反復処理し、一致するか一致しない場合に式を適用します。

の値でシート1列Hを言うことができ、列 "のG Sheet1 "には、サーバーから取得したデータが含まれています。簡単にするために、すべての値を10.0にすることができます。ただし、列Gのデータはプロセス条件によって異なる場合があります。

' 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 

いくつかの追加情報、新しいデータを:現在、私はデータをカラムを通過していますし、それが一致したら、それはのような特定の範囲内の元の値に乗算または追加を適用します

以前の、または既存のデータは、データが追加されることを意味するFirstRowおよびLastRow変数であるため、再計算されません。

ありがとうございます!

+0

「ケース選択」が不足しているようですか?それ以外は、あなたの質問は何ですか?セルの内容が '0'または' 'null ''であるかどうかをチェックする方法? – arcadeprecinct

+0

ありがとうございました。私の質問は、その列のデータを調べるときです。セルまたはセルの範囲が「0」または「null」で、処理速度が低下することなく計算を回避するにはどうすればよいですか? – Vanadium

+0

単一のセルの場合は、 'thatcell.Value <> 0なら、そして、そのcell.Value <>" Null "Then ...'を使用してください。範囲については、 "Null"を先に0に置き換え、 'Application.WorksheetFunction.Sum'を使用します(合計が0より大きいかどうかを確認してください)。 – arcadeprecinct

答えて

0

@arcadeprecinctと@ tan-stanleyのおかげで、私はうまく動作するソリューションを見つけることができました。 元のコードを複製しますが、ループと条件付きチェックが組み込まれています。しかし、私はセットポイントデータを含むオフセットカラムでそれを行っています。設定値が0またはNullの場合、既存の値は計算されません。

' 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

もう1つの回避策として、@arcadeprecinctが入力ボックスを置くことに加えて、

たとえば、ユーザーに無視する記号(例:0 x X)、x、X、または0がある場合の組み合わせを入力します。ユーザー入力を分割して配列に挿入します。

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

@arcadeprecinctがコメントした内容を追加するには、配列に基づいてelseを実行します。

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

    'do a check here 

    next x 
next i 

希望します。

+0

Inputboxが不要な場合は、IF a <> 0 OR b <> "x" THEN –

+0

を使用してください。この操作は、* Tags *シートの傾き/切片値が既に乗算と現在の値への加算に使用されますか?そうであれば、特定の較正による切片値に応じて、値は0より大きくなる(Nullではない)ことがあります。具体的な情報が不足している場合は、私に知らせてください。ありがとう! – Vanadium

関連する問題