2017-08-04 39 views
1

我工作的Excel电子表格,拉从SQL数据库选择列表,然后填充表。然后提示用户扫描零件号码。我试图在A列中找到部件号,并返回部件号的行。VBA - 使用SearchRange查找变量值

部件号开始作为Variant类型,但认为类型是问题,我通过其值设置为另一个变量它转换成字符串。

最后,我发现这个代码片断(我试过很多,至今没有工作过),并在您指定的号码(123456789012),如下面的代码它的工作原理。如果使用变量sPart或scanPart替换该数字,则不起作用。

我需要它的工作找到变量SPART(String)或scanPart(变体)的行。我究竟做错了什么?

Function ReturnRowNumber() 

Dim ws As Excel.Worksheet 
Set ws = ActiveSheet 

Dim scanPart As Variant 
Dim sPart As String 
Dim FoundRow As String 

scanPart = InputBox("Scan the first part number", "Part Number") 'Get Part Number 

sPart = scanPart 

MsgBox sPart 

Dim SearchRange As Range 
Dim FindRow As Range 
Set SearchRange = Range("A1", Range("A65536").End(xlUp)) 
Set FindRow = SearchRange.Find(123456789012#, LookIn:=xlValues, lookat:=xlWhole) 
MsgBox FindRow.Row 

End Function 

在此先感谢您的帮助!

达纳

回答

3

写在您的文章不会有任何效果,因为语法不正确,尤其是在.Find语句中的代码。或许,这个问题被扔你在 错了方向,以为这是一个数据类型的问题。

请参阅该代码。测试了字符串和数字值。

Option Explicit 

Sub Test() 

    Dim sPart As String 
    sPart = InputBox("Scan the first part number", "Part Number") 'Get Part Number 

    MsgBox ReturnRowNumber(sPart) 

End Sub 


Function ReturnRowNumber(sPart As String) As Long 

    Dim ws As Worksheet 
    Set ws = Worksheets("Sheet1") 'be more explicit than 'ActiveSheet 

    Dim SearchRange As Range 
    Dim FindRow As Range 
    Set SearchRange = ws.Range("A1", ws.Range("A65536").End(xlUp)) 
    Set FindRow = SearchRange.Find(sPart, LookIn:=xlValues, lookat:=xlWhole) 

    If Not FindRow Is Nothing Then ReturnRowNumber = FindRow.Row 

End Function 
+0

也许一部分的困惑是信息在Excel中的哪种类型。我们的一些零件号码都是数字,其他的是数字和连字符,还有一些是字母和数字。 Excel中字段的格式目前被归类为文本。那会使它成为一个字符串,对吗? –

+0

@DanaSkyware - 无论这个代码应该工作的格式。由于字符串变量会将收集的任何内容转换为字符串类型。 –

+0

使用您的代码时,当查找部件号1504915-0013时,它返回了一行'0'。我粘贴了当前电子表格截图的链接。 https://www.dropbox.com/s/zzbvvgnsqxpa0wj/spreadsheet_sample.png?dl=0 –

1

从你的代码和你的问题的描述听起来好像发生了什么事是你要定义一个变量为Variant,但Varian确实是一个String(因此,千万不要用Variant除非你有一个非常具体的原因)。

喜欢的东西:

Dim Foo as Variant 
Dim Bar as Long 

Foo = "123" 
Bar = "123" 

是基本上像说:

Dim Foo as String 
Dim Bar as Long 

Foo = "123" 
Bar = CLng("123") 

之所以这样,是很重要的是因为:

12345 <> "12345" 

他们是不同的值。一个是Long表示,另一个是String表示。

解决您的问题?这取决于你的初始值如何存储。如果您使用条形码的String表示,那么您想要将条形码声明为String,并使用String进行搜索。看起来你确实在存储整个号码,如果是这种情况,你会想要将你的条码声明为Long

如果由于某种诅咒,你将条形码存储为Strings并作为整数,那么你需要选择一个或另一个,或者你需要使用更强大的查找方法(我推荐字典)。

0
Function ReturnRowNumber() 

Dim ws As Excel.Worksheet 
Set ws = ActiveSheet 

Dim scanPart As Variant 
Dim sPart As String 
Dim FoundRow As String 
Dim xlCell as Range 
scanPart = InputBox("Scan the first part number", "Part Number") 'Get Part Number 

sPart = scanPart  

Dim SearchRange As Range 
Dim FindRow As Range 
Set SearchRange = Range(Range("A1"), Range("A1").End(xlDown)) 
Set xlCell = ActiveCell 
Application.ScreenUpdating = False 
SearchRange.Select 
Set FindRow = SearchRange.Find(What:=sPart, After:=ActiveCell, SearchOrder:=xlByRows) 
xlCell.Select 
Application.ScreenUpdating = True 
MsgBox FindRow.Row 

End Function 

它看起来像你的查找功能没有正确格式。上面的代码完全适合我

+0

您的代码在Set FindRow行上给出运行时错误13类型不匹配。 –

+0

我不知道它为什么会抛出这个错误,但我确实知道它何时抛出它。当当前选定的单元格不是定义的搜索范围的一部分时,似乎会显示错误。我编辑了上面的代码来处理这个问题。 –