Vba 复制并重新排列包含字母和数字单元格的特定数据
我有一张excel表格,其中的数据在B列和C列中以数字和字母随机排列。我还有一个位于单元格“O7”中的输入单元格和一个位于“P7”中的输出单元格,用户可以在其中输入任何值(1,1a、2,2b等),代码将使用这些值来查找和复制a列中的值 我的代码(如下)运行并根据“O7”中的值查找B中的值,并将A列中该行的相应值(2次)复制到“Sheet4”。然后它查找C列中的下一个单元格,并使用该值查找B列中具有该值的下一行。然后将A列中该行的值复制到上一列下的第4页 我的问题是,我的代码无法区分“1”和输入值或输出值中带有字母“1a”的值。它只是看到有一个“1”并复制a中的值。我相信我可能没有将NewStart变量设置为下一个要正确查找的值,或者我的函数可能缺少区分“1”和“1a”的内容 这是我用来使代码包含带有字母的单元格的函数。如果没有它,它将跳过带有字母的单元格:Vba 复制并重新排列包含字母和数字单元格的特定数据,vba,excel,Vba,Excel,我有一张excel表格,其中的数据在B列和C列中以数字和字母随机排列。我还有一个位于单元格“O7”中的输入单元格和一个位于“P7”中的输出单元格,用户可以在其中输入任何值(1,1a、2,2b等),代码将使用这些值来查找和复制a列中的值 我的代码(如下)运行并根据“O7”中的值查找B中的值,并将A列中该行的相应值(2次)复制到“Sheet4”。然后它查找C列中的下一个单元格,并使用该值查找B列中具有该值的下一行。然后将A列中该行的值复制到上一列下的第4页 我的问题是,我的代码无法区分“1”和输入值
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
提前感谢您的帮助。不清楚您想做什么;我所能看到的是,您希望找到具有匹配值的单元格,该值可能是整个值,也可能只是值的数字部分 我所知道的是这个范围。Find没有你想象的那么有用:它有时会在搜索值或搜索范围是字符串时进行字符串比较,有时会根据单元格中的格式将数字值1与字符串“1”进行比较,从而确定它“不匹配” 如果您设置了
LookAt:=xlWhole
,它肯定会将“1”与“1a”视为“不匹配”,因为您指定了整个值,每个字符,都必须与搜索字符串完全匹配
大多数情况下,如果你想将“1”与“1a”视为“不匹配”,只将“1”与“1”以及“1a与”1a匹配,那么这很好
如果您想将“1”与“1a”视为“发现”,您有两种选择:
看看:=xlPart
,希望它不会因为格式设置而混淆。而且大多数时候,它不会混淆;所以您可能没事“1”=“1a”
返回False“1”类似于“1a”
返回False“1”如“1*”
返回True,尽管知道这一点不是很有用“1a”像“#*”
一样返回True,这看起来更相关,因为您已经识别了一个以数字开头的值,您可以在If…然后包含进一步逻辑的块顶部进行测试,以进行实际需要的匹配。“Like”操作员的完整文档位于MSDN上: 使用其他语言的开发人员将使用正则表达式来实现这类功能:但您需要为此导入一个外部正则表达式库,因为它不是Excel和VBA的本机
另外:一个字符串的LEN值永远不能小于零。如果LEN(InString)值小于零,则测试
不清楚您要做什么;我所看到的是,您希望找到具有匹配值的单元格,该值可能是整个值,也可能只是值的数字部分
我所知道的是这个范围。Find没有你想象的那么有用:它有时会在搜索值或搜索范围是字符串时进行字符串比较,有时会根据单元格中的格式将数字值1与字符串“1”进行比较,从而确定它“不匹配”
如果您设置了LookAt:=xlWhole
,它肯定会将“1”与“1a”视为“不匹配”,因为您指定了整个值,每个字符,都必须与搜索字符串完全匹配
大多数情况下,如果你想将“1”与“1a”视为“不匹配”,只将“1”与“1”以及“1a与”1a匹配,那么这很好
如果您想将“1”与“1a”视为“发现”,您有两种选择:
在范围中使用部分匹配选项。按设置查找
LookAt:=xlPart
,希望它不会因为格式设置而混淆。而且大多数时候,它不会感到困惑;所以你可能很好
使用VBA搜索每个区域中的单元格,使用“Like”,可以指定部分匹配、单个数字以及列表中特定字符的匹配,如[1234567890]
只是想让你从“喜欢”开始:
“1”=“1a”
返回False
“1”类似于“1a”
返回False
“1”如“1*”
返回True,尽管知道这一点不是很有用
“1a”像“#*”
返回True,这看起来更相关,因为您已经识别了一个以数字开头的值,您可以在If的顶部进行测试。。。然后包含进一步逻辑的块,以进行实际需要的匹配
“Like”操作员的完整文档位于MSDN上:
使用其他语言的开发人员将使用正则表达式来实现这类功能:但您需要为此导入一个外部正则表达式库,因为它不是Excel和VBA的本机
另外:字符串的LEN值不能小于零。你的测试如果Len(InString)我拿出了开头部分,因为我不需要它。基本上,我有一个单元格指定为输入值(O7),另一个单元格指定为输出值(P7)。任何人都可以用在c中看到的任何数字编辑此单元格
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
A B C D E
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)