excelstring比较问题

所以我正在尝试创build一个非常简单的macros,它通过一个特定的行循环寻找一个在另一个表单中标识的值。 一旦find该值,它就开始在结果列中查找文本string。 如果find了文本string,它会抓取同一行内的值,但会将一些列的值写入到具有用户定义的查找值的表单中。 我的问题是,由于某种原因,当我试图比较string时,我的条件if语句没有实现,这意味着写入最终值的部分永远不会被评估。这里是代码和预先感谢。

Private Sub valchange() Dim keycells As Range Set keycells = Worksheets("Dashboard").Range("B1") Dim k As Integer k = 5 For I = 1 To 50 If Worksheets("Rework List").Cells(3, I).Value = keycells.Value Then For j = 14 To 50 If UCase(Worksheets("Rework List").Cells(j, I)) = "*PENDING*" Then Cells(j, 3).Value = Worksheets("Dashboard").Range("F" & k) k = k + 1 End If Next j End If Next I End Sub 

像VBA中的string比较中不能使用小丑字符。

而是使用Instr()函数来search另一个string中的string。

 If instr(1,Worksheets("Rework List").Cells(j, I),"pending",vbTextCompare)>0 Then 

如果可以在第二个string中findsearchstring,instr将返回第一个字符的位置。 如果找不到,它返回一个0.所以如果instr()> 0,这意味着string在那里。

vbTextCompare确保shell(大写/小写)被忽略。 开头的1表示search的起始位置。

请注意,这不是世界上最快的事情…

除了@vacip已经告诉你的,我会指出以下内容

你写了:

它会抓取同一行内的值,但会将一些列写入到具有用户定义的查找值的表单中

那我想:

 Cells(j, 3).Value = Worksheets("Dashboard").Range("F" & k) 

会做相反的事情(假设macros启动时的活动表是“返工列表”)!

而且它的“更好:

  • Longtypes声明行索引variables

    尽pipe在你的特定情况下它不是必须的(它们的范围最大为50,这是由一个Integertypes来处理),这是很常见的,你最终会面对一些33k +行,这就是Longtypesvariables必须进入场景的地方

  • 存储关键字值而不是其范围,并避免随后使用keycells.Value所有访问

  • 至less应始终采用完全合格的范围参考,直到工作表对象(如果不是工作簿对象)

所以你可以试试这个:

 Option Explicit Private Sub valchange() Dim keyVal As String Dim k As Long, i As Long, j As Long keyVal = CStr(Worksheets("Dashboard").Range("B1").Value) k = 5 With Worksheets("Rework List") For i = 1 To 50 If .Cells(3, i).Value = keyVal Then For j = 14 To 50 If InStr(.Cells(j, i), "pending", vbTextCompare) > 0 Then Worksheets("Dashboard").Range("F" & k) = .Cells(j, 3).Value k = k + 1 End If Next j End If Next i End With End Sub