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 to Range("K" & i).Value 。 工作原理相同,但使用variables行号或列号会更容易。
  • 通常以你所做的方式工作,但要确保使用范围对象( Range().ValueRange().Formula或其他)的正确属性 ,而不是仅依赖于“默认属性”是正确的。

检查下划线时,您正在testing最后一个字符是否是下划线。 你的问题指出你想要testing这个值是否以下划线开头。

 schr = Right(LValue, 1) If schr = "_" Then 

尝试

 schr = Left(LValue, 1) If schr = "_" Then