VBAmacros将错误的数据复制到单元格
这是我想要做的:
如果J包含“被告”一词并且如果“F”包含“Foreclosure”这个词,那么如果G包含“V”,那么将所有内容都保留在“OF”的右边否则如果G包含“VS”则将所有内容保留在“VS”如果G包含“V”(注意V之前和之后的空格)然后将所有内容保留在“V”
如果K包含“”(两个连续的空格)然后保留它或者如果K包含“UNKNOWN SPOUSE OF”然后删除单元格的最后一个字符,这将是一个逗号如果单元格以下划线开始然后删除它然后保留它
将G的结果分配给相应的N单元将K的结果分配给相应的O单元
这就是我所做的:
Sub Inspect() Dim RENums As Object Dim RENums2 As Object Dim LValue As String Dim LValue2 As String Set RENums = CreateObject("VBScript.RegExp") Set RENums2 = CreateObject("VBScript.RegExp") RENums.Pattern = "DEFENDANT" RENums2.Pattern = "FORECLOSURE" Dim lngLastRow As Long lngLastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row Dim i For i = 1 To lngLastRow If RENums2.test(Range("F" & i).Value) Then If RENums.test(Range("J" & i).Value) Then pos = InStr(Range("G" & i), " V ") pos2 = InStr(Range("G" & i), " VS ") pos3 = InStr(Range("G" & i), " V ESTATE OF ") dbspace = InStr(Range("K" & i), " ") If pos3 <> 0 Then LValue2 = Right(Range("G" & i), Len(Range("G" & i)) - pos * 2) ElseIf pos <> 0 Then LValue2 = Right(Range("G" & i), Len(Range("G" & i)) - pos - 2) ElseIf pos2 <> 0 Then LValue2 = Right(Range("G" & i), Len(Range("G" & i)) - pos - 2) End If If dbspace <> 0 Then LValue = Range("K" & i) End If schr = Right(LValue, 1) If schr = "_" Then With WorksheetFunction Range("N" & i).Value = Trim(.Substitute(LValue, "_", "")) End With Else Range("N" & i).Value = Trim(LValue) End If Range("O" & i).Value = Trim(LValue2) End If End If Next i End Sub
使用上面的macros,在某些情况下,正确的值不会粘贴到N中。 相反,来自K中另一个单元的值被粘贴到N中的错误单元上。
我在下面的链接上附加了一个excel电子表格的例子,我从来没有收到回复:
http://www.excelforum.com/excel-programming/775695-wrong-data-copied-into-new-cell-from-macro.html
感谢您的回应。
你的LValue和LValue2variables被有条件地填充(也就是说,不是每次都通过循环),但是你的最后一个块是每次都执行的,所以它有理由说,在循环中有一段时间,你正在使用一个旧的LValue值,或者LValue2(或两者)。
您需要在循环开始时将其清除,否则,在您的LValue和LValue2 IF
块中都有一个ELSE
子句来处理这种情况。
基于你的评论编辑 :我更喜欢在这种情况下使用MID()
RIGHT()
,因为我们从左边开始计数(这是InStr()
返回的值):
cellText = Range("K" & i).Value LValue = Mid(cellText, Unknown + 18, 100)
一些额外的说明:
- 你多次使用它,把testing的值放入像上面那样的variables中。 它甚至可能稍微快一点,而不是每次都回到工作表。
- 我更喜欢使用
Cells(11, i).Value
toRange("K" & i).Value
。 工作原理相同,但使用variables行号或列号会更容易。 - 它通常以你所做的方式工作,但要确保使用范围对象(
Range().Value
或Range().Formula
或其他)的正确属性 ,而不是仅依赖于“默认属性”是正确的。
检查下划线时,您正在testing最后一个字符是否是下划线。 你的问题指出你想要testing这个值是否以下划线开头。
schr = Right(LValue, 1) If schr = "_" Then
尝试
schr = Left(LValue, 1) If schr = "_" Then