VBA宏将错误的数据复制到单元格

时间:2011-05-12 12:45:02

标签: excel vba extract

这就是我想要做的事情:

如果J包含“被告”一词 和 如果F包含止赎一词 然后 如果G包含“V ESTATE OF” 然后将所有内容保留在“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

使用上面的宏,在某些情况下,正确的值永远不会粘贴到N中。而是来自K中另一个单元格的值被粘贴到N中的错误单元格。

我在以下链接中附加了excel电子表格的示例,我从未收到过回复:

http://www.excelforum.com/excel-programming/775695-wrong-data-copied-into-new-cell-from-macro.html

感谢您的回复。

2 个答案:

答案 0 :(得分:1)

您的LValue和LValue2变量正在有条件地填充(即,不是每次都通过循环),但是您的最后一个块每次都会被执行,所以有理由认为有时候通过循环,你正在使用值。

您需要在循环开始时清除它们,否则在LValue和LValue2 ELSE块中都有一个IF子句来处理该场景。

根据您的评论进行修改:在此方案中,我更倾向于使用MID()RIGHT(),因此我们可以更轻松地获得正确的数学计算左边(这是InStr()返回的值):

cellText = Range("K" & i).Value
LValue = Mid(cellText, Unknown + 18, 100)

一些补充说明:

  • 你多次使用它,把测试的值放到像我上面那样的变量中。它甚至可能稍微快一点,而不是每次都返回工作表。
  • 我更喜欢将Cells(11, i).Value用于Range("K" & i).Value。使用相同的行或列号更容易使用。
  • 通常以您完成的方式工作,但请确保使用范围对象的正确属性Range().Value或{{1或者其他)而不是仅仅依靠“默认属性”来保持正确。

答案 1 :(得分:1)

检查下划线时,您正在测试最后字符是否为下划线。您的问题表明您要测试值是否以下划线开始

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

尝试

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