复制并重新排列包含字母和数字单元格的特定数据

我有一个excel表单,数据和字母在整个列B和C中随机排列。我还有一个位于单元格“O7”中的input单元和位于“P7”中的输出单元,用户可以在其中input任何值(1, 1a,2,2b等),代码将使用这些值来查找并复制A中的值

我的代码(下面)遍历并根据“O7”中的值findB中的值,并将该行的相应值(2次)复制到“Sheet4”中。 然后,它查找列C中的下一个单元格,并使用该值查找具有该值的列B中的下一行。 然后它将列A中的那个行的值复制到前一个下面的表4中。

我的问题是我的代码不能区分“1”和一个像“1a”这样的字母作为input或输出值。 它只是看到有一个“1”,并在A中复制该值。我相信我可能不会将我的NewStartvariables设置为下一个要正确查找的值,或者我的函数可能会缺less区分“1”和“ 1A“?

Sub NewerFind() Dim Startval As Long Dim Endval As Long Dim LastRow As Long Dim Rng As range Dim Output As Long Dim NewStart As Long Dim Val As Long Dim Valnew As Long LastRow = Sheets("Sheet3").range("B" & Rows.Count).End(xlUp).Row Startval = GetSingleFromString(Sheets("Sheet3").Cells(7, "O").Value) Output = 2 NewStart = Startval For X = 7 To LastRow Val = GetSingleFromString(Sheets("Sheet3").Cells(X, 2).Value) 'if i set the variables equal to a string, do i need the GetSingleFromString function? Valnew = GetSingleFromString(Sheets("Sheet3").Cells(X, 3).Value) Endval = GetSingleFromString(Worksheets("Sheet3").Cells(7, "P").Value) If Val = Endval Then Exit Sub ElseIf Val = NewStart Then Sheets("Sheet4").Cells(Output, 1).Value = _ Sheets("Sheet3").Cells(X, 1).Value Output = Output + 1 Sheets("Sheet4").Cells(Output, 1).Value = _ Sheets("Sheet3").Cells(X, 1).Value Output = Output + 1 NewStart = Valnew End If 'need line of code to set NewStart as the value of the cell to the right...??????? Next X End Sub 

这是我用来使代码包含字母单元格的函数。 没有它,它会跳过字母的单元格:

 Private Function GetSingleFromString(ByVal InString As String) As Single If Len(InString) <= -1 Then GetSingleFromString = -1 Exit Function End If Dim X As Long Dim Temp1 As String Dim Output As String For X = 1 To Len(InString) Temp1 = Mid(InString, X, 1) If IsNumeric(Temp1) Or Temp1 = "." Then Output = Output & Temp1 Next If Len(Output) > 0 Then GetSingleFromString = CSng(Output) Else GetSingleFromString = -1 End If End Function 

这是我的Excel表单:

 ABCDE 1 1 1a 78.15 77.68 (Row 7) 2 1a 2 77.18 76.92 3 2 3 76.92 76.63 4 3 4 76.13 75.78 5 4 4a 75.78 75.21 6 4a 5 75.11 74.87 7 5 5a 74.87 74.69 8 5a 6 73.94 73.6 9 6 6a 73.1 72.71 10 6a 6b 72.41 72.18 11 6b 10 72.18 71.6 12 10 11 71.3 70.89 13 11 12 70.89 69.83 14 12 13 69.83 68.68 15 13 14 68.68 67.68 16 14 15 67.63 66.46 17 15 16 66.01 64.84 18 16 16a 64.24 63.72 19 16a 16b 56.82 56.37 20 16b 16c 56.37 55.18 21 16c OUT 47.28 47.27 22 7 7a 83.12 76.07 23 7a 8 76.17 75.99 24 8 9 74.79 74.41 25 9 6 74.51 74 (Row 31) 

预先感谢您的帮助。

目前还不清楚你想要做什么; 我所能看到的就是要find一个匹配值的单元格,这个值可能是整个值,或者只是一个值的数字部分。

我所知道的是Range.Find没有你想象的那么有用:如果search值或查找范围是一个string,它有时会进行string比较,如果尝试数字值,有时会判定它是“不匹配” 1对string“1”,这取决于单元格中的格式。

如果你已经设置了LookAt:=xlWhole ,那么肯定会把“1”和“1a”视为“不匹配”,因为你已经指定了整个值,每个字符都必须与searchstring究竟。

如果你想将“1”与“1a”视为“不匹配”,并且只匹配“1”到“1”和“1a”到“1a”,大多数情况下都是好的。

如果你想把“1”与“1a”作为一个“发现”,你有两个select:

  1. 通过设置LookAt:=xlPart ,使用Range.Find中的部分匹配选项,并希望它不会被格式化弄糊涂。 而且大多数时候,它不会感到困惑。 所以你可能很好。

  2. 用VBAsearch每个范围内的单元格,使用“Like”,它允许您指定部分匹配,单个数字和从列表中匹配特定字符,如[1234567890]

只是为了让你开始“喜欢”:

"1" = "1a"返回False
"1" LIKE "1a"返回False
"1" LIKE "1*"返回True,虽然这不是一个非常有用的事情要知道
"1a" LIKE "#*"返回True,这看起来更相关,因为您已经确定了一个以数字开头的值,并且可以在包含更多逻辑的If … Then块顶部testing该值做你想要的比赛。

“Like”运算符的完整文档位于MSDN上:

https://msdn.microsoft.com/en-us/library/office/gg251796.aspx

使用其他语言的开发人员将使用正则expression式来处理这种事情:但是您需要为此导入一个外部正则expression式库,因为它不是Excel和VBA的本机types。

另外:一个string不能有一个小于零的LEN。 您的testingIf Len(InString) <= -1 Then需要为零或小于1。