VBA迭代列并在匹配(或不匹配)

时间:2016-11-15 13:35:53

标签: excel vba excel-vba

我正在尝试创建一个动态电子表格(模板),它将用于频繁获取数据。在此数据集中,我必须使用斜率/截距值更正所获取的数据。但是, 如果数据为0或Null ,我希望不执行任何计算。这也可以通过不同列中的设定值引用,比如Sheet1 Column H,值为10.

Sheet“ Tags ”中的K个单元格包含斜率&拦截值,“ Sheet1 ”的列G包含从服务器提取的数据。为简单起见,让我们将它们都作为一个值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变量意味着附加了哪些数据。

提前致谢!

2 个答案:

答案 0 :(得分:0)

另外一个解决方法是,除了@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评论的内容,根据数组执行if else。

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

     'do a check here

   next x
next i

希望它有所帮助。

答案 1 :(得分:0)

感谢@arcadeprecinct和@tan-stanley,我找到了一个可供我使用的解决方案。 它复制原始代码,但包含循环和条件检查。但是我在包含设定值数据的偏移列上完成了它。如果设定值为0Null,则不会对现有值执行任何计算。

' 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